三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Unitree Go2机器人ROS2控制一步到位:从联网建图到自主导航的完整实战教程

Unitree Go2机器人ROS2控制一步到位:从联网建图到自主导航的完整实战教程

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 / 里程计imuodom话题,姿态与轨迹可回放
激光雷达点云point_cloud2原始点云,可另存为.ply
前视摄像头camera/image_raw彩色画面
SLAM 实时建图slam_toolbox 驱动,边巡边出图
Nav2 自主导航点一下目标点,机器人自己规划路径
COCO 物体识别80 类常见物体检测框与置信度
语音合成 TTS机器人"开口说话"的能力
多机器人协同一个工作区同时挂多台 Go2
Foxglove 可视化浏览器端看数据的 WebSocket 桥接

1.3 门槛:两条协议怎么选

这套SDK的灵活之处在于连接方式可切换。简单记:打游戏用 Wi-Fi,干正事用网线。

协议环境典型场景注意点
WebRTCWi-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_pointcloudpointcloud_aggregator处理激光数据,slam_toolbox 与 nav2 的启动脚本也被一并拉了起来,此外还有 joy 手柄驱动、twist_mux 速度复用器和 Foxglove 桥。也就是说——建图、导航这些能力,在你敲下这条命令的那一刻就全部就位了。

2.5 五个常用环境变量,记住它们就够了

变量作用示例
ROBOT_IP机器人地址,多机用逗号分隔192.168.1.101,192.168.1.102
CONN_TYPE连接协议webrtccyclonedds
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.dataSLAM 的序列化数据
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=Trueexport MAP_NAME="3d_map",系统会每 10 秒把激光点云以.ply格式写到仓库根目录。仓库里的3d_map.ply就是这份能力的产物——它是调试用的原始数据,不是 Nav2 导航地图。
  • 多机协同:把ROBOT_IP设成逗号分隔的多个地址即可。启动时自动切换为multi_go2.urdfmulti_robot_conf.rviz,每台机器人的话题都带robot0/robot1/前缀,互不干扰,一个 RViz 里就能同时看到几台狗的点云。
  • 语音彩蛋:设置ELEVENLABS_API_KEY后,tts_node会让机器人开口说话,适合做展示场景。

四、避坑手册:新手最容易栽的八个跟头

现象根因解法
WebRTC 一直握手失败手机App还占着连接彻底退出App再启动,WebRTC 单连接
pip install卡在 open3dPython 3.12 暂不支持改用 Python 3.10/3.11 的虚拟环境
机器人模型"卡顿"新版固件 v1.1.7 关节状态只有 1Hz属正常现象,等待官方固件更新
点云更新慢早期版本只有约 2Hz重构后已达约 7Hz,确认拉取了最新代码
机器人原地转圈/不动控制环过载,规划频率跟不上项目已保守设置controller_frequencyexpected_planner_frequency,检查地图是否合理
导航穿墙长走廊导致地图扭曲或初始位姿不对检查初始朝向、重新建图、清理噪声
WSL2 下手柄没反应/dev/input权限不足添加 udev 规则并udevadm control --reload-rules
误报太多/漏检阈值不合适调高detection_threshold压误报,调低提召回

五、收尾:下一步怎么走

如果你按本文走完了全程,那么恭喜,你已经掌握了这台四足机器人的"打开方式"。接下来的进阶路线建议分三步:

  1. 玩熟:继续用手柄遛它,熟悉它的运动手感,观察 RViz 里点云与地图的生长规律;
  2. 改配置:导航与建图的核心参数都躺在go2_robot_sdk/config/下的nav2_params.yamlmapper_params_online_async.yamltwist_mux.yaml里,试着改一个、观察一次,比读十篇博客都管用;
  3. 读源码:项目按 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),仅供参考

← 返回列表