宇树go2 gazebo仿真
文章目录
- 宇树go2 仿真
- ROS1下的仿真
- 安装
- 1.1 安装ROS Noetic
- 1.2 安装依赖
- 1.3 创建工作空间与下载源码
- 2 启动仿真与基础运动测试
- 2.1 启动Gazebo仿真环境
- 2.2 基础运动控制
- 3 避障(move_base)启动
- 3.1 修改导航配置文件
- 3.2 修改或编写导航launch文件
- 3.3 避障执行步骤
- 导航配置文件说明
- go2 仿真相关库功能说明
- 常见问题与解决
- ROS2 的go2
- 1.安装ros2 humble
- 2.安装依赖
- 3.克隆代码
- 参考链接
宇树go2 仿真
ROS1下的仿真
安装
1.1 安装ROS Noetic
宇树Go1/Go2的官方仿真环境推荐使用ROS Noetic(对应Ubuntu 20.04)。
参考安装链接https://blog.csdn.net/zardforever123/article/details/130510145
# 安装ROS Noetic桌面完整版
sudo apt-get install ros-noetic-desktop-full
# 初始化rosdep
sudo rosdep init
rosdep update
1.2 安装依赖
安装仿真和导航所需的ROS控制器和插件:
# 安装Gazebo相关控制插件、关节状态控制器等
sudo apt-get install ros-noetic-controller-interface \
ros-noetic-gazebo-ros-control \
ros-noetic-joint-state-controller \
ros-noetic-effort-controllers \
ros-noetic-joint-trajectory-controller
其他依赖:
sudo apt install libmsgpack-dev liblcm-dev
# 导航栈
sudo apt-get install ros-noetic-navigation
1.3 创建工作空间与下载源码
- 创建工作空间:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace
- 克隆必要的代码库(通常包含以下核心包):
cd ~/catkin_ws/src # 克隆宇树官方SDK git clone https://github.com/unitreerobotics/unitree_legged_sdk.git # 克隆ROS到实机的接口包 git clone https://github.com/unitreerobotics/unitree_ros_to_real.git # 克隆主要的ROS仿真包,内含启动文件、模型和配置 git clone https://github.com/unitreerobotics/unitree_ros.git # 对于Go2,可能还需要guide包 git clone https://github.com/unitreerobotics/unitree_guide.git
- 编译:先编译unitree_legged_sdk,再编译ros包,打开move_base编译项
- 编译 unitree_legged_sdk
cd unitree_legged_sdk && mkdir build
- 修改
unitree_guide/unitree_guide
下的CMakeLists.txt
将:SET(MOVE_BASE OFF)
改为:SET(MOVE_BASE ON)
- 编译ROS1 包:
编译成功后,记得执行cd ~/catkin_ws catkin_make
source devel/setup.bash
,或者将这句命令添加到你的~/.bashrc
文件中以便每次终端启动时自动生效。
2 启动仿真与基础运动测试
2.1 启动Gazebo仿真环境
使用以下命令启动Gazebo仿真环境并加载机器人模型(以Go2为例):
# 启动Gazebo仿真,rname参数指定机器人型号(a1, go1, go2等),wname指定世界环境
# roslaunch unitree_gazebo normal.launch rname:=go2 wname:=stairs
# 或者使用unitree_guide包中的启动文件(针对Go2)
roslaunch unitree_guide gazeboSim.launch rname:=go2
# 或者使用unitree_guide包中的启动文件(针对Go1)
roslaunch unitree_guide gazeboSim.launch rname:=go1
如果启动的机器人模型显示不完整(例如缺少躯干),请检查并确保相关模型文件(如 trunk.dae
)路径正确。
检查src/unitree_ros/robots/go2_description/xacro/robot.xacro
文件
link name="trunk"
下
把<mesh filename="package://go2_description/meshes/trunk.dae" scale="1 1 1"/>
改成:
<mesh filename="package://go2_description/meshes/base.dae" scale="1 1 1"/>
对应查看go2_description/meshes/
下有这个base.dae
。
2.2 基础运动控制
启动仿真后,通常需要运行以下节点来初始化机器人位姿并启用运动控制:
- 初始化位姿:
# 让机器人伸展腿部,做好站立准备 rosrun unitree_controller unitree_servo # 或 cd ~/catkin_ws ./devel/lib/unitree_guide/junior_ctrl
- 键盘控制测试:
官方的unitree_controller
包通常提供了一些基础的运动控制节点。你可能需要通过键盘指令来控制机器狗移动,以验证仿真环境是否正常工作。- 例如,运行
rosrun unitree_controller unitree_move_kinetic
可能让机器狗做圆周运动。 - 对于Go2,编译后运行
./devel/lib/unitree_guide/junior_ctrl
,然后根据提示(如按键2站立,按键4进入行走模式,按下4键后就可以使用方向wasd键进行运动控制了,jl进行转向控制;5进入move_base模式)进行测试。
- 例如,运行
3 避障(move_base)启动
- 插播
如果启动的是go1,通过执行以下命令,则可以直接避障仿真。roslaunch unitree_move_base rvizMoveBase.launch
ROS中的导航和避障功能核心由 move_base
节点完成,它依赖全局和本地代价地图以及规划器。确保已安装ROS导航栈:
sudo apt-get install ros-noetic-navigation
3.1 修改导航配置文件
注释掉unitree_guide/unitree_move_base/config
下的costmap_common_params.yaml
的配置文件中与laser相关的项,如下:
obstacle_range: 1.0 ##
raytrace_range: 1.5 ##
footprint: [[0.3, 0.15], [0.3, -0.15], [-0.35, -0.15], [-0.35, 0.15]]
# robot_radius: 0.3
inflation_radius: 0.03
max_obstacle_height: 1.0
min_obstacle_height: 0.0
observation_sources: scan
scan: {data_type: LaserScan, topic: /merged_laserscan, marking: true, clearing: true, expected_update_rate: 3.3}
#observation_sources: faceLaserScan leftLaserScan rightLaserScan
#faceLaserScan: {data_type: LaserScan, topic: /faceLaserScan, marking: true, clearing: true, expected_update_rate: 3.3}
#leftLaserScan: {data_type: LaserScan, topic: /leftLaserScan, marking: true, clearing: true, expected_update_rate: 3.3}
#rightLaserScan: {data_type: LaserScan, topic: /rightLaserScan, marking: true, clearing: true, expected_update_rate: 3.3}
1.gazebo仿真启动
3.2 修改或编写导航launch文件
修改或者创建move base launch文件,以下二选一。
修改launch文件
注释掉unitree_guide/unitree_move_base/launch
下的rvizMoveBase.launch
文件中与laser相关的项,如下:
<!--<include file="$(find unitree_move_base)/launch/pointCloud2LaserScan.launch"/>-->
创建launch文件
创建一个你的导航启动文件(例如 my_go_navigation.launch
),用于一次性启动所有必要的节点,包括 move_base
、地图服务器(如果使用静态地图)、AMCL定位节点等。
<launch><!-- 启动Gazebo仿真环境 (假设已单独启动) --><!-- <include file="$(find unitree_gazebo)/launch/normal.launch"> ... </include> --><!-- 启动MoveBase导航节点 --><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen"><rosparam file="$(find your_pkg_name)/config/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find your_pkg_name)/config/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find your_pkg_name)/config/global_costmap_params.yaml" command="load" /><rosparam file="$(find your_pkg_name)/config/local_costmap_params.yaml" command="load" /><rosparam file="$(find your_pkg_name)/config/teb_local_planner_params.yaml" command="load" /><!-- 设置规划器插件参数 (TEB) --><param name="base_global_planner" value="global_planner/GlobalPlanner"/><param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS"/></node><!-- 如果需要,启动AMCL定位节点 --><!-- <include file="$(find your_pkg_name)/launch/amcl.launch" /> --><!-- 启动Rviz --><node type="rviz" name="rviz" pkg="rviz" args="-d $(find your_pkg_name)/rviz/nav.rviz" /></launch>
3.3 避障执行步骤
# gazebo加载世界与模型
roslaunch unitree_guide gazeboSim.launch rname:=go2
# 打开键盘控制终端:2站立,4行走,按下4键后使用方向wasd键进行操纵,jl进行转向控制;5move_base
rosrun unitree_controller unitree_servo
# 打开move base节点及rviz
roslaunch unitree_move_base rvizMoveBase.launch
# 或自己的launch文件,跟以上的二选一
roslaunch your_package_name my_go_navigation.launch
在Rviz中设置目标点:在rviz
界面中点击上方2D Nav Goal
,而后左键rviz中央地图显示界面的任意位置,摁住左键拖动鼠标可以为狗设定朝向。
之后就可以看到狗自己走了。
观察避障行为:
机器狗应开始规划一条从当前位置到目标点的全局路径(通常显示为一条浅色实线)。
当Gazebo仿真环境中出现(虚拟)障碍物,或者在本地代价地图的感知范围内出现障碍物时,本地规划器会尝试实时避开这些障碍物,并生成一条局部路径(可能显示为另一种颜色的线)。
观察机器狗是否会绕开障碍物并继续向目标点前进。
导航配置文件说明
unitree_guide/unitree_move_base/config
下的配置文件告诉 move_base
如何感知障碍物、规划路径以及控制机器狗运动。需要为go2配置参数文件,主要配置文件包括:
配置文件名称 | 主要作用 |
---|---|
costmap_common_params.yaml | 定义全局和本地代价地图共享的参数,例如障碍物层、膨胀层参数、机器人本体 footprint(轮廓)等。 |
global_costmap_params.yaml | 配置全局代价地图,用于全局路径规划(如从A点到B点的总体路线)。 |
local_costmap_params.yaml | 配置本地代价地图,用于本地实时避障和局部路径规划(如避开突然出现的障碍物)。 |
teb_local_planner_params.yaml | TEB局部规划器的参数文件,详细控制机器人在局部路径上的速度、加速度、与障碍物距离等运动行为。 |
以下是关键配置项的说明:
-
costmap_common_params.yaml
(机器人和传感器通用设置):obstacle_range: 2.5 # 最大障碍物探测范围(单位:米) raytrace_range: 3.0 # 最大清除障碍物光线投射范围 footprint: [[-0.2, -0.1], [-0.2, 0.1], [0.2, 0.1], [0.2, -0.1]] # 根据机器狗实际尺寸修改轮廓 inflation_radius: 0.3 # 障碍物膨胀半径,防止机器人太靠近# 定义传感器信息来源,例如激光雷达 observation_sources: scan scan: {sensor_frame: base_laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}
-
global_costmap_params.yaml
(全局地图设置):global_frame: map # 全局坐标系 robot_base_frame: base_footprint # 机器人基座坐标系 update_frequency: 5.0 # 地图更新频率(Hz) publish_frequency: 2.0 static_map: true # 使用静态地图(如SLAM建好的地图)
-
local_costmap_params.yaml
(局部地图设置):global_frame: odom # 局部规划使用odom坐标系 robot_base_frame: base_footprint update_frequency: 10.0 # 本地图需要更高更新频率 publish_frequency: 10.0 static_map: false # 不使用静态地图,动态更新 rolling_window: true # 滚动窗口,始终以机器人为中心
-
规划器参数 (例如DWA或TEB):
- DWA (
dwa_local_planner_params.yaml
): 常用差分轮式机器人。 - TEB (
teb_local_planner_params.yaml
): 更适用于差动、全向或阿克曼转向模型,能处理时间最优轨迹。你需要根据机器狗模型调整参数,例如:max_vel_x: 0.5 # 最大前进速度 (m/s) max_vel_theta: 1.0 # 最大旋转速度 (rad/s) acc_lim_theta: 1.0 # 旋转加速度限制 footprint_model: {type: "points", vertices: "{{-0.2, -0.1}, {-0.2, 0.1}, {0.2, 0.1}, {0.2, -0.1}}"} # 轮廓模型 min_obstacle_dist: 0.2 # 与障碍物最小允许距离
- DWA (
go2 仿真相关库功能说明
1. unitree_legged_sdk
- 核心底层 C++ SDK
这是最基础、最重要的库,是所有其他软件包与机器狗硬件通信的桥梁。
- 功能:
- 提供了通过 UDP 或 串口 与机器狗主板(主控)进行底层通信的 C++ API。
- 定义了机器狗的状态数据结构(如关节位置、速度、力矩、IMU数据等)和控制指令数据结构(如位置、速度、扭矩控制模式)。
- 实现了高频率、低延迟的数据交换,用于实时控制。
- 用途:
- 如果你想完全从零开始开发控制算法,不依赖ROS,或者需要极高的控制频率(如1kHz),你会直接使用这个SDK。
- 它是
unitree_ros_to_real
的基础依赖。
- 类比: 就像是电脑的主板驱动,让操作系统能识别和控制硬件。
2. unitree_ros_to_real
- ROS ↔ 真实机器狗的接口包
这个包的作用是将底层SDK的功能封装成ROS的话题(Topic)和服务(Service),让ROS生态系统能够方便地与真实机器狗进行通信。
- 功能:
- 它内部调用
unitree_legged_sdk
的API。 - 创建ROS节点,将机器狗的状态数据(如关节状态、IMU、足端接触力)发布到相应的话题上(如
/joint_states
,/imu
,/foot_force
)。 - 订阅来自其他ROS节点的控制指令话题(如
/cmd_vel
用于速度控制),并将其转换并发送给底层SDK,最终控制机器狗运动。
- 它内部调用
- 用途:
- 当你想要用ROS来控制一台真实的宇树机器狗时,必须运行这个包里的节点。
- 它实现了ROS控制框架(
ros_control
)的hardware_interface
,使得可以通过标准的ROS控制方式来控制机器狗。
- 类比: 就像一个翻译官,一边听ROS用“ROS语言”发出的指令,另一边用“机器狗SDK语言”指挥机器狗动作,并反过来把机器狗的“感受”翻译成“ROS语言”汇报回去。
3. unitree_ros
- ROS仿真与通用功能包
这个包是在ROS中进行仿真和开发的核心,它主要面向Gazebo仿真环境,但也包含一些通用功能。
- 功能:
- URDF模型: 包含机器狗(Go1, Go2, A1等)的精确三维模型文件,用于在Rviz和Gazebo中显示。
- Gazebo仿真:
- Gazebo的世界文件(如
.world
)。 - 启动文件(
.launch
),用于一键启动Gazebo仿真环境并加载机器狗模型。 - Gazebo插件,用于模拟机器狗的物理特性、传感器(如IMU、接触传感器)。
- Gazebo的世界文件(如
- 通用启动与配置: 包含一些在仿真和实机上都可以用的通用配置文件(如参数服务器上的参数)和启动文件。
- MoveIt!配置: 用于运动规划(如跳舞、复杂步态)的MoveIt!配置文件。
- 用途:
- 主要用于在Gazebo中进行算法仿真和测试,而无需使用昂贵的真实机器狗,避免操作失误导致损坏。
- 提供标准的机器人模型,用于在Rviz中进行可视化。
- 类比: 就像一个虚拟训练场,你可以在电脑里创建一个和真实机器狗一模一样的虚拟狗,在上面测试代码,确认无误后再部署到真狗上。
4. unitree_guide
- 高级功能与示例包 (特别是Go2)
这个包包含了宇树官方提供的一系列高级应用功能的示例和实现,主要用于 Go2 型号,展示了如何利用上述基础包来实现复杂任务。
- 功能:
- 高级示例代码: 如自主导航(SLAM+避障)、视觉跟随、人体姿态识别跟随等功能的实现代码。
- 上层应用逻辑: 包含了如何将感知、规划、控制等模块组合起来完成一个具体任务的逻辑。
- 可能包含一些机器狗自带的演示功能的源代码或接口。
- 用途:
- 学习和参考如何开发机器狗的高级应用。
- 直接运行官方提供的高级功能。
- 对于Go2用户,这个包尤其重要,因为它提供了与Go2配套的许多新功能。
- 类比: 就像是买手机时预装的各种App(如地图、相机、语音助手),它们利用手机的“操作系统”(即前面的几个基础包)来实现各种炫酷的功能。
总结与工作流程
一个典型的开发和工作流程是:
-
仿真阶段:
- 使用
unitree_ros
启动 Gazebo 仿真。 - 你的算法节点发布控制指令到
/cmd_vel
等话题。 unitree_ros
中的仿真节点接收指令,驱动Gazebo中的虚拟机器狗运动。- 在仿真中调试和完善你的代码。
- 使用
-
部署到实机阶段:
- 在连接真实机器狗的电脑上,运行
unitree_ros_to_real
节点。 - 同样是你算法节点发布控制指令到
/cmd_vel
。 unitree_ros_to_real
节点接收指令,通过内部的unitree_legged_sdk
将指令发送给机器狗主板,控制真狗运动。unitree_ros_to_real
同时从真狗读取状态数据,并发布回ROS网络,供你的算法节点使用。
- 在连接真实机器狗的电脑上,运行
简单来说:
- 想玩真狗:你需要
sdk
+ros_to_real
。 - 想在电脑里仿真:你需要
ros
。 - 想实现更酷炫的智能功能:你需要参考
guide
。
常见问题与解决
- Gazebo中机器人模型显示异常(如只有四肢没有躯干):检查URDF模型文件中的mesh文件路径是否正确,特别是
trunk.dae
等文件。
修改:src/unitree_ros/robots/go2_description/xacro/robot.xacro
<mesh filename="package://go2_description/meshes/trunk.dae" scale="1 1 1"/>
改成
<mesh filename="package://go2_description/meshes/base.dae" scale="1 1 1"/>
-
编译错误:注意第三方库(如
osqp
,osqp-eigen
)的版本匹配问题,这是导致编译失败的常见原因。 -
Could not load controller 'joint_state_controller'
:这通常是ROS控制器插件未正确安装或版本不匹配导致的。请确保已安装所有必要的依赖包。 -
避障不生效:首先检查Rviz中的本地代价地图是否正确显示了障碍物。如果没显示,检查传感器数据(如激光雷达话题
scan
)是否成功连接到move_base
;如果显示了但机器人仍撞上,尝试减小min_obstacle_dist
或增大inflation_radius
。 -
No module named ‘defusedxml’
运行roslaunch unitree_guide gazeboSim.launch rname:=go2
报错:
substitution args not supported: No module named ‘defusedxml’
第一步:执行:ls -n /usr/bin/python
发现python软链接到了python3.7
第二步删除软链接:sudo rm -rf /usr/bin/python
第三步:然后再重新建立到python2.7的软链接:
sudo ln -s /usr/bin/python2.7 /usr/bin/python
第四步:问题解决。
参考:https://blog.csdn.net/endurance2017/article/details/102997280
https://www.it610.com/article/1291998390648905728.htm
OR:本人使用:
pip install defusedxml
ROS2 的go2
小鱼的go2 git库地址:https://github.com/fishros/simdog
在Gazebo中为宇树Go2机器人添加Velodyne雷达和D435i深度相机。
照git readme的说明一步步来就可以。
- 推荐环境:Ubuntu22.04,ROS2 humble
1.安装ros2 humble
已安装的忽略:以下是小鱼一键安装步骤:
wget http://fishros.com/install -O fishros && . fishros
2.安装依赖
sudo apt install ros-humble-gazebo-ros2-control
sudo apt install ros-humble-xacro
sudo apt install ros-humble-robot-localization
sudo apt install ros-humble-ros2-controllers
sudo apt install ros-humble-ros2-control
sudo apt install ros-humble-velodyne
sudo apt install ros-humble-velodyne-gazebo-plugins
sudo apt-get install ros-humble-velodyne-description
安装liosam依赖(可选)
sudo apt install ros-humble-perception-pcl \ros-humble-pcl-msgs \ros-humble-vision-opencv \ros-humble-xacro
# Add GTSAM-PPA(可选)
sudo add-apt-repository ppa:borglab/gtsam-release-4.1
sudo apt install libgtsam-dev libgtsam-unstable-dev
3.克隆代码
git clone https://github.com/fishros/simdog.git -b main -o go2_ws
sudo rosdepc init
rosdepc update
rosdepc install --from-paths src --ignore-src -r -y
colcon build --symlink-install
构建好工程之后,然后启动文件
bash start.sh
参考链接
https://www.guyuehome.com/detail?id=1895645225580285954
https://www.guyuehome.com/detail?id=1880175119840628737
https://github.com/fishros/simdog