在玩无人机的这段时间,有遇到过这样一个问题:高空飞行的无人机控制低飞无人机至目的地。
我们花了挺长一段时间去一一解决中间所存在的很多问题。最后编程出来了,但由于一些原因并没有实际的操作飞行过。
写个笔记,希望能够帮助到有需要的朋友吧。
我们将红色的卡纸放至1m高,垂直于地面上同样大小的蓝色卡纸上方。将无人机放至2m处拍摄了这张照片。由于视差,图像中看到的两张卡纸并没有重合。所以,如果只是单纯的将看到的低飞无人机控制到目的地,它并不是垂直的。
那么做如下变换:
如图,“从机在图像的投影点”就是上图中看到的红色卡纸,卡纸边框的光线沿直线传播投影到地面上,所以看到的红色卡纸大小比蓝色卡纸大。也就是说“从机在图像的投影点”是直接从图像得到的,变相的代表了从机的位置。
我们的目的是将从机控制到“实际目的地”的上方。这时候主机看到的从机位置应在“虚拟目的地”处。那么问题就简化成了:将“从机在图像中的投影点”与“虚拟目的地”重合(可以先控制x轴重合,再控制y轴重合)。
接下来就是计算问题了:“从机在图像中的投影点”坐标、“实际目的地”坐标、两台无人机的飞行高度都是已知的,只需要根据上图的相似性原理计算出“虚拟目的地”坐标即可。
在编程过程中,刚开始觉得需要“虚拟目的地”与“实际目的地”的角度来判断加减。但后来发现不用,直接上代码吧。就是简单的相似性原理。
#Real_POINTx, Real_POINTy为实际目的地坐标
#80、60为图像中点(图像大小为 160*120)
#返回虚拟目的地坐标
def virtual_point(Real_POINTx, Real_POINTy):
# 定义比值 = 主机高度 / 从机高度
k = 2
deltax = (Real_POINTx - 80) // (k - 1)
deltay = (Real_POINTy - 60) // (k - 1)
virtual_POINTx = deltax + Real_POINTx
virtual_POINTy = deltay + Real_POINTy
return virtual_POINTx, virtual_POINTy
现在万事具备了,那么如何得到从机坐标与实际目的地坐标呢?得到坐标的主机又如何把信息传递给从机呢?从机得到坐标又如何控制呢?哈。哈。哈。
对应链接:
控制从机至目的地(待更新。。。)