无人机光流定点
光流是测速算法,并不是直接定位的。简单理解,光流就是通过检测图像中光点和暗点的移动,来判断图像中像素点相对于飞行器的移动速度。如果地面是静止的,自然就可以得到飞行器相对于地面的移动速度啦。所谓光流定位,其实是利用光流测速再积分定位而已啦。
无人机做光流定点算法需要注意一下几点:
1、飞机在不同高度光流传感器所能测到的像素点是不一样的,无人机距离地面低的时候对距离的感知比距离地面高的时候要强,所以一般无人机光流定点都会跟一个测距传感器一起使用。
2、无人机发生倾斜的时候光流传感器也会有位移变化输出
3、光流传感器安装若不在无人机的中心位置则无人机发生倾斜时光流感知的位移是会有不一样的,这个也需要做一定的补偿。
下面我们根据程序代码进行光流数据的处理:
opFlow.pixSum[X] += pixelDx;
opFlow.pixSum[Y] += pixelDy;
光流相当于速度信息,对其积分得到位移信息。
float coeff = RESOLUTION * height;//采样无人机距离地面的高度
float tanRoll = tanf(state->attitude.roll * DEG2RAD);
float tanPitch = tanf(state->attitude.pitch * DEG2RAD);
//记录无人机进行俯仰横滚的偏移量,后面用作偏移量补偿
opFlow.pixComp[X] = 480.f * tanPitch;
opFlow.pixComp[Y] = 480.f * tanRoll;
//俯仰横滚的偏移量补偿
opFlow.pixValid[X] = (opFlow.pixSum[X] + opFlow.pixComp[X]);
opFlow.pixValid[Y] = (opFlow.pixSum[Y] + opFlow.pixComp[Y]);
if(height < 0.05f)
{
coeff = 0.0f;
}
opFlow.deltaPos[X] = coeff * (opFlow.pixValid[X] - opFlow.pixValidLast[X]);
opFlow.deltaPos[Y] = coeff * (opFlow.pixValid[Y] - opFlow.pixValidLast[Y]);
//不同高度转化其像素点使无人机真正的位移在不同高度近似相等
opFlow.pixValidLast[X] = opFlow.pixValid[X];
opFlow.pixValidLast[Y] = opFlow.pixValid[Y];
opFlow.deltaVel[X] = opFlow.deltaPos[X] / dt;
opFlow.deltaVel[Y] = opFlow.deltaPos[Y] / dt;
//计算无人机的速度
以上是对光流数据进行的处理,得到的速度值,位移值就可以进行下一步的融合运算了,一般来说,不同质量的光流传感器实际上很难做到真正的像素点跟实际位移的一一对应的,多少会有误差
比如不同环境的误差:光流传感器在纹理清晰的地面进行识别跟光滑的地面进行识别是由很大的差距的,这个要跟实际情况去调整参数。
融合部分跟我前面的博客原理是一样的,可以参考一下https://blog.youkuaiyun.com/u014694105/article/details/98983930。另附一张自己的光流定点照片,定点效果还可以,没办法附上视频请见谅。
生活照有点乱