这里面我觉得很重要的一点就是指出了
如果我们想控制飞行器飞行到一个地方,那么我们就应该去发布position_setpoint_triplet主题,mavlink作为主题的发起者,它可以发布这个主题,那么我们也可以发布,我们的功能模块应该喝mavlink站在同一层上。
你是不能直接发布姿态控制消息的
可以结合这篇博文来看
https://blog.csdn.net/sinat_16643223/article/details/107874349
来源:阿木实验室
在介绍框架之前,首先要说明一点,px4的代码十分庞大,但是本章介绍的侧重点仅仅是功能模块代码,这些代码位于源代码跟路径:/src/modules/
在px4源码中对二次开发比较重要的代码模块有:
commander
ekf2
mavlink
mc_att_control
mc_pos_control
navigator
1.commander
commander模块主要处理一些px4的常用命令,如传感器效准、模式切换、加锁解锁、起飞降落、紧急断电等等的命令。
commander模块的输入topic是vehicle_command。模块会根据不同的命令id将命令分解成其他的topic并发布出去供其他模块响应。如果我们想使用commander模块带来的便利,我们可以在自己的程序代码中直接发布主题:vehicle_command
2.ekf2
ekf2模块主要处理飞控上的传感器数据融合,如gps、加速度计、指南针等等。
ekf2的输入参数都是又px4的硬件驱动模块提供的,我们在进行二次开发的过程中不需要关心具体的topic。
ekf2的输出topic有:
vehicle_attitude
vehicle_local_position
vehicle_global_position
vehicle_attitude:当前飞控的姿态
vehicle_local_position:当前飞控的本地位置,坐标系为ned,以飞控加点第一次得到的点为原点
vehicle_global_position:当前飞控的全球位置
如果我们在自己的代码中有需求,可以直接订阅这三个主题,ekf2保证这些数据的实时更新,我们不需要去关系具体硬件。
3.mavlink
mavlink模块主要处理mavlink通讯,mavlink的输入总是由飞控的数传串口,输出总是将mavlink封包分解后的各个topic。这也是我们分析飞控的重点模块,是在px4中处于最上层的模块之一。
4.mc_att_control
mc_att_control模块是处理姿态控制的模块,所有的上层模块的飞行决策最终都将化为topic vehicle_attitude_setpoint作为mc_att_control模块的输入参数。但是我们自己的代码中请不要直接发布此主题,因为px4中对此主题有完整的响应链,如果我们直接发布期望姿态,那么很可能引起混乱,一定要仔细分析,直到分析道最上层的决策topic。
mc_att_control模块的输出topic有:
actuator_controls_0
当然其他还有另外7个控制topic:
actuator_controls_1
actuator_controls_2
actuator_controls_3
actuator_controls_4
actuator_controls_5
actuator_controls_6
actuator_controls_7
分别代表8个混控器control group,px4中混控器的作用主要是将期望姿态信息roll pitch yaw映射到实际的电机转速或者舵机角度,当然这又是另外一个话题了,这里我们只需要知道actuator_controls_0就是mc_att_control模块的最终输出,他的输出在通过混控器之后会实际的改变电机转速或者舵机角度。
5.mc_pos_control
mc_pos_control模块是处理位置控制的模块,位置模块的输出参数永远都是topic vehicle_attitude_setpoint。可以看出,位置控制模块是处于姿态控制模块的上层,他的输出作为了姿态控制模块的输入,到这里,我们就可以清楚,为什么我们不能直接控制发布姿态主题了,如果我们直接发布了姿态topic,那么就很有可能与位置控制发布的姿态topic冲突进而产生飞行器的不稳定。
位置控制模块的输入参数比较特殊,分别是:
manual_control_setpoint
position_setpoint_triplet
manual_control_setpoint是遥控器的当前输入值,比如你的油门打到了100%,那么topic中对应的参数可能就是100
position_setpoint_triplet是期望位置信息(本地坐标系ned),主题来自于其他很多地方,如:
mavlink模块(地面站的控制)
navigator模块(auto模式发起)
到这里我们就可以看出,如果我们想控制飞行器飞行到一个地方,那么我们就应该去发布position_setpoint_triplet主题,mavlink作为主题的发起者,它可以发布这个主题,那么我们也可以发布,我们的功能模块应该喝mavlink站在同一层上。
在看另外一个主题manual_control_setpoint是遥控器的输入,我们可以想象,遥控器已经是最上层的决策了,并且有一点很重要,遥控器是直接控制的飞行器的姿态,而并不是位置信息,所以,在你的程序中如果你想要控制飞行器的姿态,那么应该发布遥控器主题来命令飞行器,而不应该直接发布期望姿态主题。
6. navigator
navigator模块主要掌管飞行器的各种自动飞行模式,比如:
数传丢失的自动处理
跟随模式
进入禁飞区的自动处理
gps故障的自动处理
自动降落
留待模式
自动任务
遥控器丢失自动处理
自动返航
自动起飞
所以navigator的输入参数有非常多的主题,其中最重要的是传感器主题,用于判断当前是否需要紧急机制,第二重要的是来自自动任务的数据,此数据被px4以romfs文件系统保存在一个文件中,记录这从地面站发送的航点任务。
但是不管任务有多么复杂,所有的输入参数,最终都会转化为position_setpoint_triplet为位置控制模块提供输入参数。
注意:navigator发布position_setpoint_triplet时是处于px4的auto模式的,此模式是px4自己的模式我们无权干涉它的正常执行,我们发布position_setpoint_triplet主题时,一定要让px4处于offboard模式,这种模式才是给用户使用的。