1. 项目背景与环境搭建
作为一名无人机开发者,我最近在Ubuntu 22.04系统上搭建PX4飞控与ROS2的联合开发环境,记录下整个过程和踩过的坑。这个组合是目前无人机自主导航领域的主流技术栈,PX4提供底层飞控能力,ROS2负责上层算法和决策,Ubuntu 22.04则是稳定的开发平台。
1.1 系统准备与基础依赖
首先需要一台安装Ubuntu 22.04的电脑或虚拟机。实测物理机性能更好,特别是需要运行Gazebo仿真时。我的硬件配置是i7-11800H + 32GB内存 + RTX3060显卡,这个配置可以流畅运行多个仿真节点。
安装完成后,第一件事是更新系统:
bash复制sudo apt update && sudo apt upgrade -y
然后安装基础开发工具链:
bash复制sudo apt install -y git cmake python3-pip build-essential
注意:Ubuntu 22.04默认使用Python3,很多PX4工具链依赖Python2,需要特别注意兼容性问题。建议使用Python虚拟环境管理不同版本的依赖。
1.2 PX4开发环境配置
PX4官方推荐使用PX4-Autopilot仓库的最新版本。克隆代码库:
bash复制git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
安装PX4工具链:
bash复制bash ./Tools/setup/ubuntu.sh
这个脚本会自动安装:
- Gazebo仿真环境
- FastRTPS(ROS2与PX4通信的中间件)
- 必要的编译工具链
常见问题:如果遇到"E: Unable to locate package"错误,可能是Ubuntu的软件源配置问题。可以尝试更换为国内镜像源。
2. ROS2安装与配置
2.1 ROS2 Humble安装
Ubuntu 22.04对应ROS2的Humble版本。安装步骤如下:
- 设置locale:
bash复制sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
- 添加ROS2软件源:
bash复制sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
- 安装ROS2基础包:
bash复制sudo apt update
sudo apt install ros-humble-desktop
- 设置环境变量:
bash复制source /opt/ros/humble/setup.bash
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
2.2 ROS2工作空间创建
创建一个新的ROS2工作空间:
bash复制mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
安装常用工具:
bash复制sudo apt install python3-colcon-common-extensions python3-rosdep2
sudo rosdep init
rosdep update
3. PX4与ROS2通信配置
3.1 MicroRTPS桥接安装
PX4与ROS2通过MicroRTPS桥接进行通信。首先需要编译生成桥接代码:
bash复制cd ~/PX4-Autopilot
make px4_sitl rtps
这会生成:
- client端代码:用于PX4
- agent端代码:用于ROS2
3.2 启动通信桥接
- 启动PX4 SITL仿真:
bash复制cd ~/PX4-Autopilot
make px4_sitl_default none_iris
- 在另一个终端启动MicroRTPS agent:
bash复制cd ~/PX4-Autopilot/build/px4_sitl_default/src/modules/micrortps_bridge/micrortps_client/micrortps_agent
./micrortps_agent -t UDP
- 验证通信:
bash复制ros2 topic list
应该能看到PX4发布的主题,如/fmu/out/vehicle_status等。
4. 开发实战:无人机控制节点
4.1 创建ROS2包
在ROS2工作空间创建新包:
bash复制cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake px4_control --dependencies rclcpp geometry_msgs sensor_msgs
4.2 编写控制节点
创建src/px4_control_node.cpp文件:
cpp复制#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/twist_stamped.hpp"
class PX4Control : public rclcpp::Node {
public:
PX4Control() : Node("px4_control") {
cmd_vel_pub_ = this->create_publisher<geometry_msgs::msg::TwistStamped>(
"/fmu/in/vehicle_velocity_setpoint", 10);
timer_ = this->create_wall_timer(
std::chrono::milliseconds(100),
std::bind(&PX4Control::timer_callback, this));
}
private:
void timer_callback() {
auto msg = geometry_msgs::msg::TwistStamped();
msg.header.stamp = this->now();
msg.twist.linear.x = 1.0; // 前进速度1m/s
cmd_vel_pub_->publish(msg);
}
rclcpp::Publisher<geometry_msgs::msg::TwistStamped>::SharedPtr cmd_vel_pub_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char * argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<PX4Control>());
rclcpp::shutdown();
return 0;
}
4.3 编译与运行
修改package.xml和CMakeLists.txt添加依赖后,编译:
bash复制cd ~/ros2_ws
colcon build --packages-select px4_control
source install/setup.bash
运行节点:
bash复制ros2 run px4_control px4_control_node
此时在Gazebo中应该能看到无人机开始向前移动。
5. 常见问题与解决方案
5.1 PX4编译错误
问题:编译PX4时出现"git submodule"相关错误
解决:
bash复制git submodule sync --recursive
git submodule update --init --recursive
5.2 ROS2话题不可见
问题:启动MicroRTPS agent后ROS2 topic list看不到PX4话题
解决:
- 检查PX4参数
RTPS_CONFIG是否正确设置为micrortps_client - 确保agent启动命令正确:
./micrortps_agent -t UDP
5.3 Gazebo黑屏
问题:Gazebo启动后黑屏或无模型
解决:
bash复制sudo apt install gazebo11 libgazebo11-dev
echo "export SVGA_VGPU10=0" >> ~/.bashrc
source ~/.bashrc
5.4 ROS2与PX4时间同步
问题:ROS2和PX4时间不同步导致控制延迟
解决:在PX4启动脚本中添加:
bash复制param set SIM_GZ_USEC 1000
param set SIM_GZ_TIMEOUT 5
6. 性能优化技巧
6.1 提高通信效率
- 修改PX4的
msg/tools/uorb_rtps_message_ids.yaml文件,只包含需要的消息 - 在ROS2端使用
FastDDS的QoS配置优化通信:
xml复制<participant profile_name="px4_participant">
<rtps>
<builtin>
<initialPeersList>
<locator>
<udpv4>
<address>127.0.0.1</address>
</udpv4>
</locator>
</initialPeersList>
</builtin>
</rtps>
</participant>
6.2 仿真加速
- 使用
HEADLESS=1 make px4_sitl_default none_iris启动无界面仿真 - 降低Gazebo物理引擎精度:
bash复制param set SIM_GZ_PHYSICS_ENGINE ode
param set SIM_GZ_MAX_STEP_SIZE 5
6.3 调试工具推荐
rqt_graph:可视化ROS2节点通信ros2 topic echo /topic_name:实时查看话题数据pxh> listener vehicle_status:在PX4控制台查看uORB消息
7. 进阶开发方向
7.1 添加自定义uORB消息
- 在PX4的
msg/目录下创建新消息文件,如MyMessage.msg - 修改
msg/CMakeLists.txt添加新消息 - 重新编译PX4,消息会自动生成到
build/目录 - 在ROS2端使用
rosidl_generator生成对应的消息类型
7.2 多机仿真
- 启动多个PX4实例,指定不同端口:
bash复制make px4_sitl_default none_iris -j8
export PX4_SIM_PORT=14550
make px4_sitl_default none_iris -j8
- 为每个实例启动单独的MicroRTPS agent
7.3 硬件在环测试
- 连接Pixhawk飞控到电脑
- 使用
make px4_fmu-v5_default upload刷写固件 - 启动HITL模式:
bash复制make px4_sitl_default none_iris hitl
在实际开发中,我发现这套环境最耗时的部分是各种依赖的安装和配置。建议使用Docker容器来管理开发环境,可以大幅减少环境配置时间。我常用的Docker镜像已经包含了PX4、ROS2和Gazebo的基础配置,只需要挂载代码目录即可开始开发。