无人机之智能区域执飞

2017/02/28 无人机

我们团队正在参与多旋翼无人植保机的设计开发中,目前我需要处理一个数学问题,首先我们来看看开发需求:

我们通过记录下精灵无人机飞行过程中的每一个GPS点信息,生成飞行轨迹,形成一片扫描区域,该区域将会是植保机的巡航与农药灌溉范围。但是因为精灵无人机的原始飞行轨迹形成的封闭图形是曲边形,我们希望能够通过某种方法将其尽可能的转化为变数尽量少的多边形,并且能够发现凹边形的图案并拒绝执飞,进而在生成执飞路线的时候,能够尽可能覆盖多的面积,并且缩短飞行距离。

问题被转化为:对于一个凸多边形,选定任意一条边做为平行边,生成等间距的边将多边形切割,并返回一系列的飞行点集。

下面讨论一下其中的细节:

算法的基本思路

选定某一条边作为平行边line_a,根据间距生成足够多的平行边。我们知道line_a有两个方向,只有其中一个方向的平行边是我们需要的,判断的依据是是否与其他边有焦点。另一方面,如何判断最远的平行边,那就是将多边形的所有点计算到line_a的距离,其中最大值就是平行边的最远距离。

盲区问题

我们不支持凹多边形的区域,原因是不正确的选边会导致盲区出现,无人机的巡航路线将不能覆盖整个区域。

GPS坐标与实际距离问题

用户在地图上选点得到的是GPS坐标(LatLng类型),高德地图的API提供计算两个GPS坐标点之间的实际距离(单位m)。我一开始认为这个功能就是简单的两点x、y值差的平方取根号,但是我去看了高德地图API源代码后发现并不是这么简单。实际的计算方式非常复杂,原因是GPS坐标点建立在球面的基础上,而两点距离建立在平面的基础上,也就是GPS的信息必须要通过投影到平面再进行计算。我们需要解决的问题是当输入指定的间距(单位m)如何在地图上反应出经纬度的差值,我尝试对下面的代码进行逆运算,发现太复杂了,考虑到无人机的飞行区域不会太大,所以我直接设定一个比例关系,将间距除以10的5次方得到两条平行线在坐标点上的间距,这将会产生不超过1米的误差,并且平行线也不是绝对的平行。

  public static float calculateLineDistance(LatLng var0, LatLng var1) {
          if(var0 != null && var1 != null) {
              double var2 = 0.01745329251994329D;
              double var4 = var0.longitude;
              double var6 = var0.latitude;
              double var8 = var1.longitude;
              double var10 = var1.latitude;
              var4 *= 0.01745329251994329D;
              var6 *= 0.01745329251994329D;
              var8 *= 0.01745329251994329D;
              var10 *= 0.01745329251994329D;
              double var12 = Math.sin(var4);
              double var14 = Math.sin(var6);
              double var16 = Math.cos(var4);
              double var18 = Math.cos(var6);
              double var20 = Math.sin(var8);
              double var22 = Math.sin(var10);
              double var24 = Math.cos(var8);
              double var26 = Math.cos(var10);
              double[] var28 = new double[3];
              double[] var29 = new double[3];
              var28[0] = var18 * var16;
              var28[1] = var18 * var12;
              var28[2] = var14;
              var29[0] = var26 * var24;
              var29[1] = var26 * var20;
              var29[2] = var22;
              double var30 = Math.sqrt((var28[0] - var29[0]) * (var28[0] - var29[0]) + (var28[1] - var29[1]) * (var28[1] - var29[1]) + (var28[2] - var29[2]) * (var28[2] - var29[2]));
              return (float)(Math.asin(var30 / 2.0D) * 1.27420015798544E7D);
          } else {
              try {
                  throw new AMapException("非法坐标值");
              } catch (AMapException var32) {
                  var32.printStackTrace();
                  return 0.0F;
              }
          }
      }

偏航

执飞过程可能受到其他干扰导致飞机在两点之间的飞行偏航,我们需要想办法进行自动纠偏。无人机自身的GPS纠偏已经非常完善,但是在信号干扰强度高的地方GPS纠偏就会失效。我们采取了视觉识别功能,利用无人机的摄像头来识别图像中的直线,并严格按照直线飞行,这一点的具体细节在后面的文章中详细谈。

Search

    Table of Contents