从零构建你的无人机数字天空:Ubuntu 20.04下的RotorS与Gazebo 11实战指南

想象一下,你坐在电脑前,眼前屏幕上是一架四旋翼无人机,它正悬停在一个虚拟的、阳光明媚的庭院上空。你轻轻敲击键盘,无人机便灵巧地绕开前方的障碍物,沿着预设的轨迹飞行。这不是科幻电影,而是你即将在自己的Ubuntu系统上搭建起来的仿真世界。对于无人机开发者、机器人学研究者,甚至是充满好奇心的技术爱好者而言,拥有一个稳定、逼真的仿真环境,意味着你可以在零风险、低成本的前提下,测试算法、验证设计,甚至进行天马行空的创意实验。今天,我们就来亲手搭建这个属于你的“数字天空”,基于Ubuntu 20.04,整合RotorS仿真器与Gazebo 11物理引擎,开启一段从零到一的完整旅程。

1. 环境基石:系统准备与核心依赖安装

在开始搭建我们的空中王国之前,确保地基稳固是首要任务。Ubuntu 20.04 LTS(长期支持版)是一个理想的选择,它提供了稳定的系统环境和广泛的软件包支持。整个搭建过程,本质上是在构建一个基于ROS(机器人操作系统)的仿真工作空间,因此ROS的安装是第一步,也是最关键的一步。

ROS Noetic Ninjemys是ROS 1的最后一个LTS版本,与Ubuntu 20.04完美匹配。安装过程虽然步骤明确,但网络环境可能成为第一个“拦路虎”。由于某些软件源位于海外,直接安装可能会非常缓慢甚至失败。一个高效的解决方案是更换为国内的镜像源,例如阿里云或清华大学的镜像。

# 备份原有的软件源列表
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 使用sed命令快速替换默认源为清华源(示例)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

更新软件包列表后,便可以按照ROS官方指南进行安装。这里推荐安装ros-noetic-desktop-full版本,它包含了ROS、RQT、RViz、Gazebo等机器人开发所需的几乎所有工具和库。

sudo apt update
sudo apt install ros-noetic-desktop-full

安装完成后,别忘了将ROS环境变量添加到你的bash配置文件中,这样每次打开新的终端窗口,ROS命令都能被正确识别。

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

为了后续编译和管理ROS项目源码,我们还需要一个名为wstool的工具。它是一个用于管理多个代码仓库的工作空间工具,能帮助我们轻松处理RotorS项目所依赖的多个Git仓库。

sudo apt install python3-wstool

至此,我们的系统已经装备了ROS和必要的工具,就像为即将起航的飞船加满了燃料和装好了导航系统。

2. 创建工作空间与获取RotorS源码

在ROS的世界里,所有项目都存在于一个称为“工作空间”的目录结构中。我们将创建一个专属的工作空间来容纳我们的无人机仿真项目。这个工作空间不仅是一个文件夹,更是一个包含源码、构建文件和安装文件的完整生态。

首先,在你喜欢的位置(例如主目录~)创建并进入工作空间的src目录,这是存放所有功能包源码的地方。

mkdir -p ~/uav_ws/src
cd ~/uav_ws/src

接着,初始化这个目录为一个Catkin工作空间。Catkin是ROS的官方构建系统,它基于CMake,但提供了更适用于ROS项目的元编译功能。

catkin_init_workspace

然后,使用之前安装的wstool来初始化工作空间的元数据管理。

wstool init

现在,是时候将主角——RotorS仿真器的源码——请进来了。RotorS是由苏黎世联邦理工学院(ETH Zurich)自动驾驶系统实验室开发的开源多旋翼无人机Gazebo仿真器,它提供了高保真的动力学模型和丰富的传感器插件。

git clone https://github.com/ethz-asl/rotors_simulator.git

注意:直接从GitHub克隆仓库时,请确保你的网络连接能够正常访问。如果遇到速度慢或连接问题,可以尝试配置Git代理,或者手动下载ZIP压缩包并解压到src目录下。

RotorS并非完全独立,它依赖于几个同样来自ETHZ ASL实验室的ROS功能包。我们需要将这些依赖一并下载到工作空间中。这一步至关重要,缺失依赖是后续编译失败最常见的原因之一。

git clone https://github.com/ethz-asl/mav_comm.git
git clone https://github.com/ethz-asl/glog_catkin.git
git clone https://github.com/ethz-asl/catkin_simple.git

mav_comm定义了微型飞行器(MAV)相关的消息和服务;glog_catkin是Google Glog日志库的Catkin封装;catkin_simple则是一个简化CMakeLists.txt编写的工具。将它们放在同一工作空间下,Catkin在编译时就能自动解析并满足依赖关系。

3. 编译构建:从源码到可执行程序

源码就位后,下一步就是将它们编译成系统可以运行的二进制文件和库。这个过程由catkin_make命令驱动,它会遍历工作空间中的所有功能包,按照CMakeLists.txt的指示进行编译。

首先,退回到工作空间的根目录(~/uav_ws),然后执行编译命令。-j参数可以指定并行编译的线程数,以充分利用多核CPU加速编译过程。例如,对于8核处理器,可以使用-j8

cd ~/uav_ws
catkin_make -j$(nproc) # $(nproc)会自动获取你CPU的核心数

理想情况下,终端会滚动输出大量的编译信息,最终以[100%]的进度和Build finished的提示告终。但现实往往骨感,第一次编译就“丝滑”通过的情况并不多见,遇到错误(终端输出中红色的ERRORFailed信息)是常态,也是学习的一部分。

下面是一个编译过程中可能遇到的典型错误及其解决方法的对照表,你可以把它当作一份“排错指南”:

错误类型典型报错信息关键词可能原因解决方案
缺失ROS功能包Could NOT find octomap_ros, Could not find a package configuration file provided by "xxx"系统未安装RotorS所需的特定ROS功能包。使用sudo apt install ros-noetic-<package-name>安装。例如:sudo apt install ros-noetic-octomap-msgs
缺失系统库Failed to find glog, Could not find libglog缺少Google Glog等系统级开发库。安装对应的-dev开发包。例如:sudo apt install libgoogle-glog-dev
C++标准不兼容#error This file requires compiler and library support for the ISO C++ 2017 standard, rotors_gazebo_plugins build fail源码中使用了较新的C++特性,而编译器设置的标准版本过低。修改rotors_simulator/rotors_gazebo_plugins/CMakeLists.txt文件,将add_definitions(-std=c++11)改为add_definitions(-std=c++17)
权限问题Permission denied, cannot create directory对某些目录没有写入权限。检查工作空间目录的所有权,确保你是所有者,或使用sudo(但需谨慎,不推荐对整个工作空间使用)。
依赖未找到find_package(catkin_simple REQUIRED) failed依赖包(如catkin_simple)未正确放置在工作空间的src目录下。确保所有依赖仓库都已克隆到~/uav_ws/src目录中。

每次解决一个错误后,需要重新运行catkin_make。有时,清理之前的编译结果再重新开始会更有效:

cd ~/uav_ws
rm -rf build devel # 清理编译目录
catkin_make -j$(nproc)

这个过程可能需要一些耐心,但每解决一个错误,你就离成功的仿真世界更近一步。当最终看到编译成功的提示时,那种成就感是无可替代的。

4. 首次起飞:启动仿真与基础测试

经过一番努力,编译终于成功。现在,让我们点燃引擎,看看我们的虚拟无人机能否顺利起飞。在运行任何ROS程序之前,都需要“激活”当前工作空间的环境。这通过source一个特定的脚本来实现。

cd ~/uav_ws
source devel/setup.bash

为了方便,你也可以将这一行命令添加到你的~/.bashrc文件中,这样每次打开终端都会自动设置好环境。

接下来,就是激动人心的启动时刻。我们将使用ROS的roslaunch命令来启动一个示例仿真。roslaunch可以一次性启动多个节点(如仿真器、控制器、可视化工具等)。

roslaunch rotors_gazebo mav_hovering_example.launch mav_name:=firefly world_name:=basic

让我为你拆解一下这个命令:

  • roslaunch: ROS的启动工具。
  • rotors_gazebo: 功能包名。
  • mav_hovering_example.launch: 启动文件的名字,这个例子演示了无人机悬停。
  • mav_name:=firefly: 指定无人机模型为“萤火虫”(Firefly),一种六旋翼模型。
  • world_name:=basic: 指定仿真世界为“basic”,一个简单的空旷世界。

执行命令后,你会看到终端开始输出一系列信息,随后Gazebo 11的图形化界面应该会自动弹出。在短暂的加载后,一个包含地面网格和一架无人机的3D世界将呈现在你面前。几秒钟内,无人机将自主启动并稳定悬停在离地面约一米的高度。

首次启动可能遇到的问题与检查清单

  • Gazebo界面黑屏或卡在加载页面:这通常是模型下载问题。Gazebo首次运行会从在线服务器下载模型,网络不畅会导致卡住。解决方法是在启动前预先下载好模型库,或配置使用本地模型路径。
  • 终端报错 [ERROR] [WallTime]: Waiting for service /gazebo/spawn_urdf_model:这通常意味着Gazebo服务器没有完全启动好。等待片刻,或检查Gazebo是否真的成功打开了。
  • 无人机掉在地上不动或乱飞:可能是物理引擎参数或控制器尚未完全初始化。尝试按一下Gazebo界面上的“播放”按钮(通常是一个三角形),或者等待更长时间让系统稳定。

如果一切顺利,恭喜你!你已经成功搭建并运行了RotorS无人机仿真环境。你可以尝试在Gazebo中用鼠标拖动视角,从不同角度观察你的无人机。

5. 深入探索:自定义仿真与进阶应用

让无人机悬停只是一个开始。RotorS和Gazebo的强大之处在于其高度的可定制性和扩展性。现在,让我们探索如何操控这个世界,并让它为你服务。

首先,如何控制这架无人机? ROS的核心通信机制是话题(Topic)和服务(Service)。无人机的位置、姿态、传感器数据等都通过话题发布。你可以使用rostopic工具来查看或发布消息。例如,查看无人机当前的姿态话题:

# 在新的终端中,先source环境
source ~/uav_ws/devel/setup.bash
# 列出所有活跃的话题
rostopic list
# 你会看到类似 /firefly/imu, /firefly/ground_truth/odometry 等话题
# 持续查看某个话题的内容
rostopic echo /firefly/ground_truth/odometry

其次,更换场景和模型。 RotorS提供了多个预置的世界和无人机模型。你可以通过修改roslaunch命令的参数来尝试它们:

  • 更换世界:将world_name参数改为windy(有风的世界)、forest(森林)或city(城市)。
    roslaunch rotors_gazebo mav_hovering_example.launch mav_name:=firefly world_name:=windy
    
  • 更换无人机:将mav_name参数改为hummingbird(一款小型四旋翼)。
    roslaunch rotors_gazebo mav_hanging_example.launch mav_name:=hummingbird world_name:=basic
    

更进一步,运行一个自主飞行演示。 RotorS包含一个航点跟踪的示例,无人机将按照预设的轨迹飞行。

roslaunch rotors_gazebo waypoint_publisher_example.launch

启动后,无人机将依次飞向空间中的几个航点。你可以打开RViz(ROS的可视化工具)来更直观地查看飞行轨迹和传感器数据。

rosrun rviz rviz

在RViz中,点击Add按钮,添加By topic,选择/firefly/ground_truth/odometry下的PosePath,就能看到无人机的实时位姿和飞行路径。

最后,谈谈如何集成你自己的算法。 这才是仿真的终极目的。你的工作空间结构已经为你准备好了扩展的框架。

  1. 创建你的功能包:在~/uav_ws/src目录下,使用catkin_create_pkg命令创建一个新的功能包,例如用于控制算法。
    cd ~/uav_ws/src
    catkin_create_pkg my_controller std_msgs roscpp geometry_msgs
    
  2. 编写节点:在你的功能包的src目录下编写C++或Python节点。例如,编写一个订阅无人机当前位置,并发布控制指令(速度、姿态)的节点。
  3. 修改启动文件:复制并修改RotorS的示例启动文件,将其中控制器的部分替换为你自己编写的节点。
  4. 编译与测试:回到工作空间根目录运行catkin_make,然后使用你自己的启动文件来启动仿真,观察你的算法表现。

从环境搭建到首次飞行,再到自定义探索,这个过程就像在数字世界里从学习走路到自由奔跑。我最初搭建时,被一个C++标准不兼容的错误卡了近两个小时,反复对比教程才发现是编译器标志的问题。而当你第一次看到自己编写的简单PID控制器让无人机在仿真中稳定悬停时,那种兴奋感会瞬间冲淡之前所有的调试疲惫。这个环境将成为你探索无人机感知、规划、控制算法的安全沙盒,尽情去实验,去碰撞,去创造吧。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐