Unitree Go2机器人ROS2控制一步到位:从联网建图到自主导航的完整实战教程
【免费下载链接】go2_ros2_sdkUnofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk
如果你手里有一台 Unitree Go2,却还停留在手机App遥控的阶段,那这篇实战教程就是为你准备的。go2_ros2_sdk是一套面向 GO2 AIR/PRO/EDU 的非官方 ROS2 SDK,它通过 WebRTC(Wi-Fi)与 CycloneDDS(有线)两条链路,把关节状态、IMU、激光雷达、摄像头和运动控制全部搬进 ROS2 生态。读完本文,你可以亲手走完环境搭建、实时遥控、地图构建、自主导航和物体识别五个环节,全程不碰晦涩理论。
这篇教程不追求面面俱到,只回答你最关心的三件事:这套东西到底值不值得装、怎么最快把它跑起来、跑起来之后怎么让它替你干活。
一、先对齐三件事:这是什么、能做什么、有什么门槛
1.1 它解决的,是"App遥控之外的那部分需求"
宇树官方的手机App足够好用,但它是一个封闭的黑盒。你想让机器人自己巡逻、自己回充、在房间里找人、把传感器数据喂给自己的算法——这些需求App都给不了。go2_ros2_sdk补上的正是这块缺口:它把机器人包装成标准 ROS2 节点,让/cmd_vel、/odom、/scan这些ROS2世界里再普通不过的话题,在你的四足机器人身上一一落地。
一句话总结:App是给"人"遥控的,这套SDK是给"程序"遥控的。
1.2 能力清单:买到手就能用的部分
| 能力模块 | 状态 | 你得到的直接产出 |
|---|---|---|
| 关节状态实时同步 | ✅ | joint_states话题 + RViz 中的三维模型 |
| IMU / 里程计 | ✅ | imu、odom话题,姿态与轨迹可回放 |
| 激光雷达点云 | ✅ | point_cloud2原始点云,可另存为.ply |
| 前视摄像头 | ✅ | camera/image_raw彩色画面 |
| SLAM 实时建图 | ✅ | slam_toolbox 驱动,边巡边出图 |
| Nav2 自主导航 | ✅ | 点一下目标点,机器人自己规划路径 |
| COCO 物体识别 | ✅ | 80 类常见物体检测框与置信度 |
| 语音合成 TTS | ✅ | 机器人"开口说话"的能力 |
| 多机器人协同 | ✅ | 一个工作区同时挂多台 Go2 |
| Foxglove 可视化 | ✅ | 浏览器端看数据的 WebSocket 桥接 |
1.3 门槛:两条协议怎么选
这套SDK的灵活之处在于连接方式可切换。简单记:打游戏用 Wi-Fi,干正事用网线。
| 协议 | 环境 | 典型场景 | 注意点 |
|---|---|---|---|
| WebRTC | Wi-Fi | 家庭环境、临时演示、快速上手 | 连接前必须退出手机App |
| CycloneDDS | 以太网直连 | 实验室、稳定数据传输、长时间运行 | 需有线接入同一网络 |
系统要求不算苛刻:Ubuntu 22.04 + ROS2 humble / iron / rolling 三选一,Python 3.10 及以上(注意 3.12 会踩到 open3d 的坑,后面避坑章节会细说),开发机建议 8GB 内存起步。
二、实战第一步:20分钟让机器人在你的电脑里"活过来"
这一节是可完整复制的操作流程,建议照着顺序执行。
2.1 动手前的三分钟检查
- 机器人电量充足,Wi-Fi 模式已开启;
- 机器人 IP 已拿到(手机App里:设备 → 数据 → 自动机器巡检,查看 STA 网络 wlan0 的地址);
- 开发机与机器人处于同一个网络;
- 已用手机App把机器人切换到站起待机状态,且退出 App——WebRTC 同一时间只允许一个客户端连接,App 不退出会导致握手失败。
2.2 一条龙安装命令
mkdir -p ros2_ws cd ros2_ws git clone --recurse-submodules https://gitcode.com/gh_mirrors/go/go2_ros2_sdk.git src接着安装系统依赖与 Python 包:
sudo apt install ros-$ROS_DISTRO-image-tools ros-$ROS_DISTRO-vision-msgs sudo apt install python3-pip clang portaudio19-dev cd src pip install -r requirements.txt cd ..最后构建整个工作区:
source /opt/ros/$ROS_DISTRO/setup.bash rosdep install --from-paths src --ignore-src -r -y colcon build温馨提示:
pip install阶段任何报错都不要放过,很多功能(比如 open3d 相关的点云工具)都是在这一步悄悄装好的,装不干净后面会以各种诡异的方式返工。
2.3 启动核心控制节点
source install/setup.bash export ROBOT_IP="你的机器人IP" export CONN_TYPE="webrtc" ros2 launch go2_robot_sdk robot.launch.py几秒钟后,RViz 窗口会弹出来,机器人三维模型、不断累积的点云、前视摄像头画面陆续出现。这时候你拿起手柄(比如 Xbox 手柄),你的 Go2 就可以被"遛"着走了。
2.4 一条命令背后发生了什么
robot.launch.py不是一个节点,而是一整套编排:go2_driver_node负责与机器人通信,robot_state_publisher负责把 URDF 模型渲染出来,lidar_to_pointcloud和pointcloud_aggregator处理激光数据,slam_toolbox 与 nav2 的启动脚本也被一并拉了起来,此外还有 joy 手柄驱动、twist_mux 速度复用器和 Foxglove 桥。也就是说——建图、导航这些能力,在你敲下这条命令的那一刻就全部就位了。
2.5 五个常用环境变量,记住它们就够了
| 变量 | 作用 | 示例 |
|---|---|---|
ROBOT_IP | 机器人地址,多机用逗号分隔 | 192.168.1.101,192.168.1.102 |
CONN_TYPE | 连接协议 | webrtc或cyclonedds |
ROBOT_TOKEN | 部分型号需要的令牌 | 留空即可 |
MAP_SAVE | 是否周期保存点云 | True |
MAP_NAME | 点云文件名 | 3d_map |
三、让机器人自己干活:建图、导航、识别三条实战链路
3.1 链路一:手把手建出第一张地图(Unitree Go2建图教程)
准备工作:在地面上用胶带贴出一个"停靠区"矩形。这不是仪式感,而是给机器人一个明确、可复现的起点——以后每次开机都从这里出发,定位精度会高很多。
第一步:在 RViz 左侧的 SlamToolbox 插件里,点击Start At Dock,告诉建图程序"我从这个停靠点开始"。
第二步:拿起手柄,以比平时散步还慢的速度,在房间里缓慢、均匀地移动机器人,让激光扫过每个角落。绕圈、折返、多走几遍走廊,这些动作都在为地图补充细节。屏幕上的地图会实时生长——白色是可通行区域,黑色是障碍物,灰色是还没探测到的未知空间。
第三步:觉得够了,就把地图文件名填进Save Map字段点击保存,再把同一文件名填进Serialize Map点击序列化。完成后你会得到四个文件:
| 文件 | 含义 |
|---|---|
map_1.yaml | 地图元数据,记录了图像路径与分辨率等信息 |
map_1.pgm | 栅格地图图像 |
map_1.data | SLAM 的序列化数据 |
map_1.posegraph | 位姿图数据 |
这四个文件是下次导航的"入场券",建议妥善归档。
3.2 链路二:让它在地图里自己走(四足机器人导航配置)
导航分两步:先定位,再规划。
定位:下次启动时,在 SlamToolbox 插件里把地图文件名(不带扩展名)填进Deserialize Map并点击,地图就会被加载回来。此时 RViz 的 Navigation 2 面板通常显示Navigation: active / Localization: inactive,意思是机器人还没在地图中"对位"。
规划:确认机器人姿态与地图方向一致后,在 RViz 顶部菜单选择Nav2 Goal,用鼠标在地图上点一个目标点。你会看到一条绿色箭头——它同时决定了目标位置和到达后的朝向。松开鼠标,剩下的路径规划、避障、调速就全交给 Nav2 了。
重要提醒:第一次导航,请老老实实跟在机器人旁边,随时准备在它犯傻时把它拎起来。转圈、撞墙、往墙里钻,九成原因是地图不对、初始位姿不对、或两者叠加,极少是代码本身的 bug。
如果只是想纯导航、不再建图,项目还单独提供了navigation.launch.py,用ros2 launch go2_robot_sdk navigation.launch.py map:=/path/to/map.yaml即可启动,它走的是 AMCL 定位 + Nav2 的经典组合,比一边建图一边导航更稳。
3.3 链路三:让机器人"看见"世界(Go2物体识别实战)
建图导航解决了"我在哪、怎么走",物体识别回答的是"面前有什么"。在另一个终端依次执行:
source install/setup.bash ros2 run coco_detector coco_detector_node第一次运行会有短暂的模型下载过程,看到进度条是正常现象。随后查看识别结果:
ros2 topic echo /detected_objects输出里每一帧都是一组检测结果:class_id是物体类别(人会被标成person,长颈鹿就是giraffe),score是 0 到 1 的置信度,bbox:center是检测框中心在画面里的像素坐标——这些数据足够你写一个"跟着人走"的追踪程序。
想看带框的实时画面,再开一个终端:
ros2 run image_tools showimage --ros-args -r /image:=/annotated_image识别灵敏度可以随时调:detection_threshold默认 0.9,值越高过滤越狠、误报越少;算力充足时把device改成cuda能显著提速。
3.4 加分项:点云存档与多机协同
- 点云存档:启动前设置
export MAP_SAVE=True、export MAP_NAME="3d_map",系统会每 10 秒把激光点云以.ply格式写到仓库根目录。仓库里的3d_map.ply就是这份能力的产物——它是调试用的原始数据,不是 Nav2 导航地图。 - 多机协同:把
ROBOT_IP设成逗号分隔的多个地址即可。启动时自动切换为multi_go2.urdf与multi_robot_conf.rviz,每台机器人的话题都带robot0/、robot1/前缀,互不干扰,一个 RViz 里就能同时看到几台狗的点云。 - 语音彩蛋:设置
ELEVENLABS_API_KEY后,tts_node会让机器人开口说话,适合做展示场景。
四、避坑手册:新手最容易栽的八个跟头
| 现象 | 根因 | 解法 |
|---|---|---|
| WebRTC 一直握手失败 | 手机App还占着连接 | 彻底退出App再启动,WebRTC 单连接 |
pip install卡在 open3d | Python 3.12 暂不支持 | 改用 Python 3.10/3.11 的虚拟环境 |
| 机器人模型"卡顿" | 新版固件 v1.1.7 关节状态只有 1Hz | 属正常现象,等待官方固件更新 |
| 点云更新慢 | 早期版本只有约 2Hz | 重构后已达约 7Hz,确认拉取了最新代码 |
| 机器人原地转圈/不动 | 控制环过载,规划频率跟不上 | 项目已保守设置controller_frequency与expected_planner_frequency,检查地图是否合理 |
| 导航穿墙 | 长走廊导致地图扭曲或初始位姿不对 | 检查初始朝向、重新建图、清理噪声 |
| WSL2 下手柄没反应 | /dev/input权限不足 | 添加 udev 规则并udevadm control --reload-rules |
| 误报太多/漏检 | 阈值不合适 | 调高detection_threshold压误报,调低提召回 |
五、收尾:下一步怎么走
如果你按本文走完了全程,那么恭喜,你已经掌握了这台四足机器人的"打开方式"。接下来的进阶路线建议分三步:
- 玩熟:继续用手柄遛它,熟悉它的运动手感,观察 RViz 里点云与地图的生长规律;
- 改配置:导航与建图的核心参数都躺在
go2_robot_sdk/config/下的nav2_params.yaml、mapper_params_online_async.yaml、twist_mux.yaml里,试着改一个、观察一次,比读十篇博客都管用; - 读源码:项目按 Clean Architecture 分层,
go2_robot_sdk/go2_robot_sdk/下domain/放业务实体、application/放服务逻辑、infrastructure/放WebRTC与ROS2适配、presentation/是驱动节点入口。想扩展新传感器,从infrastructure/sensors/入手;想了解机器人能收到哪些指令,翻一翻domain/constants/robot_commands.py;消息定义则在go2_interfaces/msg/目录下一目了然。
如果你有多台 Go2,别浪费——把ROBOT_IP填成两个地址,试试多机协同巡逻,那才是这套SDK真正让人兴奋的地方。现在,去给你的机器人建第一张属于你的地图吧。
【免费下载链接】go2_ros2_sdkUnofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考