无人机遥控器控制信号获取
控制无人机首先要考虑的是给无人机下指令,其次是让其从当前状态达到我们的指令状态。遥控器和飞控的沟通是首先要构建的一环。需要把遥控器的脉冲宽度转化成无人机的状态角度。
我使用航模通用协议有PWM、PPM与SBUS,我使用基于串口的SBUS协议,根据帧排序解析25个8bit字节即可,SBUS协议在串口解析前要对信号电平进行反向。
接收过来的接收机信号是遥控器各个通道值,比如大多数航模遥控器遵循通道一到通道四对应着无人机的 roll、pitch、throttle、yaw,即是横滚、俯仰、油门和偏航四个无人机的基本操作数值。后面的通道可以应用于飞控功能的切换或者为无人机的相机云台等外设服务。解析出的具体数值是遥控器的发射信号的设置决定的,可以通过更改遥控信号的参数将其设置到一个需要的区间,然后在解析后进行处理。
我的处理方式是每个通道都处理到1000 到 2000 之间,遵循大多数无人机飞控对脉宽处理的协议方便信号的应用。经过处理信号归入 1000-2000 的区间,中值为 1500,后面需对通道值进行归一化处理,即将通道的控制值转化为控制量的占比看,比如 1000 为 0,1500 为 50%,2000 为 100%,此值也为受控量的占比,然后用这个值去确定受控受控量,这样处理就能实现两种不同元素数据的归一化。经过转化处理后可得出占比值,对于使用者来说,对四旋翼的操作体现在给它设定一个姿态值。接下来我们需给定无人机 roll、pitch、yaw 这几种自由度的目标值,具体做法是设定一个允许的最大值 ,然后令其乘以之前得到的占比值。至此由接收机SBUS信号转化得到目标角度。
控制信号归一化的C语言实现
在每个通道区间1000 到 2000 之间的情况下(1000为0油门,2000位满油门)
parameter :最低和最高值的中值为初始值,rc_get为与初始值的偏差,此处为1500。将偏差转换为期望角度是我们需要做的事,max_abs为区间的一半此处为500,dead_limit为死区,低于此死区不处理,可能是手抖碰到了一点摇杆。
return: proportion 为一个比例值,占允许的最大的角度值的比例。
float rc_convert (float rc_get, float max_abs, float dead_limit)
{
float proportion;
if (rc_get > dead_limit)
{
proportion = (rc_get - dead_limit)/ (max_abs - dead_limit);
}
else if (rc_get < -dead_limit)
{
proportion = (rc_get + dead_limit)/ (max_abs + dead_limit);
}
else proportion = 0;
return proportion;
}
//eg: PID[roll_angle].Target = ANGLE_MAX * rc_convert ( CH_get[roll_ctrl]-RC_MID, MAX_ABS, DEAD_LIMIT);