这是一个面向实地部署的 ROS 2 工程:Unitree B2 在外部导航系统控制下完成建图、重定位和巡航;本仓库负责发现垃圾后的视觉接近、停车、下蹲、机械臂抓取、垃圾桶投放以及恢复巡航。
硬件安全提示
当前版本包含真实底盘、机械臂和串口执行代码。机械臂节点启动时可能连接控制器、打开垃圾桶并移动到待机位;
use_sim_time不是硬件仿真开关。首次迁移到新机器狗或新主机时,不要直接运行完整 launch。请先完成 迁移指南 和 验收清单。
Unitree 外部导航(建图 / 重定位 / 巡航)
│
▼
前视相机 → YOLO 感知 → 视觉伺服接近 → 目标进入 ROI
│
▼
停车 → 暂停外部导航 → 下蹲 → 关闭巡航感知
│
▼
末端 RGB-D 重检测 → 三维定位 → 机械臂抓取 → 垃圾桶投放
│
▼
站起 → 恢复行走模式 → 恢复外部导航
本仓库不包含地图构建、定位算法、巡航航点或 Nav2 路线。外部 Unitree 导航必须在任务启动前完成建图、重定位并进入巡航状态。
| 包 | 职责 |
|---|---|
b2_perception |
前视相机、YOLO 推理、目标选择、ROI 和视觉伺服 |
b2_mission_planner |
任务状态机,协调导航、底盘、感知和机械臂 |
b2_motion_control |
Unitree B2 Sport API、姿态/移动服务、无线遥控器入口 |
b2_arm_grasp_service |
末端 RGB-D、坐标变换、RealMan 机械臂、夹爪和垃圾桶 |
b2_yolo_detection |
未接入当前主链的旧版通用检测包 |
unitree_api / unitree_go / unitree_hg |
Unitree ROS 2 消息定义,不包含机器人驱动 |
当前主数据流:
/camera3/camera3/color/image_raw
→ /b2_perception/front_detections
→ tracking_controller
→ /tracking/target_in_roi
→ mission_planner
→ /b2_arm_grasp_service/front_grasp
- Ubuntu 22.04
- ROS 2 Humble
- CycloneDDS /
rmw_cyclonedds_cpp - Unitree B2 与匹配固件版本的
unitree_ros2/消息定义 - RealMan 机械臂及匹配的 Python SDK
- Intel RealSense、librealsense、
realsense2_camera - Ultralytics、PyTorch、OpenCV、NumPy、PyYAML、pyserial、
tf_transformations - 垃圾桶串口设备(当前默认
/dev/trash,115200)
项目的 package.xml 尚未覆盖全部非 ROS 依赖。迁移时必须按 迁移清单模板 固定旧主机版本,不要在验收窗口内直接升级到最新依赖。
模型权重使用 Git LFS 管理:
git lfs install
git clone https://github.com/Junzhe/unitree-b2-trash-pickup.git
cd unitree-b2-trash-pickup
git lfs pull
source /opt/ros/humble/setup.bash
rosdep install --from-paths src --ignore-src -r -y
mkdir -p src/b2_motion_control/config
colcon build --symlink-install
source install/setup.bash如果同时 source 了官方 unitree_ros2 工作区和本仓库中的同名消息包,必须确认消息版本完全一致,并避免两套 unitree_api/unitree_go 互相覆盖。
检查关键 Python 依赖:
python3 -c "import cv2, numpy, yaml, serial, pyrealsense2, ultralytics, tf_transformations"
python3 -c "from Robotic_Arm.rm_robot_interface import RoboticArm; print('RealMan SDK OK')"检查模型及类别:
python3 -c "from ultralytics import YOLO; m=YOLO('src/b2_arm_grasp_service/models/best.pt'); print(m.task); print(m.names)"随仓库模型为 YOLO 分割模型,类别为:PET bottle、Can、Carton、glass bottle、cigarette、Plastic bag、paper、cigarette case。当前默认任务配置启用类别 0–6,类别 7 未启用。
把当前已运行平台记为 A 机,目标平台记为 B 机。迁移要求先达到 A 机行为基线,再进入抓取优化:
- 冻结 A 机源码、依赖、固件、模型、参数、地图和 rosbag。
- 建立 A/B 两套机器配置,不覆盖 A 机基线。
- 在 B 主机干净编译,不复制 A 主机的
build/install/log。 - 先验证只读 DDS、外部导航和独立停止能力。
- 重新确认相机序列号、ROI、手眼、工具坐标、固定 Z 和垃圾桶 waypoint。
- 按“感知 → 底盘 → 机械臂 → 完整任务”逐级放行。
- 完成连续运行与故障注入后,才允许修改抓取算法。
详细步骤见 MIGRATION_GUIDE.md。
ros2 launch b2_perception perception.launch.py \
safe_mode:=true \
enable_tracking:=false \
launch_motion_control:=false \
model_path:=best.ptros2 topic hz /camera3/camera3/color/image_raw
ros2 topic echo --once /b2_perception/front_detections
ros2 run rqt_image_view rqt_image_view /b2_perception/debug_image在未连接机器狗的主机上使用 Unitree setup_local.sh:
source ~/unitree_ros2/setup_local.sh
source install/setup.bash
ros2 launch b2_motion_control b2_motion_control.launch.py safe_mode:=true当前 safe_mode 尚不能作为完整硬件保护:它没有覆盖所有姿态服务,而且可能屏蔽 StopMove。修复前不要在连接真机时调用 stand_down、lean_back、pitch_lean 等服务。
当前整机入口为:
ros2 launch b2_mission_planner simplified_mission.launch.py \
network_interface:=<实际网卡>人工门控服务:
ros2 service call /mission/start_full_chain_grasp std_srvs/srv/Trigger "{}"该完整入口只能在迁移验收清单全部通过后运行。 仅启动 launch 就可能初始化并移动机械臂。
以下值来自 A 机代码,只能作为 B 机迁移的参考:
| 项目 | 当前值 |
|---|---|
| 感知相机序列号 | 215222079843 |
| 抓取相机序列号 | 828112072877 |
| RealMan 控制器 | 192.168.123.200:8080 |
| 垃圾桶串口 | /dev/trash,115200 |
| 感知置信度 | 0.60 |
| ROI | 中心约 (320,410),大小 220×120 |
| 固定 Z | 当前代码为启用;B 机标定前必须关闭 |
| 单次下蹲抓取周期 | 默认最多 6 次 |
| 按键 | 当前行为 |
|---|---|
L1 + Down |
打开完整任务人工门 |
L1 + Up |
直接触发一次抓取,绕过任务状态机 |
L1 + Y |
best-effort 全系统停止链 |
L2 + R2 |
当前代码未真正下发停止,不能作为急停 |
现场必须使用原厂独立急停或可靠的硬件停止手段,不能只依赖上述 ROS 按键。
src/:ROS 2 源码。docs/MIGRATION_GUIDE.md:A→B 迁移流程和两周计划。docs/ACCEPTANCE_CHECKLIST.md:分阶段实地验收清单。docs/MIGRATION_MANIFEST_TEMPLATE.md:旧机/新机版本与硬件记录模板。docs/legacy-*:原工程简要工作流,仅供历史比对。docs/assets/:历史调试画面。build/、install/、log/、rosbag 和缓存不进入 Git。
- 所有现场版本必须有 Git tag、模型哈希和对应机器配置。
- A 机基线与 B 机候选版本分开保存。
- 参数修改必须进入版本控制,不在机器人上只改不提交。
- 任意一次漏停、双控制源、无导航 ACK 继续执行或机械臂碰撞都应立即回滚到上一验收 Gate。
本仓库暂未声明对外开源许可证。模型检查点包含独立许可元数据;在将仓库改为公开或对外分发前,需要完成代码、模型及第三方 SDK 的许可证核查。