9.4 KiB
CODEX.md
This file provides guidance to Codex, Claude Code, and other coding agents when working with this repository. Higher-priority system or developer instructions override this file.
Project Overview
This repository is the src/ layer of a ROS2 Humble workspace for PICO/XR controller teleoperation of left and right RealMan RM75 arms.
The core behavior is relative Cartesian pose streaming:
PICO/XR UDP JSON
-> xr_rm_input/udp_controller_receiver
-> /xr/left_controller and /xr/right_controller
-> xr_rm_teleop/single_arm_velocity_teleop
-> MockRealManAdapter or RealManAdapter
-> /xr_rm/<arm_name>/current_pose
-> /xr_rm/<arm_name>/raw_target_pose
-> /xr_rm/<arm_name>/target_pose
-> /xr_rm/<arm_name>/cmd_vel
-> /xr_rm/<arm_name>/target_clamped
When grip=true, the first valid frame locks both the XR controller origin and the robot TCP origin. Later controller translation and rotation deltas are converted into target TCP poses and sent through rm_movep_canfd. When grip=false, pose_valid=false, UDP data times out, an adapter exception occurs, or the node shuts down, motion must stop.
Architecture
The project consists of:
- Interface package (
xr_rm_interfaces): defines theXrControllermessage. - Input package (
xr_rm_input): receives UDP controller JSON, normalizes controller payloads, publishes left/right XR controller topics, and providessample_udp_senderfor mock/debug input. - Teleop package (
xr_rm_teleop): maps relative XR controller motion to RM75 Cartesian target poses and dispatches commands through mock or real adapters. - Bringup package (
xr_rm_bringup): owns launch files, arm YAML configuration, and the local launcher UI. - Unity/PICO sender (
unity/XR_RM_PICO_UDP_Sender): PICO 4 Ultra Unity project that sends controller pose, validity, source, tracking status, sequence, and timestamp fields over UDP.
Key control facts:
- Main launch file:
xr_rm_bringup/launch/arm_debug.launch.py - Supported launch arm modes:
arm:=left|right|both - Supported adapter modes:
use_mock:=true|false - ROS2 workspace root:
/home/robot/WS_xr - Repository/source root:
/home/robot/WS_xr/src cmd_velis a debug estimate of target-pose change rate, not the real robot command topic.
Build Commands
Run ROS2 commands from the workspace root:
cd /home/robot/WS_xr
source /opt/ros/humble/setup.bash
rosdep install --from-paths src -y --ignore-src
colcon build --symlink-install
source install/setup.bash
Git inspection commands:
cd /home/robot/WS_xr/src
git status --short
git diff
git diff --check
Run Commands
Mock Dual-Arm Debug
cd /home/robot/WS_xr
source /opt/ros/humble/setup.bash
source install/setup.bash
ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=true
In another terminal:
cd /home/robot/WS_xr
source /opt/ros/humble/setup.bash
source install/setup.bash
ros2 run xr_rm_input sample_udp_sender --hand both --host 127.0.0.1 --port 15000 \
--pattern axis_sweep --seconds 60 --both-mode staggered
Use --rotation-pattern rpy_steps when checking orientation mapping.
Real Arm Debug
ros2 launch xr_rm_bringup arm_debug.launch.py arm:=left use_mock:=false
ros2 launch xr_rm_bringup arm_debug.launch.py arm:=right use_mock:=false
Dual-arm real hardware:
ros2 launch xr_rm_bringup arm_debug.launch.py arm:=both use_mock:=false \
left_robot_ip:=192.168.192.18 \
right_robot_ip:=192.168.192.19
Launcher UI:
python3 src/xr_rm_bringup/tools/launcher_ui.py
Debug Topics
ros2 topic echo /xr/left_controller
ros2 topic echo /xr/right_controller
ros2 topic echo /xr_rm/left_rm75/target_pose
ros2 topic echo /xr_rm/right_rm75/target_pose
ros2 topic echo /xr_rm/left_rm75/cmd_vel
ros2 topic echo /xr_rm/right_rm75/cmd_vel
UDP Protocol
Preferred Unity packets contain top-level controllers.left and controllers.right objects plus t, source_time, seq, and frame_id.
Each controller payload should include:
griptriggerpos[3]quat[4]pose_validpose_sourcetracking_statecontroller_statusgrip_valueaxis[2]buttons
The receiver also supports single-controller debug packets with hand, pos, and quat, plus aliases such as position, p, pose.position, orientation, and q. The default quaternion order is xyzw; use quat_order:=wxyz only when the sender really emits wxyz.
When the PICO HUD shows invalid none, expect ROS-side grip to be forced false. Debug in this order: Unity pose source, udp_controller_receiver warnings, then teleop timeout or clamping topics.
Coordinate Notes
PICO/OpenXR project coordinates are:
+X: right+Y: up+Z: back
Current Unity Project (+Z back) output must remain in that project coordinate convention. PXR pxr_predict native values are converted to:
project.x = native.z
project.y = native.y
project.z = -native.x
Source raw is only for field comparison and diagnostics. If /xr/*_controller.pose.position already matches the expected PICO/OpenXR coordinates but one arm moves in the wrong robot direction, prefer changing only that arm's YAML xr_to_robot_matrix.
Development Workflow
Use the repository rule file as the project-level source of truth for coding-agent behavior:
- Read relevant code and docs before editing.
- Check
git status --shortbefore edits. - Treat existing uncommitted changes as user work; do not revert them unless explicitly requested.
- Unless the user explicitly asks for direct code or file changes, first explain the proposed approach and wait for the user to decide whether to execute, continue, revise, or stop.
- Before writing files, explain the goal understanding, files to touch, implementation plan, risks, and validation path, then wait for user confirmation.
- Skip the confirmation gate only when the user's current request clearly authorizes direct modification, such as "可以直接修改", "无需确认", "直接执行", or equivalent wording.
- Keep edits small and task-scoped.
- Do not automatically run
git add, commit, push, force push, delete branches, or merge branches. - After changes, summarize touched files, behavior changes, validation performed, and remaining risks.
Safety Rules
This is a real robot teleoperation project. Keep all hardware-related changes conservative.
Do not casually modify:
- Left arm IP:
192.168.192.18 - Right arm IP:
192.168.192.19 - RM75 TCP port:
8080 - Workspace limits
- Cylinder limits
xr_to_robot_matrix- Initial joint or TCP poses
- Speed and acceleration limits
- End-effector peripheral configuration
Preserve stop behavior for:
grip=falsepose_valid=false- UDP timeout or stale controller data
- Adapter exceptions
- Node shutdown
- PICO app pause, exit, or disabled sending
Additional safety constraints:
- Keep
move_to_initial_pose_on_connectdefaulting tofalse. - Do not bypass receiver behavior that forces
grip=falsewhenpose_valid=false. - Validate hardware-related behavior in this order: static checks, mock mode, single real arm, dual real arms.
- Do not claim dual-arm collision detection exists unless code implements it.
Unity / PICO Notes
- Current Unity project:
unity/XR_RM_PICO_UDP_Sender - Current PICO SDK:
unity/PICO-Unity-Integration-SDK-release_3.4.0 - Treat the PICO SDK as third-party code unless the user explicitly targets it.
- Treat Unity
Library/,Builds/,Logs/,UserSettings/, APKs, and generated logs as local/generated artifacts. - The Unity package depends on TextMeshPro.
- PICO panel fonts come from pregenerated
Assets/Resources/Fonts/Roboto-Regular SDF.assetandRoboto-Bold SDF.asset. - Do not create TMP font assets dynamically at APK runtime.
- The PICO UDP target IP must be the Ubuntu ROS host IPv4 address on the same LAN.
- PICO app pause, exit, or disabled sending must send
grip=false. - Invalid pose data must send
pose_valid=falseand allow the ROS receiver to force stop.
Documentation Rules
README.mdis the main project document for humans.CODEX.mdis the coding-agent workflow and safety document.- Keep
docs/for focused setup guides and report materials. - Do not add scattered Markdown files unless the user asks.
- Do not document unimplemented features as complete.
- Keep mock, real-arm, and Unity/PICO paths explicit.
Testing and Validation
There is no single full-system automated test that proves real-hardware safety. Prefer layered validation:
- Static checks: syntax, imports, formatting-sensitive checks,
git diff --check. - ROS build:
colcon build --symlink-install. - Mock validation: launch
arm_debug.launch.pywithuse_mock:=true. - UDP validation: run
sample_udp_senderwithaxis_sweepand, when needed,rpy_steps. - Real hardware validation: single arm first, then dual arm.
Important Notes
- Do not implement or claim the following unless the user explicitly requests and code actually supports it:
- XRoboToolkit PC-Service bridge as a required runtime path
- D405/D435 video streaming or data recording
- Dual-arm collision detection
- Autonomous picking state machine
- QP IK, dexterous-hand retargeting, or whole-body tracker support
- Full time synchronization
- Robot state feedback to PICO
- If motion direction is wrong, inspect
/xr/*_controller.pose.positionfirst before changing robot-side YAML. - The project should stay understandable enough for field debugging; avoid broad refactors during safety-sensitive fixes.