[APM]stablize-mode(一)-思路

mode_stabilize

位置:ArduCopter\mode_stabilize.cpp

APM中有非常多的模式,这些模式本质上是作者使用不同控制器组合来达到使用遥控器控制飞行器的目的。

所以目的不同,使用控制器的方法不同,但是控制器本身却是一样的。我们通过最简单的模式自稳模式(mode_stabilize)来感受一下这些控制器是如何根据不同的思路来使用的。

自稳模式的「稳」就是稳定姿态的意思,最直观的体现就是直接推油门飞机也能稳定起飞。所以自稳模式的核心就是「姿态控制器」。

分析控制器前,我们先自己思考几个问题。
这个控制器的输入是什么?谁来提供这个输入?

思路

如果有玩过APM飞机的同学可以联想到实际飞行中的状态。
当我们使用自稳模式时,推油门油门越大转速越快,推动roll和pitch倾斜角变大,回中后roll和pitch回到0度,推动yaw,飞机开始旋转,回中后停止旋转但是并不会回到0度(yaw的0度是正北方向)。而且遥控器给的期望都应该在机体坐标系下。

所以roll和pitch通道输入的是期望角度
yaw通道输入的是期望角速度
油门通道输入的是期望油门值

跟你想象的一样吗?这里有个思路就是,如果你希望遥控保持中位时飞机保持当前状态而不是回到零状态,那么这个通道就应该控制速度。

框架

要实现自稳的目标有哪些问题要解决?

遥控器的输入转变成不同的期望值(遥控器映射)?

是不是有不同的控制器控制角速度和角度?

控制器的期望有了,实际值由谁提供(导航)?

实际值和期望值的误差怎么算?

控制器的输出是什么?

控制器的输出怎么落实到电机(控制分配)?

所以如果我们想写一套自己的飞控代码实现自稳模式,程序至少应该有这种框架结构。

经常有读者朋友问我,感觉飞控无从下手,不知道从哪开始,我的建议通常是先了解框架,因为飞控是个庞大的系统,你其实不需要每个细节都知道,先把飞控的框架能理解,然后针对性的去看代码,会轻松一些。

所以你刚看代码的时候其实不需要直接就看是如何实现的,先看思路,整理框架。

你看Copter::ModeStabilize::run()函数的思路跟我们分析的差不多嘛。

1
2
3
4
5
6
7
8
//得到期望角度
get_pilot_desired_lean_angles(target_roll, target_pitch, aparm.angle_max, aparm.angle_max);
//得到期望角速度
target_yaw_rate = get_pilot_desired_yaw_rate(channel_yaw->get_control_in());
//得到期望油门
pilot_throttle_scaled = get_pilot_desired_throttle(channel_throttle->get_control_in());
//进入控制器
attitude_control->input_euler_angle_roll_pitch_euler_rate_yaw(target_roll, target_pitch, target_yaw_rate);

之后就主要针对控制部分看看作者是如何实现姿态控制的。

欢迎加我的个人微信交流,共同进步。

关注微信公众号【无人机干货铺】,回复【姿态】为您提供stablize的流程图做为参考。

zinghd wechat
期待您的关注
您的赞赏是最大的支持