XMARTEV 物料检测 task1 的 ROS2 仿真环境。参赛者启动 server 后,通过 ROS2 话题订阅 RGB-D、里程计、关节状态和任务信息,并发布控制指令驱动 MMK2 机器人完成柜内抓取和桌面放置。
任务内容:
Take the brownbox from the cabinet, and put it on the table.
宿主机需要 Docker、NVIDIA Driver、NVIDIA Container Toolkit、NVIDIA GPU 和可用显示环境。
docker pull crpi-1pzq998p9m7w0auy.cn-hangzhou.personal.cr.aliyuncs.com/challengecup/material_detection:task1_cu118_full允许容器显示图形窗口,并创建运行缓存:
xhost +local:root
docker volume create xmartev_torch_extensions启动 server,默认开启可视化窗口、3DGS、相机图像和深度图,默认关闭 LiDAR 和裁判评分:
docker run --rm -it \
--gpus all \
--network host \
--ipc host \
--name xmartev_task1_server \
-e DISPLAY=${DISPLAY} \
-e QT_X11_NO_MITSHM=1 \
-e ROS_DOMAIN_ID=99 \
-e RMW_IMPLEMENTATION=rmw_cyclonedds_cpp \
-e MUJOCO_GL=glfw \
-e XMARTEV_HEADLESS=0 \
-e XMARTEV_ENABLE_RENDER=1 \
-e XMARTEV_USE_GS=1 \
-e XMARTEV_USE_LIDAR=0 \
-e XMARTEV_ENABLE_SCORE=0 \
-e TORCH_EXTENSIONS_DIR=/tmp/torch_extensions \
-e TORCH_CUDA_ARCH_LIST="8.6" \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v xmartev_torch_extensions:/tmp/torch_extensions \
crpi-1pzq998p9m7w0auy.cn-hangzhou.personal.cr.aliyuncs.com/challengecup/material_detection:task1_cu118_full \
bash -lc "xmartev-server --round_id 1 --fix 1"另开终端运行 baseline client:
docker run --rm -it \
--gpus all \
--network host \
--ipc host \
--name xmartev_task1_baseline \
-e ROS_DOMAIN_ID=99 \
-e RMW_IMPLEMENTATION=rmw_cyclonedds_cpp \
-e YOLO_CONFIG_DIR=/tmp/ultralytics \
crpi-1pzq998p9m7w0auy.cn-hangzhou.personal.cr.aliyuncs.com/challengecup/material_detection:task1_cu118_full \
bash -lc "cd /workspace/material_detection_client && python3 baseline_round1_seed99.py"baseline 会执行固定流程:
start zone -> cabinet -> detect brownbox -> pick brownbox -> table -> place
参赛者可以保留同一个 server,替换为自己的 ROS2 client。
停止容器:
docker stop xmartev_task1_server
docker stop xmartev_task1_baselineexamples/xmartev_material_detection/task_1_server.py # 启动 MuJoCo/ROS2 仿真 server
material_detection_client/baseline_round1_seed99.py # baseline 抓取 client
material_detection_client/yolo_detect.py # baseline YOLO 检测节点
server 常用环境变量:
ROS_DOMAIN_ID=99 server 和 client 必须一致
RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
MUJOCO_GL=glfw 开启桌面可视化窗口
XMARTEV_HEADLESS=0 开启可视化界面
XMARTEV_ENABLE_RENDER=1 保持相机图像和深度图发布
XMARTEV_USE_GS=1 启用 3D Gaussian Splatting 渲染
XMARTEV_USE_LIDAR=0 默认关闭 LiDAR;server 加 --enable-lidar 可开启
XMARTEV_ENABLE_SCORE=0 默认关闭裁判评分;server 加 --enable-score 可开启
TORCH_EXTENSIONS_DIR=/tmp/torch_extensions
xmartev_torch_extensions 用于保存 gsplat CUDA 扩展编译缓存。第一次运行会编译,后续同一台机器会复用这个 volume。
检查镜像内 server、client、baseline、ROS2 消息和资源:
docker run --rm -it \
--gpus all \
--network host \
--ipc host \
crpi-1pzq998p9m7w0auy.cn-hangzhou.personal.cr.aliyuncs.com/challengecup/material_detection:task1_cu118_full \
bash -lc "xmartev-check-install"无窗口短测:
docker run --rm -it \
--gpus all \
--network host \
--ipc host \
-e MUJOCO_GL=egl \
-e XMARTEV_HEADLESS=1 \
-e XMARTEV_ENABLE_RENDER=1 \
-e XMARTEV_USE_GS=1 \
-e XMARTEV_USE_LIDAR=0 \
-e XMARTEV_ENABLE_SCORE=0 \
-e TORCH_EXTENSIONS_DIR=/tmp/torch_extensions \
-e TORCH_CUDA_ARCH_LIST="8.6" \
-v xmartev_torch_extensions:/tmp/torch_extensions \
crpi-1pzq998p9m7w0auy.cn-hangzhou.personal.cr.aliyuncs.com/challengecup/material_detection:task1_cu118_full \
bash -lc "xmartev-server --round_id 1 --fix 1 --max-time 5"下表列出本场景 server 提供给参赛者使用的主要 ROS2 接口话题。/rosout、/parameter_events 等 ROS2 自动话题不属于比赛控制/观测接口。
| Topic | Type | 说明 |
|---|---|---|
/clock |
rosgraph_msgs/msg/Clock |
仿真时间。 |
/slamware_ros_sdk_server_node/odom |
nav_msgs/msg/Odometry |
机器人底盘位姿和速度。 |
/tf |
tf2_msgs/msg/TFMessage |
动态 TF,主要为 odom -> base_link。 |
/joint_states |
sensor_msgs/msg/JointState |
升降、头部、双臂和夹爪关节状态。 |
/head_camera/color/image_raw |
sensor_msgs/msg/Image |
头部 RGB 图像,rgb8,默认 640x480。 |
/head_camera/color/camera_info |
sensor_msgs/msg/CameraInfo |
头部 RGB 相机内参。 |
/head_camera/aligned_depth_to_color/image_raw |
sensor_msgs/msg/Image |
头部深度图,对齐 RGB,mono16,单位毫米。 |
/head_camera/aligned_depth_to_color/camera_info |
sensor_msgs/msg/CameraInfo |
头部深度相机内参。 |
/left_camera/color/image_raw |
sensor_msgs/msg/Image |
左腕 RGB 图像,rgb8,默认 640x480。 |
/left_camera/color/camera_info |
sensor_msgs/msg/CameraInfo |
左腕相机内参。 |
/right_camera/color/image_raw |
sensor_msgs/msg/Image |
右腕 RGB 图像,rgb8,默认 640x480。 |
/right_camera/color/camera_info |
sensor_msgs/msg/CameraInfo |
右腕相机内参。 |
/xmartev_material_detection/taskinfo |
std_msgs/msg/String |
当前任务文本。 |
/xmartev_material_detection/gameinfo |
std_msgs/msg/String |
裁判状态和得分信息;默认关闭,server 加 --enable-score 后发布。 |
/slamware_ros_sdk_server_node/scan |
sensor_msgs/msg/LaserScan |
激光雷达扫描;默认关闭,server 加 --enable-lidar 后发布。 |
| Topic | Type | 控制格式 |
|---|---|---|
/cmd_vel |
geometry_msgs/msg/Twist |
使用 linear.x 控制前进速度,angular.z 控制角速度。 |
/spine_forward_position_controller/commands |
std_msgs/msg/Float64MultiArray |
[slide_joint] |
/head_forward_position_controller/commands |
std_msgs/msg/Float64MultiArray |
[head_yaw_joint, head_pitch_joint] |
/left_arm_forward_position_controller/commands |
std_msgs/msg/Float64MultiArray |
[joint1, joint2, joint3, joint4, joint5, joint6, gripper] |
/right_arm_forward_position_controller/commands |
std_msgs/msg/Float64MultiArray |
[joint1, joint2, joint3, joint4, joint5, joint6, gripper] |
baseline 额外发布:
| Topic | Type | 说明 |
|---|---|---|
/yolo/detections |
vision_msgs/msg/Detection2DArray |
YOLO 检测结果,供 baseline 抓取流程使用。 |
/yolo/result_image |
sensor_msgs/msg/Image |
YOLO 可视化结果图像。 |
/joint_states 关节顺序:
slide_joint
head_yaw_joint
head_pitch_joint
left_arm_joint1
left_arm_joint2
left_arm_joint3
left_arm_joint4
left_arm_joint5
left_arm_joint6
left_arm_eef_gripper_joint
right_arm_joint1
right_arm_joint2
right_arm_joint3
right_arm_joint4
right_arm_joint5
right_arm_joint6
right_arm_eef_gripper_joint
以下命令需要在与 server 相同 ROS_DOMAIN_ID 的容器内运行。
ros2 topic list
ros2 topic echo /xmartev_material_detection/taskinfo
ros2 topic hz /head_camera/color/image_raw底盘前进:
ros2 topic pub -r 10 /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.10, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"底盘停止:
ros2 topic pub --once /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"升降和头部:
ros2 topic pub --once /spine_forward_position_controller/commands \
std_msgs/msg/Float64MultiArray "{data: [0.10]}"
ros2 topic pub --once /head_forward_position_controller/commands \
std_msgs/msg/Float64MultiArray "{data: [0.0, -0.6]}"右臂张开/闭合夹爪:
ros2 topic pub --once /right_arm_forward_position_controller/commands \
std_msgs/msg/Float64MultiArray \
"{data: [0.0, -0.166, 0.032, 0.0, -1.571, -2.223, 1.0]}"
ros2 topic pub --once /right_arm_forward_position_controller/commands \
std_msgs/msg/Float64MultiArray \
"{data: [0.0, -0.166, 0.032, 0.0, -1.571, -2.223, 0.2]}"