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_controller frame,下游用 tf2_ros.Buffer.lookup_transform() 查詢。好處:時間戳對齊由 tf2 處理,RViz 可直接視覺化,與 MoveIt 整合無縫。
  • sensor_msgs/Joy 是按鈕的正確選擇:不用自訂 .msgaxes 放類比值(grip 0.0–1.0、thumbstick xy),buttons 放數位值(A/B/X/Y)。標準消息表示 rqt_plotteleop_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         ─── (未來)

Connections