Skip to main content

Marvin Pro ROS Topic List

This is the consolidated customer-visible ROS 2 topic reference for Apex Humble v1.0.7.74o / Jazzy v1.0.7.74t (2026-08-17) and later releases using the same interface contract. For safety, source arbitration, and service usage, see Marvin Pro Customer Integration Interfaces.

Access rules
  • Customer input topics may be published only when the required mode and arbitration source are active.
  • Read-only topics are for subscription, recording, and diagnostics only.
  • Optional topics appear only when the matching Tool, Camera, Recorder, Playback, VLA, or glove module is running.
  • The target device's ros2 topic list -t output is authoritative.

1. Namespace​

Current Marvin Pro core interfaces use /tj. Legacy /control/..., /info/..., and /joint_states paths are not equivalent to their /tj/... replacements.

source /etc/apex/apex_ros_env.sh
ros2 topic list -t | grep -E '^/tj/|^/hand_|^/quad_tile/|^/info/apex_package_info' | sort

2. Robot State and Feedback​

TopicTypeAccessDescription
/tj/joint_statessensor_msgs/msg/JointStateRead-onlyStandard joint state
/tj/info/joint_feedbackmarvin_msgs/msg/JointfeedbackRead-onlyHigh-rate position, velocity, and torque feedback
/tj/info/arm_statestd_msgs/msg/Int16MultiArrayRead-onlyDual-arm state codes
/tj/info/robot_statestd_msgs/msg/Int16MultiArrayRead-onlyWhole-robot control state
/tj/info/robot_infomarvin_msgs/msg/RobotInfoRead-onlyRobot and controller information
/tj/info/eef_leftgeometry_msgs/msg/PoseStampedRead-onlyLeft end-effector pose
/tj/info/eef_rightgeometry_msgs/msg/PoseStampedRead-onlyRight end-effector pose
/tj/info/wrench_leftgeometry_msgs/msg/WrenchStampedRead-onlyLeft end-effector wrench
/tj/info/wrench_rightgeometry_msgs/msg/WrenchStampedRead-onlyRight end-effector wrench
/tj/info/go_home_statusstd_msgs/msg/StringRead-onlyPlanner / Home state
/info/apex_package_infostd_msgs/msg/StringRead-only, globalApex package version

3. Headset and Teleoperation Input​

TopicTypeAccessDescription
/tj/control/target_poseLgeometry_msgs/msg/PoseStampedRead-onlyVR left target pose
/tj/control/target_poseRgeometry_msgs/msg/PoseStampedRead-onlyVR right target pose
/tj/control/enableLstd_msgs/msg/BoolRead-onlyLeft teleoperation enable
/tj/control/enableRstd_msgs/msg/BoolRead-onlyRight teleoperation enable
/tj/control/vr_joy_Lsensor_msgs/msg/JoyRead-onlyRaw left controller input
/tj/control/vr_joy_Rsensor_msgs/msg/JoyRead-onlyRaw right controller input
/tj/control/Elbow_leftgeometry_msgs/msg/PoseStampedRead-onlyLeft elbow tracking pose
/tj/control/Elbow_rightgeometry_msgs/msg/PoseStampedRead-onlyRight elbow tracking pose
/tj/info/vr_connectedstd_msgs/msg/BoolRead-onlyHeadset connection state
/tj/control/footkeystd_msgs/msg/BoolCustomer input, optionalGlove-mode foot pedal

4. Customer Control Inputs​

TopicTypeRequirement
/tj/control/user/joint_cmd_Amarvin_msgs/msg/JointcmdArmJoint Input = 3
/tj/control/user/joint_cmd_Bmarvin_msgs/msg/JointcmdArmJoint Input = 3
/tj/control/ik_request/vlamarvin_msgs/msg/IKRequestIK Input = 2, Joint Input = 1
/tj/control/gripperValueLstd_msgs/msg/Float32Left Tool running
/tj/control/gripperValueRstd_msgs/msg/Float32Right Tool running

5. Teleop, IK, and QP Chain​

TopicTypeAccessDescription
/tj/control/eef_cmd_Ageometry_msgs/msg/PoseStampedRead-onlyMapped left Cartesian target
/tj/control/eef_cmd_Bgeometry_msgs/msg/PoseStampedRead-onlyMapped right Cartesian target
/tj/control/ik_request/vrmarvin_msgs/msg/IKRequestRead-onlyVR IK request
/tj/control/ik_requestmarvin_msgs/msg/IKRequestRead-onlyArbitrated QP IK request
/tj/control/ik_cmd_Amarvin_msgs/msg/JointcmdRead-onlyCompatibility left IK diagnostic output; not in the primary chain
/tj/control/ik_cmd_Bmarvin_msgs/msg/JointcmdRead-onlyCompatibility right IK diagnostic output; not in the primary chain
/tj/info/ik_request_mux/active_sourcestd_msgs/msg/Int32Read-onlyIK source: 0=idle, 1=VR, 2=VLA
/tj/control/ik_resultmarvin_msgs/msg/IKResultRead-onlyIK result
/tj/joint_state_cmdsensor_msgs/msg/JointStateRead-onlyFull-model QP target
/tj/control/qp_controller/joint_cmd_Amarvin_msgs/msg/JointcmdArmRead-onlyQP left output
/tj/control/qp_controller/joint_cmd_Bmarvin_msgs/msg/JointcmdArmRead-onlyQP right output

6. Planner, Playback, and Final Commands​

TopicTypeAccessDescription
/tj/control/joint_cmd_plan_Amarvin_msgs/msg/JointcmdRead-onlyPlanner left output
/tj/control/joint_cmd_plan_Bmarvin_msgs/msg/JointcmdRead-onlyPlanner right output
/tj/control/replay/joint_cmd_Amarvin_msgs/msg/JointcmdArmRead-onlyPlayback left output
/tj/control/replay/joint_cmd_Bmarvin_msgs/msg/JointcmdArmRead-onlyPlayback right output
/tj/control/joint_cmd_Amarvin_msgs/msg/JointcmdArmRead-onlyFinal left command
/tj/control/joint_cmd_Bmarvin_msgs/msg/JointcmdArmRead-onlyFinal right command
/tj/control/input_modestd_msgs/msg/Int32Read-onlyJoint source: 0=idle, 1=teleop, 2=planner, 3=user, 4=replay

7. DM / ZY Grippers​

TopicTypeAccess
/tj/control/gripperValueLstd_msgs/msg/Float32Customer input, optional
/tj/control/gripperValueRstd_msgs/msg/Float32Customer input, optional
/tj/info/gripper_feedback_Lstd_msgs/msg/Float32MultiArrayRead-only, optional
/tj/info/gripper_feedback_Rstd_msgs/msg/Float32MultiArrayRead-only, optional
/tj/info/gripper_feedback_L_errstd_msgs/msg/Int32MultiArrayRead-only, optional
/tj/info/gripper_feedback_R_errstd_msgs/msg/Int32MultiArrayRead-only, optional

8. Wuji Hands​

Wuji topics remain global and do not use /tj.

TopicTypeAccess
/hand_left/joint_commandssensor_msgs/msg/JointStateCustomer input, optional
/hand_left/joint_statessensor_msgs/msg/JointStateRead-only, optional
/hand_right/joint_commandssensor_msgs/msg/JointStateCustomer input, optional
/hand_right/joint_statessensor_msgs/msg/JointStateRead-only, optional
/hand_left/joint_commands_playbacksensor_msgs/msg/JointStateRead-only, optional
/hand_right/joint_commands_playbacksensor_msgs/msg/JointStateRead-only, optional

9. Recorder, Playback, and Camera​

TopicTypeAccessDescription
/tj/recorder/statusstd_msgs/msg/Int32Read-only, optionalRecording state
/tj/control/playback_controlstd_msgs/msg/StringCompatibility input, optionalJSON playback control; prefer the service
/tj/playback_statusstd_msgs/msg/StringRead-only, optionalPlayback state
/tj/playback_keystd_msgs/msg/BoolRead-only, optionalPlayback key/state
/quad_tile/compressedsensor_msgs/msg/CompressedImageRead-only, optional, globalRaw tiled H.264 image, subscriber-driven
/quad_tile/compressed_undistortedsensor_msgs/msg/CompressedImageRead-only, optional, globalCalibration-processed tiled H.264 image, subscriber-driven
/quad_tile/jpeg/compressedsensor_msgs/msg/CompressedImageRead-only, optional, globalTiled JPEG image

See Camera Configuration and ROS Interfaces for the complete camera interface reference.

10. ROS System Topics​

TopicTypeAccess
/tftf2_msgs/msg/TFMessageRead-only
/tf_statictf2_msgs/msg/TFMessageRead-only
/rosoutrcl_interfaces/msg/LogRead-only
/parameter_eventsrcl_interfaces/msg/ParameterEventRead-only

11. Quick Verification​

source /etc/apex/apex_ros_env.sh

echo '=== /tj topics ==='
ros2 topic list -t | grep '^/tj/' | sort

echo '=== global product topics ==='
ros2 topic list -t | grep -E '^/hand_|^/quad_tile/|^/info/apex_package_info$' | sort

echo '=== customer input endpoints ==='
ros2 topic info /tj/control/user/joint_cmd_A -v
ros2 topic info /tj/control/ik_request/vla -v
ros2 topic info /tj/control/gripperValueL -v

Topics appear only while their modules are running. If a topic exists but carries no messages, check its publishers, QoS, ROS_DOMAIN_ID, APEX_ROS_NAMESPACE, and module state.

12. Topic Rate Reference​

The following values come from the current Marvin Pro source and default parameters. Timer, SDK/CAN control-loop, ROS topic, and frontend WebSocket rates are different concepts. These values are not hard real-time guarantees under Linux, DDS, or network load.

Topic / chainDesign or expected rateCondition
/tj/info/eef_left/right1000 HzTeleop running; actual rate depends on compute load
/tj/control/ik_request/vr1000 HzTeleop running with a valid VR source
/tj/control/qp_controller/joint_cmd_A/BUp to 500 HzRobot Ready, valid target, and healthy QP
/tj/control/joint_cmd_A/BNormally 500 Hz in TeleopJoint source is Teleop; follows the active source
/tj/info/joint_feedback200 HzRobot connected to MarvinSDK
/tj/info/arm_state, /tj/info/robot_state200 HzRobot connected
/tj/joint_states100 HzRobot connected
/tj/info/gripper_feedback_L/R and error topics200 HzDM/ZY Tool running
/tj/recorder/status1 HzRecorder running
/tj/playback_status10 HzPlayback running
/tj/info/robot_info0.2 HzEvery 5 seconds by default, plus one message at startup
/quad_tile/compressed, /quad_tile/compressed_undistorted, /quad_tile/jpeg/compressedDefault maximum 30 Hz, subscriber-drivenActual rate depends on valid inputs, mosaic configuration, and subscription state

Headset targets, enable states, and gripper commands follow actual UDP packets or an upstream customer program and have no universal fixed rate. Planner, Replay, event-state topics, and static TF should not be evaluated as continuous streams.

Check publisher count before measuring so merged traffic from multiple publishers is not mistaken for a single-node rate:

source /etc/apex/apex_ros_env.sh

ros2 topic info -v /tj/info/joint_feedback --no-daemon
ros2 topic info -v /tj/joint_states --no-daemon
ros2 topic info -v /tj/info/gripper_feedback_L --no-daemon

ros2 topic hz /tj/info/eef_left
ros2 topic hz /tj/control/qp_controller/joint_cmd_A
ros2 topic hz /tj/control/joint_cmd_A
ros2 topic hz /tj/info/joint_feedback
ros2 topic hz /tj/joint_states
ros2 topic hz /tj/info/gripper_feedback_L

For a formal stability test, run the arms, grippers, cameras, and recording concurrently for at least 120 seconds. Record mean Hz, period standard deviation, P95/P99, maximum gap, stream interruptions, publisher count, and CPU load.