ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AirSim ROS Wrapper 实战:环境配置、数据桥接与避坑指南

AirSim ROS Wrapper 实战:环境配置、数据桥接与避坑指南 1. 为什么要装这个包装器AirSim 与 ROS 之间的那座桥AirSim 这个开源项目火了这几年配合 ROS 做无人机、无人车的仿真验证已经是很多团队的标准技术路线了。我最近在项目里需要把 AirSim 里的传感器数据接进 ROS跑 SLAM 和路径规划所以专门花了一天时间把 AirSim ROS Wrapper 装好、调通。整个过程说实话不算难但版本匹配、依赖缺失、网络通信这几个环节很容易把人卡住写这篇文章就当复盘也帮你把该避的坑提前踩平。AirSim 本身是微软开源的一套基于虚幻引擎的高保真仿真平台无人机、汽车、各种传感器、天气光照都能模拟底层通过 RPC 接口对外提供 Python/C API。ROS 则是机器人领域的事实标准中间件节点之间通过 topic、service、action 通信。这两套东西各自都很强大但它们之间没有天然的“共同语言”。如果没有 AirSim ROS Wrapper你要么自己写一堆胶水代码把 AirSim 的数据一层层转为 ROS 消息要么就只能放弃 ROS 生态里现成的建图、导航、规划工具直接在 Python 脚本里手动处理仿真数据。前者工作量不小后者会浪费大量现成工具。AirSim ROS Wrapper 的定位就是把这层“翻译”工作打包好。它是一个运行在 ROS 环境里的节点包启动后会自动连接 AirSim 模拟器把相机图像、激光雷达点云、IMU、GPS、碰撞状态等数据转换成标准 ROS 消息发布出去同时也能接收 ROS 下发的速度指令来控制仿真里的无人机或车辆。也就是说有了它你在 ROS 里写一个订阅图像话题的节点跟在真实机器人上开发几乎没有区别仿真环境里的数据格式、坐标规范、话题接口都能对得上。1.1 它到底解决了什么问题说白了这个包装器解决的是“两个世界之间互认”的问题。AirSim 有自己的一套数据访问方式ROS 有自己的一套消息定义中间缺一个标准适配层。AirSim ROS Wrapper 做的工作可以拆成四块来看。第一块是通信桥接。AirSim 通过 RPC 协议暴露数据Wrapper 负责启动 RPC 客户端并持续拉取数据再以 ROS 话题的形式发布。你不需要关心底层是怎么连接的只要保证网络能通。第二块是消息映射。AirSim 的相机图像是 RGBA8、BGRA8 之类的裸数据Wrapper 帮你转成sensor_msgs/Image激光雷达点云转成sensor_msgs/PointCloud2IMU 转成sensor_msgs/Imu位姿、速度等信息转成nav_msgs/Odometry或geometry_msgs/PoseStamped。这些转换代码如果自己写光查格式就能耗掉半天。第三块是坐标系转换。AirSim 内部使用 NED 坐标ROS 的通用习惯是 ENU 坐标Wrapper 会在发布前做转换并维护 TF 树保证你在 rviz 里看到的坐标系是符合直觉的。第四块是控制通路。Wrapper 提供速度指令、姿态指令等话题你在 ROS 里往对应话题发消息就能控制仿真里的飞行器或车辆跟发指令给真实底盘没区别。1.2 谁需要这套东西如果你的工作涉及下面任意一种这个包装器基本是绕不开的想在仿真环境里验证 SLAM、VIO、目标检测或导航算法需要一套和真实机器人接口一致的传感器数据流方便后续直接迁移到实机团队里有多台机器想用 Windows 跑仿真、Linux 跑 ROS 的异构方案或者只是刚入门 ROS想找一个带丰富传感器数据的仿真环境练手。我个人的建议是不要跳过这个包装器直接用 AirSim 的 Python API 做实验。短期看 Python API 确实快但一旦你开始需要 rviz 可视化、TF 树、rosbag 录包、以及和其他 ROS 节点协作直接用原生 API 会非常别扭。Wrapper 的价值在长期维护和方案演进上这笔“安装成本”花得非常值。2. 动手前的环境规划版本搭配真的很重要安装这个东西之前最好先花十分钟理一下环境。很多人在编译阶段就失败不是因为命令敲错而是 Ubuntu 版本、ROS 版本、AirSim 分支、依赖库这几者没对齐导致链式报错。2.1 推荐的环境组合AirSim ROS Wrapper 本身是跨平台的但 ROS 基本只支持 Linux 和少量特殊发行版所以最常见的方式是分两种情况。第一种是单机方案所有东西都跑在一台 Ubuntu 机器上。AirSim 官方对 Ubuntu 的支持做得不错需要安装 Unreal Engine 和 AirSim 插件配置相对麻烦一些显卡要求也高。这种方案的好处是简单不用跨网络通信适合已经用 Ubuntu 做主力开发环境的人。第二种是双机方案Windows 跑 AirSimUbuntu 跑 ROS。Windows 上 Unreal Engine 的部署和调试更成熟显卡驱动也更容易搞定所以很多做仿真环境的人喜欢把 AirSim 放在 Windows 机器上把 ROS 放在另一台 Linux 机器上两边通过网络通信。Wrapper 支持通过host_ip参数指定 AirSim 所在机器的 IP所以双机部署并不复杂只是多了防火墙和网络配置这一层。我自己用的是第二种方案因为手头主力机是 Windows带一块中高端 N 卡跑虚幻引擎比较稳另外一台 Ubuntu 工作机专门跑 ROS两边分工明确互不干扰。实测下来只要同一局域网内带宽够图像点云数据的传输延迟在可接受范围内。2.2 版本选择与依赖清单版本这块是坑最多的环节我列一个当前环境下相对稳妥的组合Ubuntu 20.04 ROS Noetic。如果还在用 Ubuntu 18.04那对应的是 ROS MelodicWrapper 也支持但依赖包名会有差异。新项目我建议直接上 Noetic生命周期更长教程也多。AirSim 主分支也就是 GitHub 仓库的 master。AirSim 的 ROS 相关代码集中在ros目录下官方会跟随主分支更新。尽量避免下载很老的 release tag除非你确定它和你的 ROS 版本兼容。Python 3。ROS Noetic 默认就是 Python 3AirSim 的 Python 客户端也是 Python 3两者能对上。依赖部分除了 ROS 基础环境之外有几个关键包必须提前装好catkin或catkin_tools用来编译工作空间。geographiclib相关包用于经纬度、UTM 坐标转换。这个是编译时必装的漏掉会出现找不到GeographicLib头文件的错误。常用 ROS 消息包比如sensor_msgs、nav_msgs、geometry_msgs、tf2、cv_bridge等一般装了ros-noetic-desktop-full都有。ROS 基础环境这块如果你是从零开始可以用鱼香ROS提供的“一键安装”脚本国内网络环境下能省掉手动配置软件源、添加密钥这些琐碎步骤。我试过在干净系统上跑一遍几分钟就能把 ROS 装好对于新手特别友好。不过要注意这只是一键装 ROS 基础环境AirSim ROS Wrapper 本身的依赖还是要自己挨个补齐的别以为一键之后万事大吉。在我实际安装时比较稳的依赖安装命令是这样的sudo apt update sudo apt install ros-noetic-geographiclib-msgs ros-noetic-geographiclib-tools \ geographiclib-tools python3-catkin-tools注意包名里的ros-noetic这一段不同 ROS 版本要改成对应前缀比如ros-melodic-geographiclib-msgs。2.3 网络与端口基础如果采用双机方案AirSim 默认的 RPC 端口是 41451Replay 模式端口是 41453。Wrapper 启动时会去连这两种端口。Windows 端的防火墙要确保这些端口对局域网内的 Ubuntu 机器开放。最简单的验证方法是在 Ubuntu 上执行nc -zv Windows_IP 41451能通才继续往下走不然 ROS 节点启动后会一直连不上 AirSim日志里报超时。3. 正式安装从源码编译到 roslaunch环境准备好之后安装本身并不复杂核心就四步拉源码、创建 catkin 工作空间、编译、启动。下面按步骤拆开讲。3.1 获取 AirSim 源码和 ROS 工作空间AirSim 的 ROS Wrapper 代码在 AirSim 仓库的ros子目录里。先克隆仓库然后把ros目录复制到你的 catkin 工作空间。我习惯这样操作cd ~ git clone https://github.com/microsoft/AirSim.git mkdir -p ~/catkin_ws/src cp -r ~/AirSim/ros ~/catkin_ws/src/airsim_ros这里需要说明一下AirSim 整个仓库比较大因为带了很多示例资源如果你只想拿 ROS 部分也可以做 sparse checkout只拉ros目录。不过对大多数人来说整个克隆下来也就几分钟的事情没必要折腾。复制过来的目录名保持airsim_ros就行这是包名改乱了后面 roslaunch 会找不到包。3.2 编译 catkin 工作空间进入工作空间根目录开始编译cd ~/catkin_ws catkin_make如果你用的是catkin_tools可以写成catkin build。第一次编译会花几分钟因为要构建所有消息定义。编译完成后记得 source 一下source ~/catkin_ws/devel/setup.bash有些人会问AirSim 的 C 源码是不是也要编译这里特别说明一下ros目录里的 Wrapper 是一个独立的 ROS 功能包它依赖 AirSim 提供的 C 客户端库但这些库在编译时已经以源码形式包含在包内了你不需要提前去编译整个 AirSim 工程。也就是说只要能把 AirSim 仓库克隆下来在 Ubuntu 上跑通 catkin_make 就能拿到可执行文件不需要装 Unreal Engine。3.3 启动 AirSim 模拟器这一步取决于你的 AirSim 环境在哪台机器上。如果是单机 Ubuntu 方案直接编译并启动 AirSim 的 Unreal 项目然后选择飞行器或车辆模式。如果是 Windows 双机方案就在 Windows 上启动 AirSim 的模拟环境比如官方提供的 Blocks 环境进入后按需选择 Vehicle。AirSim 的环境外观可以保持默认但传感器配置建议手动指定。AirSim 支持启动时加载settings.json你需要在文档文件夹下的 AirSim 配置目录里放好这个文件。比如我想让无人机默认挂载一个前视相机和一个旋转激光雷达配置大致长这样{ Vehicles: { Drone1: { VehicleType: SimpleFlight, DefaultVehicleState: Armed, Cameras: { front_center: { CaptureSettings: [ { ImageType: 0, Width: 640, Height: 480, FOV_DEG: 90 } ] } }, Sensors: { LidarSensor1: { SensorType: 6, Enabled: true, NumberOfLasers: 16, PointsPerScan: 100000 } } } } }配置里的关键是ImageType: 0代表场景相机SensorType: 6代表激光雷达。AirSim 的传感器枚举在不同版本里微调过如果你发现传感器没生效先查这个枚举值。3.4 启动 ROS Wrapper 并验证AirSim 起来后回到 Ubuntu 机器启动 Wrapperroslaunch airsim_ros airsim_node.launch默认情况它会尝试连接本机的 AirSim。如果你用双机方案需要修改启动参数把 AirSim 所在机器的 IP 指过去。两种方式一是改 launch 文件里的参数二是在命令行覆盖roslaunch airsim_ros airsim_node.launch host_ip:192.168.1.100这里的 IP 就是运行 AirSim 的那台 Windows 机器的局域网 IP。启动之后你会在日志里看到类似“Connected to AirSim”的信息说明连接成功。如果一直卡在重试状态多半是 IP、端口或防火墙的问题。连接成功后先检查一下话题列表rostopic list正常情况下能看到一大批以/airsim_node开头的话题比如/airsim_node/pose/airsim_node/odom/airsim_node/imu/imu_data/airsim_node/Drone1/camera_0/image_raw/airsim_node/Drone1/lidar/LidarSensor1/point_cloud你还可以用 rqt 或 rviz 直接看数据。在 rviz 里添加PointCloud2显示选到激光雷达话题点云应该就能刷出来添加Image显示选到相机话题画面也应该能动。看到数据的那一刻说明整套链路已经打通了。4. 话题、消息和坐标拿到数据后先别急着用连接通了只是第一步真正用起来你还要搞清楚 Wrapper 到底发布了哪些话题消息是什么格式坐标系又是什么。很多人在这一步卡住不是没连上而是在代码里取不到想要的数据或者数据到了但坐标完全不对。4.1 核心话题速查表以我当前用的版本为例下面这几个话题最常用话题消息类型说明/airsim_node/posegeometry_msgs/PoseStamped当前飞行器/车辆在世界系下的位姿/airsim_node/odomnav_msgs/Odometry里程计包含位置和速度/airsim_node/imu/imu_datasensor_msgs/ImuIMU 数据加速度和角速度/airsim_node/Drone1/camera_0/image_rawsensor_msgs/Image相机图像默认是场景视图/airsim_node/Drone1/lidar/LidarSensor1/point_cloudsensor_msgs/PointCloud2激光雷达点云/airsim_node/vel_cmd_bodygeometry_msgs/TwistStamped发送机体坐标系速度指令/airsim_node/vel_cmd_worldgeometry_msgs/TwistStamped发送世界坐标系速度指令/has_collidedstd_msgs/Bool是否发生碰撞注意带Drone1这类前缀的话题车辆名称要和 AirSim 里配置的 Vehicle 名字一致。如果 AirSim 的 vehicle 名是MyDrone那话题前缀就变成/airsim_node/MyDrone/...。这也是一个容易踩的坑很多人拿着默认的SimpleFlight去搜资料搜出来的话题名跟自己的环境对不上。4.2 坐标系和 TF 树AirSim 内部使用 NED 坐标系也就是 X 轴朝北、Y 轴朝东、Z 轴朝下这是航空领域常见的定义。ROS 的习惯是 ENU即 X 轴朝东、Y 轴朝北、Z 轴朝上。Wrapper 发布话题时会做坐标转换并且默认发布 TF 树一般会有airsim、world、map、body这几个 frame。如果你在自己的节点里需要做坐标变换建议直接订阅/tf或使用tf2不要自己去算 NED 和 ENU 之间的旋转矩阵。自己算不是不行但容易在多个坐标系叠加时搞混尤其当你有多个车辆、多个传感器时只用 TF 才能保证一致性。4.3 在 rviz 里看数据我建议大家在写任何代码之前先在 rviz 里把数据看一遍确认传感器没白挂。启动 rviz 时可以加上参数直接加载 Wrapper 提供的 rviz 配置省得自己手动添加面板rosrun rviz rviz -d ~/catkin_ws/src/airsim_ros/rviz/airsim.rviz如果那条 rviz 配置路径不存在也没关系手动添加就行。把Fixed Frame设成map或world然后把Odometry、PointCloud2、Image、TF依次加进去数据一目了然。我这边第一次加载点云时发现点云颜色偏暗后面查了下是 rviz 的点云显示Color Transformer没选对改成FlatColor就好了。这些小问题不复杂但很影响调试体验。5. 常见问题与排查实录以下问题是我在实际安装和使用中遇到过的或者是在社区里看到高频出现的整理成一个小速查表方便你直接对照。5.1 编译阶段的问题最常见的编译错误是找不到GeographicLib。报错内容类似fatal error: GeographicLib/...或Could not find a package configuration file provided by geographiclib。解决办法就是回头把geographiclib-msgs、geographiclib-tools这类包装好。另一个常见问题是cv_bridge和 OpenCV 版本冲突。尤其是老版本 ROS Melodic 自编译 OpenCV 的环境很容易触发。如果你只是用默认的desktop-full安装一般不会遇到如果你后来手动装了新版本 OpenCV编译时大概率会报一堆opencv2/... not found。我的建议是除非确实需要否则别在 ROS 环境里手动改 OpenCVROS 自带的版本够用了。还有一个新手容易忽略的问题编译时没有 source ROS 环境。如果你打开一个新终端直接catkin_make会提示找不到catkin。先执行source /opt/ros/noetic/setup.bash再编译。5.2 启动后收不到数据这个话题最典型的现场是roslaunch启动成功rostopic list也能看到话题但订阅图像或点云时数据始终不更新或者完全没有数据。优先确认三件事。第一AirSim 模拟器真的在运行吗有时候你 AirSim 窗口最小化了或者启动到主菜单没进入环境Wrapper 连接到了 RPC 端口但拿不到仿真数据。第二传感器真的启用了settings.json 里如果没有给对应车辆添加Sensors和Cameras配置AirSim 默认是不挂载激光雷达的相机可能只有基础的一个。第三IP 和端口对不对尤其注意 41451 和 41453 这两个端口。部分版本的 Wrapper 默认连接 Replay 模式如果你启动 AirSim 时没开 Replay连接会失败需要在 launch 文件里把端口配到 41451。如果你用的是多机方案还有一个出现概率很高的坑Windows 防火墙默认会拦截来自局域网其他机器的 UDP 连接。在 Windows 上放行 41451 和 41453 端口之后再回 Ubuntu 用nc -zv测一下通不通通了再跑 Wrapper。5.3 传感器数据有但内容不对点云有数据但明显漂移或错位优先看坐标系设置。在 rviz 里把Fixed Frame改成world或map试试有时候点云话题默认的 frame 和你设的Fixed Frame不一致看起来就像“乱飞”。图像话题如果是黑白噪点检查相机CaptureSettings里的ImageType0是场景相机1是深度相机2是分割相机3是表面法线。连错类型就会得到奇怪的图像。IMU 数据异常时看一下单位。AirSim 的加速度单位是 m/s^2角速度是 rad/s如果你在后续计算时假设成了 g 或者 deg/s那结果肯定不对。5.4 版本不匹配的坑AirSim 的 ROS Wrapper 跟随主分支更新但如果你用的是某个 release tag里面的代码可能和当前 ROS 版本不兼容。比如较老版本只支持 ROS Melodic新版本才全面支持 Noetic。如果不确定可以把 AirSim 仓库切到较新的 release比如v1.8.1再复制ros目录。还有一个容易被忽略的问题ROS 环境里的PYTHONPATH可能会干扰 AirSim Python 客户端。如果你之前装过 AnacondaPYTHONPATH指向的是 conda 的 Python 3.8而 ROS Noetic 用的是系统 Python 3.8理论上没问题但一旦版本差很多就会在导入消息定义时出现ModuleNotFoundError。这种情况建议在运行 roslaunch 前 unset 掉无关的PYTHONPATH。6. 进阶玩法与个人体会Wrapper 装好之后可以玩的方向就很多了。我这边实际验证过的组合是“AirSim Wrapper cartographer 建图”和“AirSim Wrapper move_base 导航”都能在仿真环境里跑通。这意味着你在真实机器人上积累的代码几乎可以无缝迁移到 AirSim 里做批量化测试。比如你想在 100 种不同地形下测试导航算法用真实机器人得搭 100 次场地在 AirSim 里只需要切换地图就行。6.1 把 Wrapper 接进你的算法流程我推荐的最小可用链路是这样的启动 AirSim启动 Wrapper启动你的算法节点录一个 rosbag。ROS 的rosbag record是仿真调试里非常好用的工具你可以一次性把图像、点云、IMU、里程计都录下来之后离线重放算法迭代时不需要每次都打开模拟器。命令大概是rosbag record -O sim_data.bag \ /airsim_node/odom \ /airsim_node/imu/imu_data \ /airsim_node/Drone1/lidar/LidarSensor1/point_cloud \ /airsim_node/Drone1/camera_0/image_raw录完包之后就可以关掉 AirSim靠 rosbag play 重放数据算法节点照常运行对排查问题特别方便。如果你要接深度学习或者强化学习可以在 ROS 节点里通过cv_bridge把图像转成 OpenCV 格式再喂给 PyTorch/TensorFlow。这里一个小技巧为了保持仿真和实机的一致性图像分辨率、相机内参最好固定下来不要频繁改动 settings.json。否则你在仿真里调的算法参数到实机上可能全废。6.2 关于“先装再调”顺序的建议我个人在新环境里装 Wrapper 的顺序是先装 ROS 基础环境再装编译依赖接着拉源码、建 workspace、编译最后配 AirSim 的 settings.json 和网络。这个顺序很常规但有三个细节值得强调。第一ROS 基础环境安装时尽量一次性装desktop-full不要为了省空间只装ros-base。Wapper 的消息依赖涉及可视化、tf、rviz 等组件半套基础环境会在后续调试时不断缺包。第二settings.json 一定要在启动 AirSim 前准备好。AirSim 启动时读取配置如果你先启动了模拟器再改配置得重启才生效。第三双机方案里AirSim 启动顺序在 Wrapper 之前没毛病但 Wrapper 启动时 AirSim 如果还没进入主场景有时会出现连接成功但数据不刷新的假象这时候重新启动一次 Wrapper 节点就好不用重启 AirSim。6.3 一点个人体会AirSim ROS Wrapper 这类工具看起来只是安装一个包但真正花时间的是理解它背后的数据链路。我见过不少人卡在“连不上”“没数据”这些问题上其实大多不是工具的问题而是环境细节没对齐。花点时间把版本、端口、传感器配置这些基础打牢后面做算法验证会顺很多。最后分享一个我的习惯每次在干净环境装完这种偏底层的 ROS 工具我都会顺手写一个“安装记录”文档把用到的版本号、命令、踩过的坑都记下来。这看起来有点繁琐但下次换机器重装时能省一整天时间。AirSim Wrapper 本身更新也算勤快今后如果官方改了接口翻一翻自己的记录也会更容易定位问题。希望这篇文章能让你少踩几个坑装完直接起飞。
返回列表