从零开始:在Ubuntu20.04上搭建无人机仿真环境(RotorS+Gazebo11完整教程)
从零构建你的无人机数字天空: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的提示告终。但现实往往骨感,第一次编译就“丝滑”通过的情况并不多见,遇到错误(终端输出中红色的ERROR或Failed信息)是常态,也是学习的一部分。
下面是一个编译过程中可能遇到的典型错误及其解决方法的对照表,你可以把它当作一份“排错指南”:
| 错误类型 | 典型报错信息关键词 | 可能原因 | 解决方案 |
|---|---|---|---|
| 缺失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下的Pose或Path,就能看到无人机的实时位姿和飞行路径。
最后,谈谈如何集成你自己的算法。 这才是仿真的终极目的。你的工作空间结构已经为你准备好了扩展的框架。
- 创建你的功能包:在
~/uav_ws/src目录下,使用catkin_create_pkg命令创建一个新的功能包,例如用于控制算法。cd ~/uav_ws/src catkin_create_pkg my_controller std_msgs roscpp geometry_msgs - 编写节点:在你的功能包的
src目录下编写C++或Python节点。例如,编写一个订阅无人机当前位置,并发布控制指令(速度、姿态)的节点。 - 修改启动文件:复制并修改RotorS的示例启动文件,将其中控制器的部分替换为你自己编写的节点。
- 编译与测试:回到工作空间根目录运行
catkin_make,然后使用你自己的启动文件来启动仿真,观察你的算法表现。
从环境搭建到首次飞行,再到自定义探索,这个过程就像在数字世界里从学习走路到自由奔跑。我最初搭建时,被一个C++标准不兼容的错误卡了近两个小时,反复对比教程才发现是编译器标志的问题。而当你第一次看到自己编写的简单PID控制器让无人机在仿真中稳定悬停时,那种兴奋感会瞬间冲淡之前所有的调试疲惫。这个环境将成为你探索无人机感知、规划、控制算法的安全沙盒,尽情去实验,去碰撞,去创造吧。
更多推荐
所有评论(0)