在之前的文章中我们讲了基于PX4 1.12版本讲解了PX4的混动框架,在最新的1.13版本中新加入了动态混控,允许用于自定义复杂的构型。
相关修改说明:https://github.com/PX4/PX4-Autopilot/commit/089c962d9208b3616ba505ab927fa399554035d4
这一篇我们介绍一下PX4的动态混控框架
在QGC的帮助文档中,可以找到动态混控的配置方法:http://docs.px4.io/main/zh/config/actuators.html
动态混控允许用户非常灵活的配置飞行器的动力分配,并配置执行机构各通道参数。
这里不对动态混控的使用做更多的说明,我们简单分析一下其代码结构。
动态分配框架的数据流如下图所示, 由控制层输出的扭矩和推力矢量指令,到控制分配器(ControlAllocator)根据机型的动力分布解算每个控制通道的控制量, 再分解到具体的输出设备输出; 对于手动控制或者相机的控制信号,则不经过控制分配器(ControlAllocator),直接到FunctionProviderBase,分配输出设备和通道。
动态分配器的函数调用时序如下图所示:
分配器的主循环Run函数由控制层输出的扭矩和推力矢量指令的周期信号启动,输出电机和舵机的控制信号后,调用输出设备的Run函数(如PWMOut::Run())。整个时许由uORB的SubscriptionCallback机制调度,实现任务间异步调用执行。
文中图表使用PlanUML绘制,为了简要表达逻辑关系,细节不一定正确合适,需要图表源码自行修改的同学可以在公众号中回复 动态分配 获取图表源码。
文中涉及执行机构驱动和uORB的机制可以参考往期分享:
–
我的微信公众号,文章同步更新,欢迎关注。