1. 为什么你需要一个“武装到牙齿”的仿真无人机?
如果你正在研究无人机视觉导航、自主避障或者SLAM(即时定位与地图构建),那你肯定知道,在真实无人机上直接调试算法有多“肉疼”。炸一次机,轻则耽误半天,重则钱包大出血。所以,一个能模拟真实传感器数据的仿真环境,就成了算法开发者的“练兵场”。
PX4的软件在环仿真(SITL)配合Gazebo,就是这个领域最强大的工具链之一。它能让你在电脑里飞一个虚拟无人机,而且飞控代码和真机一模一样。但默认的仿真模型往往只有基础传感器,比如一个IMU和一个GPS。这就像给你一辆车,但只让你看速度表,不给你装摄像头和雷达,你怎么研究自动驾驶?
所以,今天我要跟你分享的,就是如何给你的PX4仿真无人机“加装”一套豪华传感器套装:一个能提供深度图和点云的双目相机(比如Kinect)、一个能扫描周围环境的2D激光雷达、还有一个专门盯着地面的下视摄像头。这三大件组合起来,基本上覆盖了无人机感知环境的“看前”、“看周”和“看下”三个核心维度。配置好之后,你就能在ROS里实时看到这些传感器吐出来的数据流,无论是做视觉里程计、障碍物检测还是精准降落,都有了即插即用的验证平台。我自己在开发视觉避障算法时,这套环境帮我省下了无数个调试的日夜,实测下来非常稳。
2. 动手之前:理清思路与备好“弹药”
在开始敲命令之前,咱们先花几分钟把整个流程的逻辑理顺。这能帮你避开很多后面可能遇到的坑。PX4 SITL仿真环境的核心是模型(Model)和启动(Launch) 文件。我们的目标可以分解为三步:
- 创建独立的传感器模型:为激光雷达、双目相机、下视摄像头分别创建Gazebo能识别的SDF模型文件。这就像为你的无人机采购三个独立的硬件模块。
- 组装“超级无人机”模型:创建一个新的无人机模型文件(比如叫
iris_fusion),把基础的Iris机架和我们新建的三个传感器模型,用“关节”固定在一起。这就好比把买来的传感器焊接到无人机机架上。 - 配置启动流程:告诉PX4和Gazebo,启动时不要用默认的
iris模型,而是用我们组装好的iris_fusion模型。
这里有个关键点:所有模型文件都必须放在PX4-Autopilot源码树内特定的目录下,Gazebo才能找到它们。通常路径是~/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/。我强烈建议你不要随意更改这个路径,不然Gazebo会报一堆找不到模型的错误。
你需要准备好以下“弹药”:
- 一个Ubuntu系统(20.04或22.04比较稳妥),并且已经按照官方指南成功安装和编译了PX4-Autopilot。如果你还没走到这一步,先去PX4官网把基础环境搭好。
- ROS(推荐Noetic或Humble),并且安装了
gazebo_ros_pkgs等相关包。这是传感器数据通往ROS的桥梁。 - 一个顺手的文本编辑器,比如
nano、vim或者VSCode。
好了,思路清晰,工具就位,咱们正式开始“组装”!
3. 第一步:创建三个传感器的Gazebo模型
这一步是为每个传感器“建模”,定义它的外观、物理属性,以及最重要的——它如何发布数据到ROS。我们一个一个来。
3.1 搭建模型文件的“家”
首先,为每个传感器创建一个专属的文件夹。打开终端,执行以下命令:
mkdir -p ~/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/iris_fusion
mkdir -p ~/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/kinect_self
mkdir -p ~/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/rplidar
mkdir -p ~/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/fpv_cam
-p参数能确保如果父目录不存在,它会一并创建。创建好后,每个文件夹里通常需要两个文件:一个.sdf文件(定义模型主体),一个model.config文件(模型的元信息,如名称和描述)。
3.2 打造双目相机(Kinect)模型
双目相机,或者说深度相机,是我们的“眼睛”。它能同时输出彩色图像、深度图像和三维点云,是视觉SLAM和三维重建的利器。我们模拟一个类似Kinect的传感器。
进入kinect_self目录,创建kinect_self.sdf文件:
cd ~/PX4-Autopilot/Tools/simulation/gazebo-classic/sitl_gazebo-classic/models/kinect_self
nano kinect_self.sdf
将以下内容粘贴进去。我解释几个关键部分:
<sensor type="depth">:这声明了这是一个深度相机传感器。<plugin name="camera_plugin" filename="libgazebo_ros_openni_kinect.so">:这是核心!这个Gazebo插件负责将仿真数据转换成ROS话题。libgazebo_ros_openni_kinect.so是ROS提供的标准插件,能同时发布彩色图、深度图、相机信息和点云。<baseline>0.2</baseline>:这是双目相机的基线长度(单位:米),影响深度计算。你可以根据你想模拟的相机型号调整。<cameraName>camera_ir</cameraName>:定义了相机名称,会用作ROS话题的前缀。<frameName>camera_link</frameName>:定义了该传感器数据所在的TF坐标系。后续在无人机上安装时,需要确保这个坐标系被正确连接到无人机本体坐标系。
<?xml version="1.0" ?>
<sdf version="1.5">
<model name="kinect_self">
<pose>0 0 0 0 0 0</pose>
<link name="link">
<inertial>
<mass>0.01</mass>
<inertia>
<ixx>4.16666666667e-06</ixx>
<iyy>5.20833333333e-07</iyy>
<izz>3.85416666667e-06</izz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>0.023000 0.076000 0.032000</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>0.023000 0.076000 0.032000</size>
</box>
</geometry>
<material>
<script>
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Red</name>
</script>
</material>
</visual>
<sensor type="depth" name="camera">
<always_on>true</always_on>
<update_rate>30.0</update_rate>
<camera>
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<format>B8G8R8</format>
<width>640</width>
<height>480</height>
</image>
<clip>
<near>0.4</near>
<far>16.0</far>
</clip>
</camera>
<plugin name="camera_plugin" filename="libgazebo_ros_openni_kinect.so">
<baseline>0.2</baseline>
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>camera_ir</cameraName>
<imageTopicName>/camera/color/image_raw</imageTopicName>
<cameraInfoTopic


382

被折叠的 条评论
为什么被折叠?



