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,它会输出关节树结构,帮你快速定位问题。

下面这张图展示了本章搭建的完整知识体系:

ROS与仿真环境搭建知识体系 ROS Noetic 环境 系统安装与配置 catkin工作空间 Gazebo + RViz 人形机器人URDF 关键流程: 1. 安装ROS Noetic → 配置环境变量 → 创建catkin工作空间 2. 安装Gazebo和RViz → 熟悉基本操作界面 3. 编写URDF文件 → 使用check_urdf验证 → 在RViz中可视化

URDF文件写好后,下一步就是把它加载到Gazebo里做物理仿真。不过,Gazebo需要额外的配置——比如添加碰撞属性、惯性参数、传动装置等。这些内容我会在后面的章节详细展开。

避坑指南:URDF里如果缺少 <inertial> 标签,Gazebo会报错。我曾经调试一个双足机器人,花了整整一个下午才发现是忘了写惯性矩阵。每个连杆都必须包含质量 <mass> 和惯性张量 <inertia>,否则仿真会崩溃。

最后,验证一下你的环境是否完整。打开终端,依次执行以下命令:

roscore
rosrun rviz rviz
rosrun gazebo_ros gazebo

如果三个窗口都能正常启动,恭喜你,环境搭建成功了。接下来,我们就可以开始真正的导航调参和轨迹跟踪之旅了。