2. ROS与仿真环境搭建:ROS Noetic安装、工作空间创建、Gazebo与RViz基础、人形机器人URDF模型加载
说实话,搭建开发环境这件事,很多新手觉得枯燥。但我做了这么多年机器人,深知环境搭不好,后面全是坑。这一章,咱们就把ROS Noetic、Gazebo、RViz这些家伙请进电脑,再把人形机器人的URDF模型跑起来。
我个人习惯用Ubuntu 20.04 + ROS Noetic的组合。为什么选Noetic?因为它对Python 3支持最好,而且Gazebo 9和RViz的兼容性最稳定。你想想看,要是装个ROS Melodic,后面还得折腾Python 2到3的转换,多麻烦。
核心要点:ROS Noetic + Ubuntu 20.04 是目前人形机器人仿真最成熟的组合。Gazebo负责物理仿真,RViz负责数据可视化,URDF则是机器人的“骨架描述”。
2.1 ROS Noetic 安装与工作空间创建
安装ROS Noetic,我建议用官方源。别用国内镜像的旧版本,我踩过这个坑——有些镜像包不完整,编译到一半报错,查半天才发现是依赖缺失。
先更新系统源:
sudo apt update
sudo apt upgrade -y
然后添加ROS源并安装:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt install curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update
sudo apt install ros-noetic-desktop-full -y
安装完成后,记得初始化rosdep。这一步很多人会忘,导致后面编译功能包时找不到依赖。
sudo rosdep init
rosdep update
环境变量配置,我建议直接写到 ~/.bashrc 里:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
接下来创建工作空间。我习惯用 catkin_ws 这个名字,简单明了:
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
编译成功后,你会看到 build 和 devel 两个文件夹。别忘了把工作空间的环境变量也加进去:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
小技巧:用 echo $ROS_PACKAGE_PATH 检查环境变量是否生效。如果输出里包含你的工作空间路径,说明配置成功。
2.2 Gazebo与RViz基础
Gazebo和RViz,说白了就是机器人的“健身房”和“体检室”。Gazebo提供物理引擎,让机器人能在虚拟世界里走路、摔倒、再爬起来。RViz则负责展示传感器数据、机器人状态、规划路径等信息。
安装Gazebo很简单,ROS Noetic自带Gazebo 9:
sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control -y
RViz通常已经包含在 desktop-full 安装包里。如果没装,可以单独安装:
sudo apt install ros-noetic-rviz -y
启动Gazebo试试:
roslaunch gazebo_ros empty_world.launch
你会看到一个空荡荡的仿真世界。嗯,这时候别急着放机器人,先熟悉一下界面。左侧是模型列表,中间是3D视图,底部是控制面板。
RViz的启动命令:
rviz
我第一次用RViz时,界面一片漆黑,还以为装错了。后来才知道,需要手动添加显示组件。点击左下角的 Add 按钮,选择 RobotModel,就能看到机器人模型了。
| 工具 | 主要功能 | 常用场景 |
|---|---|---|
| Gazebo | 物理仿真、传感器模拟、环境交互 | 运动控制测试、碰撞检测、SLAM仿真 |
| RViz | 数据可视化、状态监控、路径展示 | 轨迹跟踪、导航规划、TF树调试 |
注意:Gazebo和RViz同时运行时,会占用大量CPU资源。如果你的电脑配置一般,建议先关闭其他应用。我曾经在8GB内存的笔记本上跑双足机器人仿真,结果直接卡死。
2.3 人形机器人URDF模型加载
URDF(Unified Robot Description Format)是ROS里描述机器人结构的标准格式。它用XML定义机器人的连杆、关节、质量、惯性等属性。说白了,就是告诉ROS:“这个机器人长什么样,关节怎么动”。
我们先创建一个简单的URDF文件。在 ~/catkin_ws/src 下新建一个功能包:
cd ~/catkin_ws/src
catkin_create_pkg humanoid_description urdf
cd humanoid_description
mkdir urdf
然后创建一个 humanoid.urdf 文件。这里我写一个简化版的人形机器人,包含躯干、头部、双臂和双腿:
<?xml version="1.0"?>
<robot name="simple_humanoid">
<!-- 躯干 -->
<link name="torso">
<visual>
<geometry>
<box size="0.4 0.2 0.5"/>
</geometry>
<origin xyz="0 0 0.25"/>
</visual>
</link>
<!-- 头部 -->
<link name="head">
<visual>
<geometry>
<sphere radius="0.15"/>
</geometry>
</visual>
</link>
<joint name="neck" type="fixed">
<parent link="torso"/>
<child link="head"/>
<origin xyz="0 0 0.5"/>
</joint>
<!-- 左臂 -->
<link name="left_arm">
<visual>
<geometry>
<cylinder radius="0.05" length="0.4"/>
</geometry>
</visual>
</link>
<joint name="left_shoulder" type="revolute">
<parent link="torso"/>
<child link="left_arm"/>
<origin xyz="-0.2 0 0.3"/>
<axis xyz="0 1 0"/>
</joint>
<!-- 右臂 -->
<link name="right_arm">
<visual>
<geometry>
<cylinder radius="0.05" length="0.4"/>
</geometry>
</visual>
</link>
<joint name="right_shoulder" type="revolute">
<parent link="torso"/>
<child link="right_arm"/>
<origin xyz="0.2 0 0.3"/>
<axis xyz="0 1 0"/>
</joint>
<!-- 左腿 -->
<link name="left_leg">
<visual>
<geometry>
<cylinder radius="0.06" length="0.5"/>
</geometry>
</visual>
</link>
<joint name="left_hip" type="revolute">
<parent link="torso"/>
<child link="left_leg"/>
<origin xyz="-0.1 0 -0.25"/>
<axis xyz="0 1 0"/>
</joint>
<!-- 右腿 -->
<link name="right_leg">
<visual>
<geometry>
<cylinder radius="0.06" length="0.5"/>
</geometry>
</visual>
</link>
<joint name="right_hip" type="revolute">
<parent link="torso"/>
<child link="right_leg"/>
<origin xyz="0.1 0 -0.25"/>
<axis xyz="0 1 0"/>
</joint>
</robot>
这个URDF定义了一个有5个连杆、5个关节的人形机器人。躯干是长方体,头部是球体,四肢是圆柱体。关节类型用了 revolute(旋转关节),这样手臂和腿就能摆动。
加载到RViz看看效果:
roslaunch urdf_tutorial display.launch model:=$(rospack find humanoid_description)/urdf/humanoid.urdf
如果一切顺利,你会看到一个简单的人形机器人出现在RViz中。嗯,虽然它看起来像个“火柴人”,但骨架结构是对的。
经验之谈:URDF里最容易出错的是坐标原点。我刚开始写时,经常把关节原点设错,导致机器人“肢体错位”。建议先用 check_urdf 工具检查:check_urdf humanoid.urdf,它会输出关节树结构,帮你快速定位问题。
下面这张图展示了本章搭建的完整知识体系:
URDF文件写好后,下一步就是把它加载到Gazebo里做物理仿真。不过,Gazebo需要额外的配置——比如添加碰撞属性、惯性参数、传动装置等。这些内容我会在后面的章节详细展开。
避坑指南:URDF里如果缺少 <inertial> 标签,Gazebo会报错。我曾经调试一个双足机器人,花了整整一个下午才发现是忘了写惯性矩阵。每个连杆都必须包含质量 <mass> 和惯性张量 <inertia>,否则仿真会崩溃。
最后,验证一下你的环境是否完整。打开终端,依次执行以下命令:
roscore
rosrun rviz rviz
rosrun gazebo_ros gazebo
如果三个窗口都能正常启动,恭喜你,环境搭建成功了。接下来,我们就可以开始真正的导航调参和轨迹跟踪之旅了。