【实战教程】Ubuntu20.04 下 PX4+Gazebo+Mid360+Tare Planner 全流程搭建

【实战教程】Ubuntu20.04 下 PX4+Gazebo+Mid360+Tare Planner 全流程搭建

最近不少小伙伴私信问 PX4 结合 Mid360 激光雷达和 Tare Planner 的环境搭建问题,索性整理了一份保姆级实战教程,基于 Ubuntu20.04 + I7 笔记本环境,从 PX4 源码编译到 Gazebo 仿真、Mid360/IMU 集成,再到 Tare Planner 部署,全程踩坑总结 + 实操指令,新手也能跟着跑通。

一、基础环境:PX4 源码编译与环境配置

1.1 源码下载与分支切换

首先搞定 PX4 核心源码,建议选择 V1.13 版本(稳定性高,适配性好):

# 创建PX4专属目录,克隆源码(--recursive拉取子模块) git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot # 切换到V1.13分支并更新子模块 git checkout -b V1.13 git submodule update --init --recursive

1.2 依赖安装与系统配置

运行 PX4 官方脚本完成环境初始化,过程中所有弹窗提示直接确认即可:

bash ./Tools/setup/ubuntu.sh # 可选:跳过nuttx/仿真工具(按需选择) # bash ./Tools/setup/ubuntu.sh --no-nuttx --no-sim-tools

安装完成后必须重启系统,让依赖生效。

1.3 编译避坑:Python 版本冲突

重启后编译 PX4 SITL+Gazebo,大概率会遇到 empy 包版本问题,按以下步骤解决:

# 卸载冲突包 pip3 uninstall -y empy em cheetah3 Cheetah # 安装兼容版本(3.3.4亲测可用) pip3 install empy==3.3.4 # 验证安装结果 pip3 show empy # 清理旧构建缓存(关键!避免编译残留) cd ~/PX4-Autopilot make clean rm -rf build/px4_sitl_default # 重新编译核心指令 make px4_sitl_default gazebo

二、硬件集成:Mid360 激光雷达 + IMU 配置

2.1 模型文件放置

将 Mid360 和 IMU 的仿真模型文件,放到 PX4 的 Gazebo 模型目录:

PX4-Autopilot/Tools/sitl_gazebo/models/

目录结构参考:

  • models/imu:IMU 仿真模型
  • models/mid360:Livox Mid360 激光雷达仿真模型

cmu的tare planner环境构建,indoor.world导入:

2.2 SDF 文件修改:挂载传感器到 R1_ROVER

编辑PX4-Autopilot/Tools/sitl_gazebo/models/r1_rover/r1_rover.sdf,在 base_link 下添加 IMU 和 Mid360 的挂载配置:

<!-- IMU挂载(200Hz频率) --> <INCLUDE> <URI>model://imu</URI> <POSE>0 0.06 0 0 0 0</POSE> </INCLUDE> <JOINT name="imu_joint" type="fixed"> <CHILD>imu::link</CHILD> <PARENT>r1_rover::base_link</PARENT> <AXIS> <XYZ>0 0 1</XYZ> <LIMIT> <UPPER>0</UPPER> <LOWER>0</LOWER> </LIMIT> </AXIS> </JOINT> <!-- Mid360激光雷达挂载(10Hz频率) --> <INCLUDE> <URI>model://mid360</URI> <POSE>0 0 0 0 30 0</POSE> </INCLUDE> <JOINT name="mid360_joint" type="fixed"> <CHILD>mid360::link</CHILD> <PARENT>r1_rover::base_link</PARENT> <AXIS> <XYZ>0 0 1</XYZ> <LIMIT> <UPPER>0</UPPER> <LOWER>0</LOWER> </LIMIT> </AXIS> </JOINT> <!-- 加载IMU仿真插件 --> <PLUGIN name="gazebo_imu_plugin" filename="libgazebo_imu_plugin.so"> <robotNamespace></robotNamespace> <linkName>rover/imu_link</linkName> </PLUGIN>

2.3 Launch 文件适配:指定仿真环境

修改PX4-Autopilot/launch/mavros_posix_sitl.launch,配置室内仿真世界和车辆模型:

<!-- 核心参数修改 --> <arg name="vehicle" default="r1_rover"/> <arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/indoor.world"/> <arg name="sdf" default="$(find mavlink_sitl_gazebo)/models/$(arg vehicle)/$(arg vehicle).sdf"/> <!-- MAVROS通信配置 --> <arg name="fcu_url" default="udp://:14540@localhost:14557"/>

三、依赖编译:Livox 仿真与 Fast-LIO

完成传感器配置后,编译激光雷达仿真和 SLAM 相关包(基于 px4_ws 工作空间):

cd ~/px4_ws # 编译Livox激光雷达仿真包 catkin build livox_laser_simulation # 编译Fast-LIO(激光SLAM核心) catkin build fast_lio

四、一键运行:PX4+Gazebo+Fast-LIO

4.1 启动 PX4 Gazebo 仿真

cd ~/px4_ws source devel/setup.bash cd src/PX4/PX4-Autopilot # 配置Gazebo环境变量 source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd) export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo # 启动核心仿真 roslaunch px4 mavros_posix_sitl.launch

此时会弹出 Gazebo 界面,能看到 R1_ROVER 搭载 IMU 和 Mid360 的模型,传感器链路正常。

gazebo界面显示:

4.2 启动 Fast-LIO 建图

新开终端,执行:

cd ~/px4_ws source devel/setup.bash roslaunch fast_lio mapping_mid360.launch

打开 RVIZ,订阅/cloud_registered话题,就能看到 Mid360 实时建图结果。如图:

4.3 快速终止仿真(避坑小技巧)

如果 Gazebo 卡死 / 退出不彻底,用以下指令强制清理进程:

killall gzclient killall gzserver

五、地面站配置:QGroundControl 安装

5.1 依赖预处理

Ubuntu 下安装 QGC 前,先解决串口和视频流依赖:

# 添加串口权限 sudo usermod -a -G dialout $USER # 卸载冲突的modemmanager sudo apt-get remove modemmanager -y # 安装视频流依赖 sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y sudo apt install libqt5gui5 libfuse2 -y

执行完后注销并重新登录,让权限生效。

5.2 安装与运行

# 下载最新版QGC AppImage wget https://d176tv9ibo4jno.cloudfront.net/latest/QGroundControl.AppImage # 添加执行权限 chmod +x ./QGroundControl.AppImage # 运行QGC ./QGroundControl.AppImage

首次运行会引导配置单位(建议选公制)、飞行器类型(PX4 Pro),完成后即可连接 PX4 SITL,实时监控车辆状态。

六、Tare Planner 部署:ROS Noetic 环境搭建

Tare Planner 依赖 ROS Noetic,Ubuntu20.04 下一键安装:

# 1. 添加ROS软件源 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' # 2. 添加验证密钥 sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 # 3. 更新软件源 sudo apt update # 4. 安装Noetic完整版(包含所有核心包) sudo apt install ros-noetic-desktop-full # 5. 初始化rosdep(解决依赖必备) sudo rosdep init rosdep update # 若rosdep init报错(网络问题),替换为: # sudo apt install python3-rosdep2 # sudo rosdep2 init # rosdep2 update # 6. 永久激活ROS环境 echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

安装完成后,即可基于 Noetic 环境编译和运行 Tare Planner 相关功能包。

七、常见问题排查

  1. 编译报错 “empy not found”:确认 pip3 安装的 empy 版本为 3.3.4,且清理了 PX4 旧构建缓存;
  2. Gazebo 无 Mid360 模型:检查模型文件路径是否正确,SDF 文件中 URI 是否为model://mid360
  3. QGC 无法连接 PX4:确认 MAVROS 的 fcu_url 端口配置正确,PX4 SITL 是否正常启动;
  4. Fast-LIO 无点云:检查 Mid360 仿真插件是否加载,ROS 话题/livox/lidar是否有数据。

总结

这套流程覆盖了 PX4 仿真环境搭建、Mid360/IMU 硬件集成、Fast-LIO 建图和 QGroundControl 地面站配置,核心是解决编译依赖、模型挂载和环境变量这三个关键点。如果有小伙伴在实操中遇到其他问题,欢迎评论区交流~

参考文档:

Read more

蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)

蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)

比赛环境:网盘资源分享 通过网盘分享的文件:蓝桥杯比赛环境 链接: https://pan.baidu.com/s/1eh85AW-y83ibCmEo8ByBwA?pwd=1234 提取码: 1234 1 常见问题答疑 1.1 蓝桥杯含金量高不高? 说起蓝桥杯,不得不提ACM。 ACM是国际大学生程序设计竞赛(ACM-ICPC),被誉为计算机领域的“奥运会”,是世界上,规模最大、水平最高、最具影响力的国际大学生程序设计竞赛。 ACM难度较高,当然含金量也更高, 那么蓝桥杯的含金量肯定比不过ACM,但是其具有独特的优势。 蓝桥杯难度更低,更易拿奖,同时在计算机行业具有较高认可度。 ACM适合那些智商高或者编程经验丰富(学习算法1年以上)的选手参赛。而蓝桥杯适合小白,适合期望快速获得编程领域一个认可证书而没有太多时间投入的参赛者。 1.2 获奖到底难不难? 蓝桥杯分为省赛和国赛。 省赛时: 与你竞争的是同省的人,所以获奖难度与你所在的省份有一定关系。 强省(

By Ne0inhk
C++效率掌握之STL库:unordered_map && unordered_set底层剖析

C++效率掌握之STL库:unordered_map && unordered_set底层剖析

文章目录 * 1.unordered_map、unordered_set的基本结构 * 2.普通迭代器 * 3.const迭代器 * 4.insert返回值 operator[] * 希望读者们多多三连支持 * 小编会继续更新 * 你们的鼓励就是我前进的动力! 看了前面的底层封装后,其实封装的过程及方法都大差不差,unordered_map && unordered_set 也是如此,所以本篇就简单提及一些细节,具体最详细的一些部分可以去看前面的文章 传送门:C++效率掌握之STL库:list底层剖析及迭代器万字详解 传送门:C++效率掌握之STL库:map && set底层剖析及迭代器万字详解 1.unordered_map、unordered_set的基本结构 🚩unordered_set: template<classK,classV>

By Ne0inhk
C++《set与map》

C++《set与map》

在之前我们已经学习了解了C++STL当中的string和vector等容器,现在我们已经懂得了这些容器提供的接口该如何使用,并且了解了这些容器的底层结构。接下来我们在本篇当中将继续学习STL内的容器set与map,在此这两个容器与我们之前学习的容器提供的成员函数以及底层结构有细微的差异。接下来就开始本篇的学习吧!!! 1.顺序式容器与关联式容器  在了解set与map之前我们要先来了解什么是顺序式容器、什么是关联式容器。 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,比如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。 关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列和unor

By Ne0inhk
C++ 函数重载:规则、实现与实战案例

C++ 函数重载:规则、实现与实战案例

C++ 函数重载:规则、实现与实战案例 💡 学习目标:掌握函数重载的核心规则,能够熟练实现重载函数,并解决实际开发中重载相关的常见问题。 💡 学习重点:函数重载的匹配原则、与默认参数的冲突处理、实战场景中的重载应用。 一、函数重载的定义与核心价值 ✅ 结论:函数重载是 C++ 多态性的基础体现,允许同一作用域内定义多个同名函数,通过参数列表的差异区分调用。 函数重载的核心价值在于: 1. 简化函数命名,避免为功能相似的函数创建不同名称,提升代码可读性 2. 适配不同类型或数量的参数输入,让函数调用更灵活 ⚠️ 注意事项:函数返回值不能作为区分重载函数的依据。 例如以下代码是非法的: #include<iostream>usingnamespace std;// 非法重载:仅返回值不同intadd(int a,int b){return a + b;}doubleadd(int a,int

By Ne0inhk