Context
規劃如何把 Meta Quest controller 的 pose 和按鈕輸入發佈成 ROS2 標準 topic,讓下游節點(MuJoCo 模擬、實體機器人、logging 等)自由訂閱,不互相耦合。
Key Insights
- Bridge node 是關鍵分層:把
MetaQuestReader(純 Python,不依賴 ROS2)封裝成一個quest_bridge_node,負責所有對外發佈。下游節點只和 topic 互動,不接觸 MetaQuestReader。這讓 Quest 可以在不修改任何消費端 node 的前提下替換成其他輸入源(OptiTrack、LeapMotion 等)。 - TF 優於 PoseStamped:controller pose 用
tf2_ros.TransformBroadcaster廣播right_controller/left_controllerframe,下游用tf2_ros.Buffer.lookup_transform()查詢。好處:時間戳對齊由 tf2 處理,RViz 可直接視覺化,與 MoveIt 整合無縫。 sensor_msgs/Joy是按鈕的正確選擇:不用自訂.msg。axes放類比值(grip 0.0–1.0、thumbstick xy),buttons放數位值(A/B/X/Y)。標準消息表示rqt_plot、teleop_twist_joy等工具直接能用。
Architecture
MetaQuestReader (背景 thread)
│
▼
quest_bridge_node (50 Hz timer)
├── /tf → right_controller, left_controller (in world frame)
└── /quest/joy → sensor_msgs/Joy
axes: [rightGrip, leftGrip, rightThumbX, rightThumbY, leftThumbX, leftThumbY]
buttons: [A, B, X, Y, rightThumb, leftThumb]
下游(各自獨立訂閱):
mujoco_teleop_node ─── tf lookup + joy grip → IK → qpos
real_robot_node ─── (未來)
logging_node ─── (未來)