跳到主要内容

Marvin Pro 客户二次开发接口

本文列出当前 Marvin Pro 面向客户开放的 ROS 2 Topic、Service、控制源和网络端口,适用于状态读取、数据采集、客户算法接入和故障诊断。

本文对应 Apex Humble v1.0.7.74o / Jazzy v1.0.7.74t(2026-08-17)及之后采用相同接口契约的版本。目标设备实际安装的软件仍是最终依据。Skye/Luna 的全身关节结构和消息定义不同,请使用 Gento(Skye/Luna)ROS 2 接口。

1. 命名空间与兼容性​

当前 Marvin Pro 的 Robot、Teleop、QP、Planner、VLA、Recorder 和 Playback 默认位于 tj 命名空间。源码中的相对名称 control/joint_cmd_A 在运行时解析为 /tj/control/joint_cmd_A。

source /etc/apex/apex_ros_env.sh
echo "APEX_ROS_NAMESPACE=${APEX_ROS_NAMESPACE:-tj}"
ros2 topic list | grep '^/tj/' | sort
ros2 service list | grep '^/tj/' | sort
旧接口不兼容

当前夹爪及核心控制接口已经迁移到 /tj。外部程序继续使用旧路径 /control/... 或 /info/... 时,可能出现 Topic 不存在、夹爪不动或收不到反馈。升级后应逐项修改为本文列出的完整路径。

以下接口保持全局路径,不添加 /tj:

  • /hand_left/*、/hand_right/*:Wuji 灵巧手;
  • /quad_tile/jpeg/compressed:相机拼接 JPEG 图像;
  • /recorder/set_recording:相机录像控制;
  • /info/apex_package_info:Apex 软件包版本信息;
  • /tf、/tf_static、/rosout、/parameter_events:ROS 系统接口。

2. 安全要求​

  • 外部控制前,先在 Apex 前端启动 Robot,并确认机器人 Ready、模式正确且已进入安全初始姿态。
  • 出厂打包姿态禁止直接 Home。应先在 Robot Ready 后开启拖动模式,手动将双臂移到标准零位姿态并关闭拖动模式。
  • 客户关节直发前,将 Joint Input 切换为 Custom/User(set_input=3)。
  • 客户末端 IK 输入还需要设置 IK Input(set_ik_input=2),并保持 Joint Input 为 Teleop/QP(set_input=1)。
  • 首次测试应清空工作空间、降低动作幅度,并保持急停可触及。
  • 客户程序必须持续发送平滑、时间连续且满足关节限制的目标。
  • 停止客户程序前,先把对应输入源切回 Idle,再停止发布。
  • 本文标记为“只读”的 Topic 仅用于订阅、记录和排查,不得由客户程序发布。
  • 消息字段以设备中安装的 marvin_msgs 为准,接入前使用 ros2 interface show 核对。

3. 当前控制源​

当前版本包含两层输入仲裁,仅发布输入 Topic 不会自动驱动机器人。

3.1 IK 输入源​

编号来源输入 Topic
0Idle不转发 IK 请求
1VR/tj/control/ik_request/vr
2VLA / 客户末端控制/tj/control/ik_request/vla

切换 Service:/tj/control/set_ik_input。当前来源:/tj/info/ik_request_mux/active_source。

3.2 Joint 输入源​

编号来源输入 Topic
0Idle不转发关节命令
1Teleop / QP/tj/control/qp_controller/joint_cmd_A/B
2Planner/tj/control/joint_cmd_plan_A/B
3Custom / User/tj/control/user/joint_cmd_A/B
4Replay/tj/control/replay/joint_cmd_A/B

切换 Service:/tj/control/set_input。当前来源:/tj/control/input_mode。

4. 状态与反馈 Topic​

Marvin Pro 双臂数据顺序固定为左臂 7 关节在前、右臂 7 关节在后。

Topic类型权限说明
/tj/joint_statessensor_msgs/msg/JointState只读标准关节状态,默认约 100 Hz
/tj/info/joint_feedbackmarvin_msgs/msg/Jointfeedback只读双臂、主体和头部位置/速度/力矩反馈,默认约 200 Hz
/tj/info/arm_statestd_msgs/msg/Int16MultiArray只读双臂状态码
/tj/info/robot_statestd_msgs/msg/Int16MultiArray只读控制链使用的整机状态
/tj/info/robot_infomarvin_msgs/msg/RobotInfo只读机器人型号和控制器版本
/tj/info/eef_leftgeometry_msgs/msg/PoseStamped只读左末端实际位姿
/tj/info/eef_rightgeometry_msgs/msg/PoseStamped只读右末端实际位姿
/tj/info/wrench_leftgeometry_msgs/msg/WrenchStamped只读左末端力/力矩反馈
/tj/info/wrench_rightgeometry_msgs/msg/WrenchStamped只读右末端力/力矩反馈
/tj/info/vr_connectedstd_msgs/msg/Bool只读头显链路连接状态
/tj/info/go_home_statusstd_msgs/msg/String只读Home / Planner 状态
/info/apex_package_infostd_msgs/msg/String只读,全局Apex 安装包和版本信息
ros2 topic echo /tj/info/robot_info --once
ros2 topic echo /tj/info/arm_state --once
ros2 topic echo /tj/joint_states --once
ros2 topic hz /tj/info/joint_feedback

5. 客户控制输入​

5.1 关节目标​

Topic类型说明
/tj/control/user/joint_cmd_Amarvin_msgs/msg/JointcmdArm左臂 7 关节目标,单位 rad;需 set_input=3
/tj/control/user/joint_cmd_Bmarvin_msgs/msg/JointcmdArm右臂 7 关节目标,单位 rad;需 set_input=3

5.2 末端 IK 目标​

Topic类型说明
/tj/control/ik_request/vlamarvin_msgs/msg/IKRequest客户/VLA 末端目标;需 set_ik_input=2 和 set_input=1

5.3 夹爪与可选输入​

Topic类型说明
/tj/control/gripperValueLstd_msgs/msg/Float32左夹爪目标值
/tj/control/gripperValueRstd_msgs/msg/Float32右夹爪目标值
/tj/control/footkeystd_msgs/msg/Bool可选脚踏/手套门控,仅 glove_mode=true 时存在
ros2 interface show marvin_msgs/msg/JointcmdArm
ros2 interface show marvin_msgs/msg/IKRequest
ros2 topic info /tj/control/user/joint_cmd_A -v
ros2 topic info /tj/control/ik_request/vla -v

6. 机器人控制 Service​

Service类型作用
/tj/control/set_readystd_srvs/srv/Trigger机器人进入 Ready 状态
/tj/control/set_modemarvin_msgs/srv/Int设置机器人模式
/tj/control/set_dragmarvin_msgs/srv/Int设置拖动/示教状态
/tj/control/set_vel_ratiomarvin_msgs/srv/Int设置规划速度比例
/tj/control/clear_faultstd_srvs/srv/Trigger清除故障
/tj/control/get_motor_err_codemarvin_msgs/srv/MotorErrCode获取电机错误码
/tj/control/set_ik_inputmarvin_msgs/srv/Int切换 IK 输入源:0/1/2
/tj/control/set_inputmarvin_msgs/srv/Int切换 Joint 输入源:0/1/2/3/4
/tj/control/movejmarvin_msgs/srv/MoveJ双臂 14 关节点到点规划
/tj/control/go_homestd_srvs/srv/Trigger双臂规划回 Home;成功响应只表示轨迹已启动,完成状态以 /tj/info/go_home_status 的 succeeded 为准
/tj/control/reset_grippersstd_srvs/srv/Trigger复位/使能 DM 或 ZY 夹爪;Tool 启动后存在

切换为客户关节输入:

ros2 service call /tj/control/set_input marvin_msgs/srv/Int "{data: 3}"

切换为客户末端 IK:

ros2 service call /tj/control/set_ik_input marvin_msgs/srv/Int "{data: 2}"
ros2 service call /tj/control/set_input marvin_msgs/srv/Int "{data: 1}"

停止所有关节命令转发:

ros2 service call /tj/control/set_input marvin_msgs/srv/Int "{data: 0}"

7. 遥操与控制链只读 Topic​

Topic类型说明
/tj/control/target_poseLgeometry_msgs/msg/PoseStampedVR 左手柄目标位姿
/tj/control/target_poseRgeometry_msgs/msg/PoseStampedVR 右手柄目标位姿
/tj/control/enableLstd_msgs/msg/Bool左臂遥操使能
/tj/control/enableRstd_msgs/msg/Bool右臂遥操使能
/tj/control/vr_joy_Lsensor_msgs/msg/Joy左手柄原始输入
/tj/control/vr_joy_Rsensor_msgs/msg/Joy右手柄原始输入
/tj/control/Elbow_leftgeometry_msgs/msg/PoseStamped左肘目标/跟踪位姿
/tj/control/Elbow_rightgeometry_msgs/msg/PoseStamped右肘目标/跟踪位姿
/tj/control/eef_cmd_Ageometry_msgs/msg/PoseStamped左末端映射目标
/tj/control/eef_cmd_Bgeometry_msgs/msg/PoseStamped右末端映射目标
/tj/control/ik_request/vrmarvin_msgs/msg/IKRequestVR 来源 IK 请求
/tj/control/ik_requestmarvin_msgs/msg/IKRequest仲裁后的 QP IK 输入
/tj/control/ik_cmd_Amarvin_msgs/msg/Jointcmd左臂兼容 IK 调试输出,不是当前主下发链
/tj/control/ik_cmd_Bmarvin_msgs/msg/Jointcmd右臂兼容 IK 调试输出,不是当前主下发链
/tj/info/ik_request_mux/active_sourcestd_msgs/msg/Int32当前 IK 来源
/tj/control/ik_resultmarvin_msgs/msg/IKResultIK 求解结果
/tj/joint_state_cmdsensor_msgs/msg/JointStateQP 全模型关节目标
/tj/control/qp_controller/joint_cmd_Amarvin_msgs/msg/JointcmdArmQP 左臂输出
/tj/control/qp_controller/joint_cmd_Bmarvin_msgs/msg/JointcmdArmQP 右臂输出
/tj/control/joint_cmd_plan_Amarvin_msgs/msg/JointcmdPlanner 左臂输出
/tj/control/joint_cmd_plan_Bmarvin_msgs/msg/JointcmdPlanner 右臂输出
/tj/control/replay/joint_cmd_Amarvin_msgs/msg/JointcmdArmPlayback 左臂输出
/tj/control/replay/joint_cmd_Bmarvin_msgs/msg/JointcmdArmPlayback 右臂输出
/tj/control/joint_cmd_Amarvin_msgs/msg/JointcmdArm仲裁后的左臂最终命令
/tj/control/joint_cmd_Bmarvin_msgs/msg/JointcmdArm仲裁后的右臂最终命令
/tj/control/input_modestd_msgs/msg/Int32当前 Joint 输入源

遥操有输入但机器人不动时,按顺序检查:

ros2 topic echo /tj/info/vr_connected --once
ros2 topic echo /tj/control/target_poseL --once
ros2 topic echo /tj/control/enableL --once
ros2 topic echo /tj/control/ik_request --once
ros2 topic echo /tj/control/qp_controller/joint_cmd_A --once
ros2 topic echo /tj/control/input_mode --once
ros2 topic echo /tj/control/joint_cmd_A --once
ros2 topic echo /tj/info/arm_state --once

8. 末端执行器 Topic​

8.1 DM / ZY 夹爪​

Topic类型权限说明
/tj/control/gripperValueLstd_msgs/msg/Float32客户输入左夹爪目标
/tj/control/gripperValueRstd_msgs/msg/Float32客户输入右夹爪目标
/tj/info/gripper_feedback_Lstd_msgs/msg/Float32MultiArray只读左夹爪位置、速度、力矩和温度反馈
/tj/info/gripper_feedback_Rstd_msgs/msg/Float32MultiArray只读右夹爪位置、速度、力矩和温度反馈
/tj/info/gripper_feedback_L_errstd_msgs/msg/Int32MultiArray只读左夹爪错误码
/tj/info/gripper_feedback_R_errstd_msgs/msg/Int32MultiArray只读右夹爪错误码

反馈数组字段和物理单位应以目标设备安装的 Tool 版本为准。

8.2 Wuji 灵巧手(全局)​

Topic类型权限说明
/hand_left/joint_commandssensor_msgs/msg/JointState客户输入左手控制命令
/hand_left/joint_statessensor_msgs/msg/JointState只读左手状态
/hand_right/joint_commandssensor_msgs/msg/JointState客户输入右手控制命令
/hand_right/joint_statessensor_msgs/msg/JointState只读右手状态
/hand_left/joint_commands_playbacksensor_msgs/msg/JointState只读回放模块左手输出
/hand_right/joint_commands_playbacksensor_msgs/msg/JointState只读回放模块右手输出

9. 录制、回放与相机接口​

Topic / Service类型说明
/tj/recorder/statusstd_msgs/msg/Int32录制状态 Topic
/tj/recorder/controlmarvin_msgs/srv/JsonCommand开始、停止、查询和配置录制
/tj/control/replay/joint_cmd_A/Bmarvin_msgs/msg/JointcmdArm回放双臂输出,需 set_input=4
/tj/control/playback_controlstd_msgs/msg/String兼容回放控制 Topic
/tj/playback/controlmarvin_msgs/srv/JsonCommand回放控制主 Service
/tj/playback_statusstd_msgs/msg/String回放状态 Topic
/tj/playback_keystd_msgs/msg/Bool回放按键/状态 Topic
/quad_tile/compressedsensor_msgs/msg/CompressedImage全局原始四宫格 H.264 图像,按订阅启停
/quad_tile/compressed_undistortedsensor_msgs/msg/CompressedImage全局按标定处理的四宫格 H.264 图像,按订阅启停
/quad_tile/jpeg/compressedsensor_msgs/msg/CompressedImage全局四宫格 JPEG 图像,当前约 640×360
/recorder/set_recordingmarvin_msgs/srv/VideoCapture全局相机视频录制控制

相机接口的编码格式、单路图像和发布条件详见 相机配置与 ROS 接口。录制白名单、回放白名单和 WebSocket 白名单互相独立,详见 Topic 白名单配置与排查。

10. 可选 VLA 接口​

集成版 vlahost 读取 /tj/info/joint_feedback、末端位姿、夹爪反馈和 /quad_tile/jpeg/compressed,并向客户控制输入 Topic 发布动作。默认还提供:

接口作用
GET /health服务健康检查
GET /state获取当前观测
WS /ws/state?rate_hz=30连续接收状态
GET /stream/quad.mjpg四宫格 MJPEG 流
POST /action提交一次动作
WS /ws/action连续提交动作

默认端口为 TCP 8000。关节动作发布到 /tj/control/user/joint_cmd_A/B;末端动作发布到 /tj/control/ik_request/vla;夹爪动作发布到 /tj/control/gripperValueL/R。

11. 网络端口​

端口协议方向作用
9000UDP头显 → 控制器左侧遥操数据
9001UDP头显 → 控制器右侧遥操数据
9002UDP控制器 → 头显左末端反馈
9003UDP控制器 → 头显右末端反馈
9004UDP头显 → 控制器辅助追踪数据
9010TCP双向连接、心跳和协议握手
8888UDP广播上位机与头显发现
8000TCP双向可选 VLA HTTP/WebSocket

12. 最小验证​

source /etc/apex/apex_ros_env.sh

ros2 topic list | grep -E '^/tj/(joint_states|info/joint_feedback|control/joint_cmd_A|control/gripperValueL|info/gripper_feedback_L)$'
ros2 service list | grep -E '^/tj/control/(set_ready|set_input|set_ik_input|reset_grippers)$'

Tool 未启动时看不到夹爪反馈和 reset_grippers 属正常现象;相机未启动时看不到 /quad_tile/jpeg/compressed 也属正常现象。完整速查表参见 Marvin Pro ROS Topic 列表。