ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

宇树Go1开发环境从零搭建:ROS Noetic与Gazebo仿真完整指南

宇树Go1开发环境从零搭建:ROS Noetic与Gazebo仿真完整指南 拿到宇树Go1之后我踩过最狠的坑不是运动控制算法没调好而是开发环境迟迟立不起来。Unitree SDK编译报错、ROS版本选错、Gazebo里模型加载出来四条腿乱抖……这些基础问题不解决后面想做步态规划、SLAM导航、机械臂协同全都是空中楼阁。这篇东西把我从零部署Go1开发环境的完整过程整理了一遍从SDK编译、ROS工作空间搭建到Gazebo仿真跑通一步不落坑和解决方案也全写出来。适合刚拿到Go1但不知道怎么下手的开发者、准备搞四足机器人方向的研究生以及任何想用ROS控制机器狗的人。环境组合我直接推荐Ubuntu 20.04 ROS Noetic Gazebo 11 Unitree SDK别在版本选择上纠结这套是当前Go1资料最全、踩坑最少的路子。1. 整体思路与方案选型1.1 为什么是Noetic而不是Humble入门Go1开发的人第一件事就是选ROS版本很多新手上来就想用ROS 2觉得新版本代表先进。实际做下来我把话说直白点现阶段折腾Go1ROS 1 Noetic绝对比ROS 2 Humble省心十倍。原因很实在。宇树官方提供的unitree_ros功能包、unitree_legged_sdk运动控制库针对ROS 1做过完整适配社区里能找到的教程、解决过的问题、第三方扩展代码70%以上都跑在Noetic上。你跟着官方example走一遍ROS 1下基本不会有版本冲突的幺蛾子。ROS 2那边虽然宇树在逐步支持但传感器驱动、导航框架、控制插件生态都还在迁移期新手陷进去很可能卡在某个通信中间件配置上一个星期出不来。另外要明白一点Go1的控制链路本质是SDK通过UDP协议向机器人下发期望姿态和速度ROS只是外层逻辑的承载框架。也就是说ROS版本不影响底层控制效果反而ROS 1的成熟生态能让你更快把重心放到算法和业务逻辑上。所以我的建议很明确主力用Noetic等把整个链路跑通、对SDK心中有数了再根据项目需求评估是否迁移ROS 2。1.2 开发链路全景图部署环境前先搞清一条Go1从指令到动作的完整链路这决定了你写代码时脑子里的数据流。整体分三层。最底层是Go1本体也就是那台四足机器人内部有电机驱动板、IMU、关节编码器等硬件它通过网口或Wi-Fi监听UDP端口解析控制指令。中间层是Unitree SDKunitree_legged_sdk封装了通信握手、指令打包、状态解包等逻辑你只需要构造HighCmd或SportCmd结构体SDK就会转成协议帧发出去同时接收机器人反馈的HighState结构体。最上层是ROS节点比如键盘控制节点、速度指令节点、导航节点等这些节点发布/cmd_vel等话题再由一个桥接节点订阅话题并填充SDK指令实现ROS逻辑到SDK指令的转换。所以搭建环境的本质就是把SDK编译出来、把ROS工作空间建起来、再把Go1的URDF模型塞进Gazebo最后通过一段简短的桥接代码让ROS话题和SDK指令对上。链路上每一环都不复杂但环环相扣任何一环配置出问题表现出来都是机器人不动或者仿真闪退。1.3 软硬件清单我整理一份可以直接照着准备的清单。硬件方面一台内存不低于16GB的电脑建议32GBGazebo加多个传感器场景很吃内存、一个千兆交换机或性能还行的路由器、一根网线调试时优先有线连接无线干扰排查起来能让人崩溃。软件方面Ubuntu 20.04.6 LTS桌面版、ROS Noetic、Gazebo 11装ROS时会自动带、Unitree SDK源码、unitree_ros功能包源码外加一个趁手的代码编辑器VS Code或Vim都行。虚拟机我奉劝各位慎重尤其是Windows下用VMware跑Gazebo图形渲染效率和USB设备透传都很折腾除非电脑配置极高否则直接双系统或者单独找台Linux机器最省心。2. 环境准备与SDK部署2.1 ROS与Gazebo安装的两条路线ROS安装是新手第一道坎这里我给两条路线。一条是官方流程Ubuntu 20.04对应Noetic在终端按顺序执行软件源配置、密钥更新、apt install ros-noetic-desktop-full安装完成后用roscore验证。另一条是很多国内开发者用过都说好的一键脚本搜索“鱼香ROS一键安装”就能找到这个脚本是社区开发者维护的自动化工具选了之后会引导你安装ROS、换源、配环境变量对网速慢和命令行不熟的读者非常友好。两种方式装完都是同一个ROS不影响后面任何操作。这里想多说一句很多人卡在ROS安装不是命令敲错而是依赖下载太慢或者源没换对。如果你用官方源下载速度极慢先换清华或阿里的Ubuntu源再装ROS会顺畅很多。装完之后记得把source /opt/ros/noetic/setup.bash写进~/.bashrc否则每次开新终端都要手动source。Gazebo不用单独装Noetic的desktop-full版本自带Gazebo 11。装完后可以用gazebo --version确认版本。Gazebo首次启动会去下载一堆模型库文件这一步经常卡住解决办法稍后在第5章讲。2.2 创建工作空间并编译Unitree SDK环境就绪后先建工作空间再编译SDK。逻辑上建议先编译SDK因为unitree_ros功能包依赖SDK的头文件和动态库虽然编译时不一定立刻报错但运行时会找不到库文件。mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/unitreerobotics/unitree_ros.git cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash接着编译SDK官方源码仓库是unitree_legged_sdk编译依赖eigen、boost等基础库一般系统都自带没有就sudo apt install libeigen3-dev libboost-all-dev补上。cd ~/catkin_ws/src git clone https://github.com/unitreerobotics/unitree_legged_sdk.git cd unitree_legged_sdk mkdir build cd build cmake .. make编译完成后重点检查有没有生成libunitree_sdk.so之类的动态库以及include目录下有没有unitree_legged_sdk头文件。编译过程可能出现找不到common目录的情况这不是SDK代码错而是路径问题把unitree_legged_sdk和unitree_ros放在同一个src目录下即可解决。2.3 跑通SDK自带的模拟示例SDK自带两个示例值得先跑一下。一个是example_position走位置控制模式另一个是example_velocity走速度控制模式。前者适合验证电机和关节指令后者适合验证整机运动。注意这些示例默认连的是真实机器人如果只是想测试编译结果和SDK内部逻辑可以把demo里的端口和IP参数改成本机或者配合第3章的仿真环境一起用。这里引入一个重要概念SDK里有一组SIMULATE和REAL环境变量开关。在仿真环境下SDK会尝试连接Gazebo里定义的虚拟接口在真实环境下SDK才去连接Go1本体的IP。新手最容易犯的错是在仿真环境中忘了把模式设为SIMULATE导致节点启动后一直在等真实机器人的UDP应答看起来像程序卡死实际上就是模式配错了。2.4 通信测试先联网再联机不论仿真还是真机通信都是必须过的关卡。真机连接时把Go1开机用网线连接电脑和机器人身上的网口先把电脑网卡改成和机器狗同一网段。Go1出厂默认IP是192.168.123.161子网掩码255.255.255.0网关192.168.123.1。有读者改过机器人IP所以最稳妥的做法是去SDK源码的udp.cpp里翻一下默认目标IP和端口确认并非我记错了。配置完网卡后用ping测通到机器人的网络通了再运行SDK示例。**网络不通后面的所有调试都没有意义这是排查问题第一铁律。**端口方面SDK默认监听8080等UDP端口防火墙如果开着要放行UDP很多开发者通信失败不是代码错了而是防火墙把UDP包丢了。3. 仿真环境搭建与上手控制3.1 获取Go1模型并加载到Gazebounitree_ros功能包里已经带了go1_description里面是URDF和mesh文件可以直接用。另外还有unitree_gazebo包存放Gazebo仿真用的模型、world文件和launch启动文件。模型加载前需要把mesh文件路径索引正常。常见做法是把go1_description的路径加入ROS包路径并且确认URDF里引用的mesh路径是绝对路径还是包路径。启动仿真时直接用launch文件。roslaunch unitree_gazebo gazebo.launch如果launch文件名有出入用rospack find unitree_gazebo先看一下包路径再进入目录用ls列出所有launch文件。启动成功后Gazebo窗口里会出现一只Go1四条腿处于直立待机状态。如果模型加载出来姿态不对比如趴在地上或者侧翻大概率是关节初始位置定义和物理引擎解析不一致也可能是模型缺少足端摩擦力参数这个放到第5章排查。3.2 话题结构解析仿真里在传什么数据Gazebo模型加载成功只是第一步真正要理解的是仿真中各种话题之间的数据流。启动仿真后用rostopic list看一眼会发现/cmd_vel、/odom、/imu、/joint_states等话题这些分别是运动控制指令、里程计、惯性数据和关节状态。四足仿真的关键点在于/cmd_vel不会直接驱动电机而是由unitree_gazebo里的控制插件接收后转换成SDK指令发给模型内部的运动控制逻辑再由运动控制逻辑解算每个关节的目标角度和力矩。这个链路和真实Go1保持一致所以你在仿真里写好的/cmd_vel控制逻辑拿到真机上几乎可以无缝运行。调试时建议打开rqt_graph看看节点发布订阅关系能非常直观地看到指令从键盘节点到模型控制插件之间的传导路径。很多人在仿真里发现狗不动用rqt_graph一查十有八九是话题名字对不上比如键盘节点默认发布/cmd_vel而控制插件订阅的是/go1/cmd_vel这种问题在Roslaunch文件中改个重映射就能解决。3.3 用键盘让仿真Go1走起来想最快看到Go1在仿真里动起来用键盘控制最直接。如果你装了teleop_twist_keyboard直接一条命令rosrun teleop_twist_keyboard teleop_twist_keyboard.py然后按住i键Go1就会向前走。这里要注意键盘控制发布的是Twist消息包含线速度和角速度Go1的控制模式下线速度x对应前进后退角速度z对应旋转其他速度分量会被忽略或提示不支持。如果在/cmd_vel里设置了y轴平移速度部分SDK版本会直接丢弃这一点在设计算法时务必记住。键盘控制跑通后建议把键盘节点停下来自己写一个简单的速度发布节点。我在实战中最常用的是一个Python脚本循环发布一条前进指令用来验证整条链路。import rospy from geometry_msgs.msg import Twist rospy.init_node(go1_cmd_publisher) pub rospy.Publisher(/cmd_vel, Twist, queue_size1) rate rospy.Rate(10) twist Twist() twist.linear.x 0.3 twist.angular.z 0.0 for i in range(100): pub.publish(twist) rate.sleep()把x设为0.3的意思是期望前进速度是0.3米/秒这个速度在仿真里比较安全。跑这个脚本时眼睛盯着Gazebo你会发现Go1启动时有一个明显的姿态调整过程四条腿先微微弯曲然后开始迈步。这个调整是Go1步态控制器的正常启动序列不是bug。3.4 仿真日志与状态监控仿真跑起来后学会看日志和状态话题比写控制代码还重要。订阅/joint_states能看到每个关节的角度、角速度和力矩反馈这里有个技巧Go1四条腿共12个关节每条腿3个分别对应髋关节、大腿关节和小腿关节。当你发送前进指令时正常情况是四条腿的关节角度呈现规律的周期性变化如果某个关节数值恒定不动说明那条腿的控制没有被正确激活需要回头查模型里的关节名是否和控制插件里的映射一致。还能订阅/odom观察机器人在世界坐标系下的位置验证实际位移和速度指令是否一致。实战中常见的一个现象是发送速度指令后/odom显示位置在变但Gazebo里Go1没动这通常是里程计由模型内部计算而视觉上模型本身由于物理引擎问题没有同步更新重启仿真后一般能恢复。4. 进阶改代码、加传感器、玩出新花样4.1 深入SDK核心HighCmd、SportMode和状态机仿真的乐趣不只是让狗跑两步而是改底层逻辑。Unitree SDK里有一套完整的运动控制体系其中HighCmd和HighState是高频接触的一对结构体。HighCmd会填充速度、位姿、步态等期望值HighState会返回机器人当前姿态、速度、足端力等信息。SDK还支持SportMode这是一套更底层的控制接口直接下发期望的质心位置、速度、姿态角和关节角度适合做复杂动作比如跳跃、步态切换。新手入门我建议先从HighCmd的速度控制开始把cmd结构体里的velocity成员填好再设置mode为速度模式。等速度控制玩熟了再研究位置控制最后再看SportMode。这里有个常见误解SportMode并不是比HighCmd更高的模式而是更灵活的低层接口你用SportMode时要自己处理步态时序和关节限位稍有不慎就会让机器人在真实场景里摔倒所以千万别在真机上直接试不熟悉的SportMode。4.2 给Go1加摄像头和激光雷达仿真环境跑顺后很多人的下一步就是给Go1扩展传感器做感知和导航。Gazebo里加传感器很直接一种方法是在URDF文件里直接添加一个摄像头sensor插件另一种是直接用gazebo_ros_pkgs提供的现成插件在URDF里加上相机的link和sensor就能发布/camera/image_raw图像话题。加单线激光雷达更常用因为自动导航主要靠它。Gazebo里有gazebo_ros_laser或gazebo_ros_diff_drive类似插件具体到四足机器人你可以把雷达link固定到Go1背部发布/scan话题。装完传感器后配合gmapping或slam_toolbox就能在仿真里建图再配合move_base做路径规划。这里我给个建议ROS里的导航框架大多为轮式机器人设计四足机器人如果直接套用可能会出现路径规划结果和实际行走能力不匹配的情况。所以做真机自主导航之前一定要在仿真里仔细观察地形通过性并且根据Go1的步态调整速度上限和加速度上限。4.3 从仿真迁移到真机的调试顺序仿真和真机最大的差别是物理现实。在仿真里模型参数、地面摩擦力、关节力矩都是理想化的真机则存在机械误差、电池电压波动、通信延迟等问题。我的迁移策略分四步第一步在仿真里把控制逻辑和话题名称全部跑通尽量保证代码逻辑无误第二步把电脑和Go1用网线直连运行SDK自带的示例验证通信模式能拿到真实的HighState第三步在真机上只下发最简单的站立和姿态调整指令观察机器人是否稳定响应第四步等站立稳定后再以极低速度比如0.1m/s下发前进指令随时准备按急停。这里必须强调安全真机调试Go1之前务必确保急停按钮有效并清理周围半米内的障碍物。第一次调试时建议把机器人放在开阔平地旁边不要站人。它启动时的动作幅度可能比想象中更大我亲眼见过实验室同学生怕狗摔倒用手挡结果手臂被关节带动甩到虽然没受伤但吓出一身冷汗。5. 常见问题与排查技巧实录5.1 编译与路径问题速查编译是环境搭建阶段遇到最多的坑我把实践中的典型案例列成一张速查表每个问题都是真实踩过的。现象直接原因解决方案catkin_make报找不到unitree_legged_sdk头文件unitree_legged_sdk未放在src下或未编译检查两个仓库是否在同一工作空间src目录重跑catkin_make编译成功但运行时提示找不到libunitree_sdk.so动态库路径未加入LD_LIBRARY_PATH在~/.bashrc里export LD_LIBRARY_PATH/path/to/sdk/build:$LD_LIBRARY_PATHGazebo启动后界面空白卡死模型库文件未下载完整把gazebo.marble等模型库下载后放到~/.gazebo/models启动launch报ROS包找不到setup.bash没sourcesource devel/setup.bash并写入~/.bashrc节点启动后没反应但也不退出SDK模式被设为REAL等待真机应答检查环境变量或launch参数仿真模式改为SIMULATE5.2 Gazebo模型与物理参数问题仿真里最常见的问题是模型加载出来姿态怪怪的或者一启动就弹跳、侧翻。第一个排查点是URDF里每个link的inertial参数尤其质量和惯性张量一旦某个link的质量数值离谱物理引擎就会做出诡异行为。第二个排查点是关节摩擦和足端接触参数四足机器人在Gazebo里能否稳定站立靠的是四个足端与地面之间的接触摩擦摩擦系数太低模型会原地打滑太高转弯会显得僵硬。如果模型加载出来后四条腿乱抖先别急着调PID先看是不是关节控制插件的话题和URDF关节名不匹配。控制插件订阅的是/cmd_vel而URDF里的关节通常叫FL_hip_joint这种名字中间任何一处映射出错都会导致控制指令传不到关节执行器。还有一个冷门但真实存在的坑模型文件和launch文件的路径不能包含中文Gazebo对中文路径支持一直很差报错信息还不明显。5.3 真机通信故障排查真机连不上、连上了没反馈、反馈乱跳这三个问题按顺序排查。第一步拿一根网线直连配置静态IP到同一网段然后ping机器人第二步ping通了仍然没反馈就检查UDP端口是否被防火墙拦截临时关掉防火墙再试一次注意只关调试期间调试完再打开第三步端口也通但数据乱跳大概率是电脑和机器人的控制频率不同步SDK默认按照固定频率收发UDP如果你在另一个线程里密集读写同一个网络端口就可能出现状态数据错位。这里分享一个排查小技巧抓包看UDP数据。用tcpdump -i eth0 udp port 8080把收发的UDP包导出来对照SDK源码里的协议格式解析一下数据包结构对得上问题就不在通信层往下看控制逻辑。对新手来说抓包可能略显硬核但这个技能学会之后几乎所有通信玄学问题都能一眼定位。5.4 控制效果不理想怎么办仿真里跑通了真机跑起来却发现狗走不直、走几步就偏航这个问题也常见。原因通常不在代码而在于Go1本身没有全局定位能力只能靠IMU和关节编码器估算姿态时间一长必然累积漂移。想走得直要么做视觉或激光定位闭环要么在控制逻辑里加入反馈修正。简单做法是使用/odom的偏航角发现偏了就给/cmd_vel加一个角速度修正量形成闭环比开环稳得多。还有一类问题是速度响应慢发送指令后要等几百毫秒才动。这是Go1运动控制器的正常响应因为底层步态规划需要平滑过渡不会瞬时响应。真机调试时别一看到延迟就以为代码出错先观察一两秒再下结论。如果延迟异常大再查网络延迟和控制频率重点看有没有丢包。写在最后的一点体会从零部署Go1的整个过程我做下来最深的感受是这套环境本质上就是在SDK、ROS和Gazebo之间搭一座桥桥搭通了后面所有开发都顺理成章桥没搭好写再精美的算法都运行不起来。所以别急着跳到高级功能先用一周时间把环境揉碎、吃透你以后会感谢这段“慢”时光。真机调试的三条铁律送给大家先仿真后真机、先低速后高速、先站立后行走。最后再分享一个小技巧每次启动仿真前先roscore、再启动gazebo、最后启动控制节点这个顺序能最大限度避开ROS话题注册时序问题比一次roslaunch全家桶省心得多。祝各位早日让你的Go1跑起来它值得你为它熬的每一个夜。
返回列表