图4 光流坐标系
五、LC-302光流模块对外输出数据结构定义
光流模块对外输出的数据结构定义如下:
typedef struct op
tical_flow_data
{
int16_t flow_x_integral; // X像素点累计时间内的累加位移(radians*10000)
// [除以10000乘以高度(mm)后为实际位移
int16_t flow_y_integral; // Y像素点累计时间内的累加位移(radians*10000)
// [除以10000乘以高度(mm)后为实际位移
uint16_t integration_timespan; // 上一次发送光流数据到本次发送的累计时间(us)
uint16_t ground_distance; // 预留。默认为999(0x03E7)
uint8_t valid; // 状态值:0(0x00)为光流数据不可用
//245(0xF5)为光流数据可用
uint8_t version; //版本号
} Upixels_OpticalFlow;
通过串口向飞控发送数据前,光流模块会对数据结构进行封包,实际发送的数据包格式如图6:
| | | |
| | | |
| | |
| 光流数据结构体 | | X像素点累计时间内的累加位移, (radians*10000)
[除以10000乘以高度(mm)后为实际位移(mm)] |
| | |
| | Y像素点累计时间内的累加位移,(radians*10000)
[除以10000乘以高度(mm)后为实际位移(mm)] |
| | |
| | 上一次发送光流数据到本次发送光流数据的累计时间(us) |
| | |
| | |
| | |
| | 状态值:0(0x00)为光流数据不可用,245(0xF5)为光流数据可用 |
| | |
| | | 光流数据结构体(Byte 3~Byte 12)10个字节的异或值 |
| | | |
图 6 数据包协议图
六、光流调试注意事项
1.安装前注意镜头清理,确保镜头无污垢和保护膜遮挡。
2.安装时注意,光流板与地面水平,并与机体(飞控板)垂直,不能有偏角,固定后确保镜头无遮挡,比如连接线与起落架等。
3.若要考虑与加速度计融合,则需确保光流与加速度计物理方向的一致性。
3.当姿态变化较剧烈时应减少光流的比重,并用陀螺仪做好对光流的补偿,并注意光流与陀螺仪同步问题。
4.光流输出有少许毛刺,需要对数据进行低通虑波
5.PID控制上采用位置+速度的双环控制,并要加大i的作用。
6.在自主悬停时才启动光流,飞机起飞与打摇杆时,光流无效。
七、LC-302悬停问题速查小技巧
自主悬停是光流模块支持飞控实现的一种典型功能。也是调试光流需要首先调试的功能,悬停的质量往往直接决定光流与飞控配合质量。调试悬停问题时有如下小技巧。
7.1 完全没有悬停效果,现象与没接光流是一样的。首先应检查板子上电是否正常,硬件线是否连接好,镜头是否被遮挡,如果都没发现问题,再用上位机检查是否有数据输出。
7.2 飞机往某个方向乱飞,漂移更快,像失控的感觉,而没有加光流时反而漂移慢一些。可能是:
7.2.1 镜头安装方向与程序里写的方向不一致;
7.2.2 环境光线明暗变化比较大,比如有闪光灯;
7.2.3 光流镜头下地面上有大片的运动物体,比如在有风时的水面上;
7.2.4 程序中光流控制部分有些数据没清零,比如起飞时与打摇杆后积分量没清零;
7.3 飞机缓慢飘,方向随机,但又比没光流时要好,表现为无操作时,往一个方向飘后,还会往回飘。可能是地面环境纹理太差,比如纯净的木地板、水泥地面、反光大理石地面等,或者是环境光线太暗。
7.4 飞机开始时能够正常悬停,悬停一段时间后开始震荡,可能是:
7.4.1 气压计数据漂移很大,高度严重失真,导致光流数据与该高度相乘后输出值变大,控制超调;
7.4.2 光流与加速度计有融合,可能是温度变化比较大或飞机震动大,导致加速度计漂移严重;
7.5 飞机开始时能够正常悬停,悬停一段时间后开始一直往一个方向漂移,可能是:
7.5.1 程序算法处理上光流的权重是动态的,某些原因导致悬停时间长后,光流权重减弱,无法抑制漂移;
7.5.2 姿态解算的欧拉角由于震动或温度等出现较大误差,时间久后飞机本身姿态倾斜,光流最大输出后也补偿不了该误差;
7.6 飞机一开始就开始震荡,可能是:
7.6.1 PID控制参数太大了;
7.6.2 滤波比较厉害,使得输出数据有延时,造成低频震荡;
7.6.3 输入数据不平滑,PID控制中又有D项,使得飞机高频震荡;
7.6.4飞机的性能变差,比如电机、桨叶磨损,震动大,使得输入数据噪声变大;
7.6.5光流旋转补偿没有做好,尤其是数据同步与限幅;
`