# Music-Drone-225
**Repository Path**: st0726/music-drone-225
## Basic Information
- **Project Name**: Music-Drone-225
- **Description**: 基于ROS2的PX4四旋翼控制框架
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 2
- **Created**: 2025-07-03
- **Last Updated**: 2025-07-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Music-Drone-225
参照[1]中Fast-Drone-250的基于ROS1的PX4控制框架,针对ROS2开发与PX4对接的控制框架,最大的好处是在上位机(机载电脑)可实现对电机油门的直接控制,降低仿真与实际的差距和针对新构型飞机的控制开发难度。
**此控制框架有三种模式:实际飞行、带控仿真、调参**。控制框架已在四旋翼上进行实飞验证,四旋翼由自己搭建(如下图),控制算法参考文献[2]。
跟踪轨迹为8字轨迹(最高速度为2m/s),位置曲线如下图所示,跟踪结果良好,目前未出现电机控制延迟而导致的控制失效问题。
**注:**
1. 实际飞行需要增加PX4中EKF2的采样频率,目前可最大增加到400HZ,即上位机发布电机油门频率不会超过400HZ。
2. Linux系统:Ubuntu 20.04
ROS2版本:Foxy
PX4版本:1.15.0-1.15.3
3. 从ROS2发布电机控制指令到电机实际起转之间的**平均延迟在2.6ms左右,最大为3.8ms**(转速使用自研传感器测量,传感器通信延迟已证实<1ms)
## 前期准备
1. 安装ROS2
```bash
wget http://fishros.com/install -O fishros && . fishros
```
2. 升级Cmake
+ 系统自带Cmake所3.16,版本太低不适合后续其他库的安装,这里升级为3.20,参照这里安装https://zhuanlan.zhihu.com/p/519732843
+ 最后需要移动cmake文件
```bash
sudo mv ./cmake-3.20.0 /usr/local/share/cmake-3.20
```
2. 安装OSQP求解器
```bash
git clone https://github.com/osqp/osqp
cd osqp
mkdir build
cd build
cmake -G "Unix Makefiles" ..
cmake --build .
cmake --build . --target install
sudo ldconfig
```
2. 安装qpOASES求解器
```bash
git clone https://github.com/coin-or/qpOASES.git # 在任意文件夹下就行
cd qpOASES
mkdir build
cd build
cmake ..
sudo make
sudo make install
```
2. 安装Eigen库
```bash
sudo apt-get install libeigen3-dev
```
调整:默认安装路径为`/usr/include/eigen3`,进入到安装目录下`cd /usr/include/eigen3`,执行复制命令,将Eigen文件夹放在/usr/include 下面`sudo cp Eigen/ .. -R`
2. 下载并配置1.15.3版本PX4代码(纯仿真跳过此步骤)
+ 下载源码
```bash
git clone -b v1.15.3 https://github.com/PX4/PX4-Autopilot.git --recursive
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
cd PX4-Autopilot/
git submodule update --init --recursive
git status #查看哪个子模块没下载好,删了那个没下载好的目录重新git submodule
```
+ 切换版本(针对已下载源码但版本较低的用户)
```bash
git describe --tags # 查看当前版本
git tag # 查看可以选择的版本
git checkout v1.15.3 # 比如此处选择 v1.15.3 版本
git submodule sync --recursive
git submodule update --init --recursive
```
+ 修改话题XRCE-DDS发布频率:
在PX4源码`/PX4-Autopilot/src/modules/uxrce_dds_client/dds_topics.h.em`文件中,修改
```c++
#define UXRCE_DEFAULT_POLL_RATE 1 //数字代表所有话题最大发布周期ms,写1表示按最大频率发布,实际与EKF2的采样频率有关
```
+ 编译烧录
```bash
make px4_fmu-v6c_default upload # Pixhawk 6C mini
make matek_h743-slim upload # Matek H743-slim V3
```
+ 在QGC中按照下一节修改参数才能获得最高频率
6. 安装Micro XRCE-DDS 代理(纯仿真跳过此步骤)
需要CMAKE版本3.20以上
```bash
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig /usr/local/lib/
```
3. 配置PX4飞控和机载电脑的连接(纯仿真跳过此步骤)
+ 这里有设置方式:https://blog.csdn.net/Zecet/article/details/130567392,波特率设置为最高3000000
+ 插入飞控,设置串口权限`sudo chmod 777 /dev/ttyUSB0`
+ 在ubuntu中启动代理`MicroXRCEAgent serial -D /dev/ttyUSB0 -b 3000000`,看是否有话题成功发布标志
## 实际飞行
1. 设置飞机参数
**基本参数**
| parameters | value | meaning |
| --------------- | ----------------------- | ------------------------------------------------------------ |
| CBRK_SUPPLY_CHK | 894281 | 关闭电源检测 |
| CBRK_USB_CHK | 197848 | 关闭USB检查:USB连接下也可以解锁 |
| CBRK_IO_SAFETY | 22027 | 禁用安全开关:不用安全开关也可解锁 |
| PWM_AUX_TIM1 | Dshot600 | 将电调信号改为dshot,响应更快 |
| MPC_THR_HOVER | 30% | 设置悬停油门的大小,(默认值是0.5,请在默认值下,手动飞行后设置该值) |
| MPC_THR_CURVE | Rescale to hover thrust | 将中位油门映射到悬停油门 使得手动与定点切换平滑 |
| THR_MDL_FAC | 0.6 | pwm和推力输出的拟合系数(默认值为0.3,5寸桨应该在0.5左右)
`rel_thrust = ( THR_MDL_FAC ) * rel_signal^2 + ( 1 - THR_MDL_FAC ) * rel_signal` |
**EKF2**
| parameters | value | meaning |
| ---------------- | ------------------- | ------------------------------------------------ |
| IMU_INTEG_RATE | 400 Hz | IMU采样频率,影响ekf2频率 |
| IMU_GYRO_RATEMAX | 400 Hz | 陀螺仪频率,超过IMU_INTEG_RATE会导致ekf2频率下降 |
| EKF2_HGT_REF | Barometric pressure | ekf2高度来源:气压计 |
**通信**
| parameters | value | meaning |
| ------------- | ----------- | -------------------------- |
| UXRCE_DDS_CFG | TLELEM1 | 与机载电脑通信串口 |
| SER_TEL1_BAUD | 3000000 8N1 | 通信波特率,拉到最高 |
| MAV_0_CONFIG | TELEM2 | 数传接口 |
| SER_TEL2_BAUD | 921600 8N1 | 通信波特率,和数传设置有关 |
**飞行**
| parameters | value | meaning |
| ---------------- | ----- | ---------------- |
| COM_DISARM_PRFLT | -1 | 起飞超时锁定去除 |
| COM_DISARM_LAND | -1 | 着陆超时去除 |
**RC**
| parameters | value | meaning |
| ----------- | --------- | --------------------- |
| RC_MAP_AUX1 | Channel 5 | 摇杆映射(topic输出) |
| RC_MAP_AUX2 | Channel 6 | |
| RC_MAP_AUX3 | Channel 7 | |
| RC_MAP_AUX4 | Channel 8 | |
1. 在QGC中设置遥控器如下
| 遥控器通道 | topic中的映射 | 功能 | 在QGC中的设置DOWN | 在QGC中的设置UP/MIDDLE |
| ---------- | ------------- | --------------------------- | ----------------- | ---------------------- |
| SA | AUX1 | 切换手动飞行模式(ON->OFF) | Stablize飞行模式 | 未知 |
| SB | AUX2 | 切换悬停、CMD模式 | 未知 | 未知 |
| SC | AUX3 | 解锁/上锁 | DISARM | ARM |
| SD | AUX4 | 即停开关 | KILL | NO KILL |
2. 启动代理连接PX4
```bash
MicroXRCEAgent serial -D /dev/ttyUSB0 -b 3000000 # 这里根据自己端口号设置
```
3. 运行控制器
```bash
git clone https://gitee.com/music-lab/music-drone-225.git
cd ./Music-Drone-225
colcon build
source install/setup.bash
ros2 launch px4ctrl run_ctrl.launch.py
```
## 带控仿真
仿真中遥控器对飞行模式的切换逻辑和实际飞行一致,在rviz中可感受飞行手感来辅助调参。
1. 连接遥控器
准备RADIOMASTER遥控器,使用USB连接电脑,遥控器弹出模式选择界面选择第一个即可
编译接口源码
```bash
git clone https://gitee.com/music-lab/joystick_ros2_ws.git
cd ./joystick_ros2_ws
colcon build
source install/setup.bash
ros2 run joystick_ros2 joystick_ros2
```
终端出现`Joystick Received!`则表明连接成功
2. 在文件`src/realflight_modules/px4ctrl/include/px4ctrl/input.h`中将`#define SIMULATION`解除注释
3. 运行控制器
```bash
cd ./Music-Drone-225
ros2 launch px4ctrl run_ctrl.launch.py
```
4. 运行Rviz可视化
```bash
ros2 launch odom_visualization run_odom.launch.py
```
#### **仿真模型噪声干扰设置**
在`src/uav_simulator/quadsim/include/quadsim/Quadrotor.h`文件中
```C++
#define ADD_NOISE
```
取消注释即可,这里只对角速度的输出增加高斯噪声(`quadsim_node.cpp`中第61行),读者可以自行在其他地方添加高斯噪声。
## 调参
目前可以针对姿态环中串级PID参数进行调整
1. 在仿真模式下,修改文件`src/realflight_modules/px4ctrl/include/px4ctrl/controller.h`中:
```c++
#define DEBUG_ANGLE //取消注释则可指定期望角度,在controller.cpp文件中99行给定期望角度
#define DEBUG_RATE //取消注释则可指定期望角速度,在controller.cpp文件中115行给定期望角速度
```
2. 重新编译运行
## 期望角速度和归一化推力控制(原ROS1控制框架)
像ROS1一样给出的是期望角速度和归一化推力,角速度环是PID,那么需要自定义控制算法,这里已经拟好了框架,只需将文件`src/realflight_modules/px4ctrl/include/px4ctrl/controller.h`中
```C++
#define CTRL_MY // 自定义控制算法
```
取消注释即可,然后在`controller.cpp`文件中第339和348分别输入自己解算出来的望角速度和归一化推力即可。
第362行是角速度环PID参数和求导,但是对于**角速度导数没有进行低通滤波**,使用者可以自行添加。
## 其他辅助工具
1. ros2bag安装(录制topic话题)
```bash
sudo apt-get install ros-foxy-ros2bag ros-foxy-rosbag2*
sudo apt install -y ros-foxy-rosbag2-bag-v2-plugins ros-foxy-rosbag2-converter-default-plugins ros-foxy-rosbag2-storage ros-foxy-rosbag2-transport ros-foxy-rosbag2-storage-default-plugins ros-foxy-ros2bag
```
2. plotjuggler安装(数据可视化)
```bash
sudo apt install ros-${ROS_DISTRO}-plotjuggler-ros
```
## 参考
[1]https://github.com/ZJU-FAST-Lab/Fast-Drone-250
[2] S. Sun, A. Romero, P. Foehn, E. Kaufmann and D. Scaramuzza, "A Comparative Study of Nonlinear MPC and Differential-Flatness-Based Control for Quadrotor Agile Flight," in IEEE Transactions on Robotics, vol. 38, no. 6, pp. 3357-3373, Dec. 2022, doi: 10.1109/TRO.2022.3177279.