5.24:匿名凌霄飞控代码解读Drv_AnoOf.c和LX_FC_EXT_Sensor.c
注意:两部分的代码结合读,先看懂AnoOf.c然后再看对光流数据处理的文件Sensor.c
1.Drv_AnoOf.c:串口接收光流模块的数据帧
(1)本文件的功能是处理光流的数据帧,从串口利用函数一个字节一个字节的接收数据帧直到一整个帧接收完成为止。
(2)对照光流手册:首先了解数据帧的格式(帧头什么的)
(3)下面以一个函数为例:获取光流信息输出帧为例:
void AnoOF_GetOneByte(uint8_t data)
(1)
rxstate//对应数据帧的七个部分:帧头,目标地址……附加校验
(2)数据内容,有数据长度个数据
else if (rxstate == 4 && _data_len > 0)//这里的数据内容的个数可能不只有一个,一个一个的存到数据里面去,存完了才开始接收下一帧部分(和校验)
{
_data_len--;
_datatemp[4 + _data_cnt++] = data;
if (_data_len == 0)
rxstate = 5;
}
(3)判断数据长度是否正确这一部分代码暂时未看需要的时候再看
u8 check_sum1 = 0, check_sum2 = 0;
if (*(data + 3) != (len - 6)) //判断数据长度是否正确
return;
for (u8 i = 0; i < len - 2; i++)
{
check_sum1 += *(data + i);
check_sum2 += check_sum1;
}
if ((check_sum1 != *(data + len - 2)) || (check_sum2 != *(data + len - 1))) //判断sum校验
return;
(5)接收到的数据存到结构体变量里面去
if (*(data + 2) == 0X51) //光流信息
{
if (*(data + 4) == 0) //原始光流信息
{
ano_of.of0_sta = *(data + 5);//状态信息
ano_of.of0_dx = *(data + 6);//为机体坐标系x轴对地的速度
ano_of.of0_dy = *(data + 7);//y轴
ano_of.of_quality = *(data + 8);//数据的质量(准确度)
}
//进行了解耦数据较为准确
else if (*(data + 4) == 1) //高度融合后光流信息
{
ano_of.of1_sta = *(data + 5);
ano_of.of1_dx = *((s16 *)(data + 6));
ano_of.of1_dy = *((s16 *)(data + 8));
ano_of.of_quality = *(data + 10);
//
check_time_ms[1] = 0;
ano_of.of_update_cnt++;
}
//进行了姿态融合数据更加准确
else if (*(data + 4) == 2) //惯导融合后光流信息
{
ano_of.of2_sta = *(data + 5);
ano_of.of2_dx = *((s16 *)(data + 6));
ano_of.of2_dy = *((s16 *)(data + 8));
ano_of.of2_dx_fix = *((s16 *)(data + 10));
ano_of.of2_dy_fix = *((s16 *)(data + 12));
ano_of.intergral_x = *((s16 *)(data + 14));
ano_of.intergral_y = *((s16 *)(data + 16));
ano_of.of_quality = *(data + 18);
//
}
}
2.LX_FC_EXT_Sensor.c:凌霄飞控外置传感器处理
(1)//和数传文件有关,该模块的代码还暂时没看后面有需要再看
//触发发送
dt.fun[0x33].WTS = 1;
(2)只有两个静态函数:速度处理的函数,距离处理的函数,为什么没有方向呢???
static inline void General_Velocity_Data_Handle()
static inline void General_Distance_Data_Handle()
(3)光流的数据帧只有测量距离的这样的帧,也就是说没有测量方向的数据信息(光流没有
测量方向的功能),后面要结合openmv来实现定位,再来完善下面两个数据???(暂时不确定,初步猜测)
ext_sens.gen_dis.st_data.direction = 0;
ext_sens.gen_dis.st_data.angle_100 = 270;
(4)/*无效为什么要弄成0x8000??*/,为什么没有z轴速度的值????(应该是只有加速度计和陀螺仪的原因吗??)
//不输入z轴速度,将z速度赋值为无效
ext_sens.gen_vel.st_data.hca_velocity_cmps[2] = 0x8000;