news 2026/4/26 19:08:17

Ubuntu20.04下AirSim与ROS的集成实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu20.04下AirSim与ROS的集成实战指南

1. 环境准备:从零开始的Ubuntu 20.04基础配置

如果你和我一样,是个喜欢在机器人世界里折腾的开发者,那么AirSim和ROS的集成绝对是一个能让你兴奋好一阵子的项目。AirSim是微软开源的一个基于虚幻引擎的无人机和汽车仿真平台,它提供了极其逼真的物理环境和传感器数据。而ROS,作为机器人领域的“操作系统”,则是我们控制、感知和决策的大脑。把这两者结合起来,你就能在自己的电脑上搭建一个高保真的机器人仿真实验室,无论是测试自动驾驶算法,还是验证无人机导航逻辑,都变得前所未有的方便和低成本。这篇指南,就是我花了几个周末,在Ubuntu 20.04系统上一步步踩坑、调试,最终成功跑通AirSim ROS Wrapper的完整记录。我会尽量把每一步都讲清楚,特别是那些官方文档可能一笔带过,但实际会让你卡住很久的细节。

万事开头难,一个干净、稳定的系统环境是成功的一半。我强烈建议你在一台性能足够的电脑上操作,因为AirSim对图形性能有一定要求,编译过程也比较吃资源。首先,确保你的Ubuntu 20.04系统是最新的。打开终端,运行sudo apt update && sudo apt upgrade -y来更新所有软件包。这一步看似简单,但能避免很多因库版本过旧导致的诡异问题。接下来,我们需要安装ROS。对于Ubuntu 20.04,官方推荐的是ROS Noetic Ninjemys版本。虽然网上有很多一键安装脚本,但我个人更喜欢手动一步步来,这样出了问题也知道从哪里排查。

安装ROS Noetic的第一步是配置软件源。我们将使用中科大的镜像源,速度会快很多。在终端里依次执行以下命令:

sudo sh -c ‘. /etc/lsb-release && echo “deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main“ > /etc/apt/sources.list.d/ros-latest.list‘

接着,设置ROS的密钥:sudo apt-key adv --keyserver ‘hkp://keyserver.ubuntu.com:80‘ --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654。完成后,再次更新软件包列表:sudo apt update。现在,就可以安装ROS桌面完整版了,它包含了ROS、RQT、RViz、机器人通用库等几乎所有你会用到的工具:sudo apt install ros-noetic-desktop-full -y。这个过程会下载大约2GB的文件,请耐心等待。安装完成后,最关键的一步是初始化rosdep。这个工具用于安装ROS包的依赖,我们运行sudo rosdep initrosdep update。这里有时会因为网络问题失败,多试几次或者换个时间点通常就能解决。

为了让ROS命令在每次打开终端时都能用,我们需要将ROS环境变量添加到bash配置文件中。执行echo “source /opt/ros/noetic/setup.bash” >> ~/.bashrc,然后立即生效:source ~/.bashrc。为了验证ROS是否安装成功,可以打开一个新的终端,输入roscore。如果看到ROS master启动的日志信息,没有报错,那么恭喜你,ROS环境已经就绪了。最后,我们再安装一个非常好用的ROS构建工具catkin_tools,它比传统的catkin_make更友好,支持并行编译和更好的输出信息:sudo apt install python3-catkin-tools -y。至此,我们的Ubuntu 20.04系统已经为迎接AirSim做好了ROS层面的准备。

2. 攻克编译难关:AirSim源码的获取与构建

环境准备好了,接下来就是重头戏:下载和编译AirSim源码。这一步是整个流程中最容易出问题的地方,尤其是对于国内开发者,网络环境和系统配置的差异会导致各种编译错误。别担心,跟着我的步骤走,我会把可能遇到的坑都提前指出来。首先,我们需要确保系统的默认GCC编译器版本不低于8。AirSim的某些特性依赖较新的C++标准,老版本编译器无法通过编译。检查你的GCC版本:gcc --version。如果显示是7.x或更早,就需要安装GCC-8并设置为默认。

安装GCC-8的命令很简单:sudo apt install gcc-8 g++-8 -y。安装完成后,我们需要配置系统优先使用新版本。这里有两种方法,一种是使用update-alternatives进行全局管理,另一种是只在编译AirSim时指定编译器。我推荐第一种,一劳永逸。执行以下命令:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8

如果系统里还有其他版本的GCC,你可以用sudo update-alternatives --config gcc来交互式地选择默认版本。确保选中了gcc-8。再次运行gcc --version确认版本已切换。

现在,可以开始获取AirSim源码了。我建议在主目录下操作,路径清晰不容易乱。打开终端,执行:

cd ~ git clone https://github.com/Microsoft/AirSim.git

克隆完成后,进入AirSim目录,你会看到一系列脚本和文件夹。关键的编译脚本是setup.shbuild.sh。首先运行./setup.sh。这个脚本会自动下载并安装AirSim所需的第三方依赖,包括虚幻引擎的编译工具链等。这里有一个非常重要的注意事项:由于脚本会从GitHub下载一些资源,国内网络可能会非常慢甚至超时。如果遇到反复失败,可以尝试在运行脚本前设置Git代理,或者手动寻找并替换脚本中的下载链接为国内镜像源。脚本运行成功后,终端会打印出“Setup.sh completed successfully.”之类的信息。

接下来就是最耗时的编译环节:运行./build.sh。这个命令会编译整个AirSim客户端库。根据你的CPU核心数和性能,这个过程可能需要15分钟到1小时不等。你可以通过添加-j参数来指定并行编译的线程数以加快速度,例如./build.sh --j4表示使用4个线程。编译过程中,请密切关注终端输出。如果出现错误,最常见的可能是内存不足(特别是虚拟机环境)或者某个依赖包下载失败。内存不足可以考虑增加交换空间;下载失败则需要根据错误信息,手动下载对应的文件并放到指定位置。当看到“Build succeeded”或类似的成功提示时,心里的一块大石头就可以落地了。编译生成的库文件位于AirSim/Unreal/Environments等目录下,这是我们后续与ROS通信的桥梁。

3. 搭建桥梁:构建与配置AirSim ROS功能包

AirSim本体编译成功,只算完成了一半。要让ROS能够与AirSim仿真环境对话,我们还需要构建一个关键的“翻译官”——AirSim ROS Wrapper。这个功能包定义了一系列ROS话题(Topic)、服务(Service)和参数,将AirSim内部的车辆状态、传感器数据转换成ROS标准消息,同时也将ROS的控制指令转发给AirSim。首先,我们需要确保ROS环境已正确加载,然后安装一些额外的ROS依赖包。

打开终端,安装几个必要的ROS包。tf2-sensor-msgstf2-geometry-msgs是ROS中处理传感器数据和坐标变换的重要工具;mavros是一个与MAVLink协议通信的ROS功能包,AirSim通过它来模拟无人机或车辆的底层飞控。运行命令:

sudo apt install ros-noetic-tf2-sensor-msgs ros-noetic-tf2-geometry-msgs ros-noetic-mavros* -y

安装过程会自动解决这些包自身的依赖关系。接下来,我们进入AirSim源码中的ROS目录。这个目录是独立的catkin工作空间。按照以下步骤操作:

cd ~/AirSim/ros

如果你是第一次在这个目录构建,需要先初始化catkin工作空间。但AirSim的ROS包目录通常已经预置了必要的CMakeLists.txt文件。我们直接使用catkin_tools进行构建。在ros目录下,运行:

catkin build

catkin build命令会自动扫描src目录下的所有功能包并进行编译。相比catkin_make,它的输出信息更清晰,并且支持隔离构建(每个包独立编译),出错时更容易定位。编译过程同样需要一些时间。如果一切顺利,你会在最后看到类似“[build] Summary: All 4 packages succeeded!”的输出。如果编译报错,请仔细阅读错误信息。常见问题包括:找不到AirSim的客户端库头文件(可能上一步的build.sh没完全成功)、ROS依赖包版本不匹配、或者Python路径问题。

编译成功后,千万记得要“激活”这个工作空间的环境。每次在新的终端中想要使用这个ROS包,都需要执行:

source ~/AirSim/ros/devel/setup.bash

为了方便,你也可以把这一行命令添加到你的~/.bashrc文件中,这样每次打开终端都会自动加载。但是,如果你电脑上有多个ROS工作空间,需要注意source的顺序,后source的会覆盖前者的环境。一个最佳实践是,只在需要的时候手动source。至此,AirSim与ROS之间的通信桥梁已经搭建完毕。接下来,我们就可以启动仿真环境,看看它们是如何协同工作的了。

4. 首次飞行:启动仿真与可视化测试

最激动人心的时刻到了——让我们启动整个系统,看看无人机在虚拟世界里飞起来!AirSim ROS Wrapper的运行模式通常是这样的:一个节点负责与AirSim仿真环境(一个独立的进程,通常是虚幻引擎编辑器或编译好的二进制可执行文件)通信;另一个节点(或多个)负责数据处理、控制算法和可视化。为了模拟这种多进程协作,我们需要打开多个终端。

终端1:启动AirSim仿真环境本身。这并不是启动一个ROS节点,而是启动AirSim提供的仿真世界。你可以从AirSim的预置环境开始,比如“Blocks”场景。进入AirSim的示例环境目录:cd ~/AirSim/Unreal/Environments/Blocks。如果你在之前编译了AirSim,这里应该会有一个Blocks.shBlocks.exe(Linux下通常是Blocks.sh)文件。运行它:./Blocks.sh。等待虚幻引擎加载,你会看到一个带有多个彩色方块的3D场景窗口。这就是你的仿真世界。保持这个窗口运行。

终端2:启动AirSim ROS节点。这个节点是核心的“翻译官”。在新终端中,首先确保source了ROS工作空间的环境:source ~/AirSim/ros/devel/setup.bash。然后,启动主launch文件:roslaunch airsim_ros_pkgs airsim_node.launch。这个launch文件会启动一个名为airsim_node的ROS节点。启动时,你需要通过参数告诉它如何连接到AirSim仿真环境。一个最基本的启动命令可以加上主机IP和端口(如果仿真环境运行在本机默认端口,通常可以省略):

roslaunch airsim_ros_pkgs airsim_node.launch host:=127.0.0.1

如果节点启动成功,你会在终端中看到它开始输出日志,比如“[INFO] [1609459200.0]: Waiting for vehicle to connect...”,随后变为“[INFO] [1609459205.0]: Vehicle connected!”。这表明ROS节点已经成功连接上了AirSim仿真环境中的默认车辆(通常是一台多旋翼无人机)。

终端3:启动RViz进行可视化。RViz是ROS的3D可视化工具,我们可以用它来查看无人机的位置、传感器数据等。再打开一个新终端,同样先source环境:source ~/AirSim/ros/devel/setup.bash。然后启动RViz的launch文件:roslaunch airsim_ros_pkgs rviz.launch。这个launch文件已经预配置好了RViz的显示布局。RViz窗口打开后,你可能需要点击左下角的“Add”按钮,添加一些显示类型,例如:

  • 添加一个TF来查看坐标框架。
  • 添加一个MarkerPointCloud2来查看激光雷达数据(如果车辆配置了该传感器)。
  • 添加一个Path来查看无人机的飞行轨迹。 确保RViz的“Fixed Frame”设置正确,通常设置为odom_local_nedworld_ned,这是AirSim定义的坐标系。

现在,回到运行着AirSim仿真环境的窗口(终端1对应的图形界面)。你可以用鼠标和键盘来控制视角。按键盘上的“F”键,可以切换到“跟随车辆”的视角。此时,在RViz中,你应该能看到一个代表无人机的模型。为了测试控制,我们可以通过ROS话题发送一个简单的目标点指令。再打开一个终端(终端4),输入:rostopic pub /airsim_node/drone_1/gps_goal geometry_msgs/Point “{x: 10, y: 0, z: -5}”。这条命令是告诉名为“drone_1”的无人机飞向坐标(10, 0, -5)的位置(AirSim中Z轴向下为正,所以-5是高度5米)。如果一切正常,你会看到仿真环境中的无人机开始移动,同时RViz中的模型也同步运动。这个简单的测试验证了从ROS发送指令到AirSim执行,再将状态反馈回ROS的完整闭环。至此,Ubuntu 20.04下AirSim与ROS的集成实战已经成功完成。你可以在此基础上,开始探索更复杂的传感器模型、编写自己的控制节点,或者加载更精美的自定义虚幻引擎场景了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 19:08:16

Java中的区域设置与日期格式

在Java编程中,处理日期和时间是一个常见的任务,尤其是当应用程序需要适应不同区域的用户时,准确获取系统的区域设置就显得尤为重要。本文将详细介绍如何在Java中获取Windows系统的区域设置,并结合实例展示如何正确应用这些设置。 问题背景 许多开发者在使用Java处理日期格…

作者头像 李华
网站建设 2026/4/26 19:07:23

解锁Ryzen处理器潜能:SMUDebugTool的深度探索与实践指南

解锁Ryzen处理器潜能:SMUDebugTool的深度探索与实践指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…

作者头像 李华
网站建设 2026/4/18 21:18:49

深入探讨Jetpack Compose中的NavHost与ConstraintLayout集成

在使用Jetpack Compose开发Android应用时,很多开发者可能会遇到一些奇怪的崩溃问题,尤其是在将ConstraintLayout与NavHost结合使用时。今天,我们将深入探讨一个实际案例,了解这些问题的原因并提供解决方案。 问题背景 最近,一位开发者在GitHub上分享了一个简化项目,展示…

作者头像 李华
网站建设 2026/4/18 21:18:50

WarcraftHelper:让经典魔兽争霸III焕发新生的现代增强工具

WarcraftHelper:让经典魔兽争霸III焕发新生的现代增强工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 四步解决魔兽争霸III在新电脑上…

作者头像 李华
网站建设 2026/4/18 21:19:00

TMSpeech:重构Windows实时语音转文字体验的开源解决方案

TMSpeech:重构Windows实时语音转文字体验的开源解决方案 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 在数字化协作日益频繁的今天,实时语音转文字工具已成为信息捕获的关键枢纽。然而当我…

作者头像 李华