马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
多旋翼飞行器的控制分配
across
误入工科的编程渣 微信公众号 across说
1、什么是控制分配? 对于多旋翼飞控,一般而言将整个控制回路进行分层设计,比如位置控制、速度控制、姿态控制等,而控制分配则负责将上层控制器得到的输出(滚转、俯仰、偏航的力矩),映射到执行机构,即电机,进行转速输出。简单来讲,如下所示:
2、控制分配有什么好处? Ø 单独设计控制分配,可以将底层控制与上层控制进行分离,便于控制器的设计; Ø 能够防止电机输出饱和,具体后面会讲到; Ø 能够提升对故障或损伤的鲁棒性,简单来说,例如断桨保护等功能的设计,这部分比较复杂,本文不会讲到;
3、为什么要单独讲解控制分配? 控制分配在工程应用时很容易忽略到,相信设计过飞控软件的人有所体会,这部分内容不会特别关注,电机输出就是简单控制量的加减。这样做也是可以的,能够实现功能,但是不够好,细节部分需要进行优化处理,笔者认为这部分既重要,又容易被忽视,当控制器性能不好时,一味的进行调参是解决不了问题的。
4、下面以工程代码为例,一步步进行逻辑推演讲解: 先看一组最简单的
control_roll、control_pitch、control_yaw为姿态控制器所得的结果,分别代表三个轴向的控制量,这里和油门值直接进行混控,得到每个电机的输出值。
看到这里,相信有些读者对如何确定代码中控制量的正负有疑问? 最粗暴的办法就是:直接试凑,定个符号,然后看实际的电机反馈。当然,这个太low了,我们从理论推演下。 首先需要确定飞行器的机体坐标系,假设以滚转控制量为例,我们认为滚转角roll是左负右正,这样的话,假设往右打杆,目标设定是正,反馈为0 ,产生的控制量为正,这时候2、3电机加上这个正向控制量,1、4减去这个正向控制量,即飞行器往右飞行。同理可得其他方向的符号。 注意下,偏航控制量的符号与电机的顺时针逆时针有关。
这种简单混控的问题? 首先是油门没有限幅,假设遥控器油门通道输出范围在1000~2000,电机接收的范围在1000~2000,如果飞行过程中油门推到最大,则所有的电机用来响应油门通道了,此时,不管你飞行器的姿态控制量分别是多少,都无法响应,这样会导致飞行器不能保持姿态稳定。
改进一
这里将油门通道的值进行比例缩放,电机最多响应70%油门,剩余的30%电机量用来响应姿态控制器的输出,保证控制器的响应裕度。
如何加入飞行器的怠速? 改进二
如图所示,只需在每个电机输出上恒定加入一个转速值,该值就是怠速,一般在行程的10%,如设0,则没有怠速。另外,油门通道的比例也要做一个微调。
写到这里,这是目前市面上很多开源飞控的控制分配写法了,需要注意的是: Ø 合理分配油门通道的响应,姿态控制输出的裕度; Ø 姿态控制器的输出限幅,要定一个合理的范围,过大过小都没有意义;
这种控制分配有哪些问题? 首先,就是控制器的输出限幅,这个很难确定一个合理范围; 其次,油门最低时,如果执行外八/内八加锁操作,飞行器易翻机,电机输出用来最大响应yaw控制量,直观现象就是对角的电机转速差异很大,甚至有电机停转; 再者,极端情况下,比如三个轴向的控制量都很大,生成的电机输出超过了最大值,比如得到2200,做不到优先保证姿态控制量的响应;这种情况需要降油门或者缩放姿态控制量,保证输出在范围内。 还有一些细节问题与其有关。 比如只打yaw杆,理论上飞行器应该绕轴旋转,但实际很多都是画圈飞行,当然这个主要问题在于姿态控制,但是也与控制分配有关,如果打杆速度很快,yaw产生的控制量很大,roll和pitch方向上没有充分的裕度进行响应。
推广到六轴或八轴,如其中一个电机不转,能否平稳飞行? 答案是这种控制分配方法更易出问题,简答理解就是,有一个电机停转,那分配到其他电机的转速是增大的,这样很容易电机饱和。当然,如果本身电机输出没到饱和状态,也是可以继续稳定飞行的。
总结一下: 一个好的控制分配算法至少要能解决: 油门控制量过大过小时,能够有充分的姿态控制裕度,这样才能保证飞行稳定; 简单来说,要能够根据电机输出的大小,能够进行油门量的增大减少,同时对姿态控制量进行缩放。
以pixhawk的控制分配算法mixer为例: 算法步骤: 先不考虑yaw控制量,只融合roll、pitch和油门。得到电机输出的最大最小值。
插入一个知识点: 代码里的_roll_scale变量,是根据飞行器的几何构型得到的,以四轴X字型为例
同理计算picth_scale和yaw_scale。 然后根据电机的最大最小输出,计算姿态缩放值roll_pitch_scale和油门量的变化值boost。
油门和姿态进行混控后,加入yaw,再次进行计算。
如果加入yaw后,电机输出饱和,对yaw进行缩放。
最后加入缩放后的yaw和怠速,得到最终的电机输出。
这里就不对代码进行公示推导了,掌握主要思路即可。
|