赞
踩
避开接近传感器检测到的障碍物以及地面站设置的围栏;
用户经常将测距仪与接近传感器混淆。测距仪通常是一维传感器,可以提供距离非常窄的光线的距离。接近传感器通常是360激光雷达和其他FOV更宽的传感器的名称。两类传感器使用的设置和参数不同。
ArduPilot最多支持4个接近传感器。
360度激光雷达通常作为接近传感器用于物体规避,但多个测距仪传感器或立体深度相机也可用于接近检测。
选定一个接近传感器然后配置飞控并测试:
https://ardupilot.org/copter/docs/common-proximity-landingpage.html#common-proximity-landingpage
Copter支持水平和向上的简单物体回避;
简单目标规避可以使用地理围栏和围栏信标作为接近传感器,可在AVOID_ENABLE参数设置。
算法介绍:
proximity sensor source 只能有一个:
简单避障用于哪些飞行模式?
简单避障模式支持的传感器类型(避障信息来源):
融合Dijkstras和BendyRuler,支持路径规划。BendyRuler不能保证路径最短,可以称为本地计划者。尽管Dijkstra让我们能够以最短的路径在复杂的围栏周围导航,但由于计算复杂性,它无法用于避免基于邻近度的障碍物。因此,这两种算法的优点被结合在一起使用。该方法从传统的Dijkstra规划飞行路径之间所有围栏周围的最短路径开始。在此路径之间,如果检测到任何基于接近度的障碍物,导航将切换到BendyRuler。如果传感器附近没有障碍物,车辆将恢复正常的Dijkstra导航。
不同的传感器类型配置方式不相同,总共有3种类型:
以RPLidar A2 雷达为例;
最多可接4个接近传感器(雷达);
如何接线:
串口连接,建议接串口1,因为串口1能够提供最高1.5A的电流;
注意:飞控的串口TX连接到雷达的RX,飞控串口的RX连接到雷达的TX !!
驱动参数:
忽略区域配置:
感知范围设置:
避障控制:
飞行模式参数:
路径规划算法参数:
高级配置:
1)对障碍物数据库obstacle database的配置;
可以不做改动,默认值即可!
2)数据过滤
避免将数据噪声当成障碍物
PRX_FILT = 0~20 Hz 越小噪声越小
3)忽略地面
对于低空避障,以及在起飞和降落时,有时传感器会将下面的地面作为障碍物。这可能很危险,因为飞机会试图“避开”这些障碍物(如果启用了回避功能)。通过设置 PRX_IGN_GND=1,我们尝试检测并忽略地面附近的任何障碍物。
简单避障模式的特点:
In ALTHOLD mode, the aggregate threat is translated into an attempt to add lean input into the pilot’s commands to move the Copter away from the aggregate obstructions. The pilot can still overcome these additions to his command inputs and fly into a object, if determined to do so.
In LOITER, either stopping in front of the object or a “sliding” algorithm is used to avoid it. “Sliding” involves slowing and slightly yawing as the vehicle approaches the object. For example, if Copter approaches a fence line at an angle, it will “slide along” the fence as the operator pushes the Copter toward the fence. Head-on approaches would stop, even if the pilot continues to “pushes” it forward.
参考:https://ardupilot.org/dev/docs/code-overview-object-avoidance.html#avoidance-in-althold
.
OA_TYPE 参数的含义实际上是路径规划的类型。
为了回答以上几个问题,去实现简单避障模式的.h和.cpp文件中寻找OA_TYPE 的用法:
AC_Avoid.h中没找到这个参数,只找到下面参数:
说明简单避障模式根本就没使用OA_TYPE 这个参数,问题1得到答案!
在AP_OAPathPlanner.h中,包含了:
#include "AP_OABendyRuler.h"
#include "AP_OADijkstra.h"
可知AP_OAPathPlanner.h是实现路径规划避障的实现类。
在AP_OAPathPlanner.h中找到了参数OA_TYPE :
// enumerations for _TYPE parameter
enum OAPathPlanTypes {
OA_PATHPLAN_DISABLED = 0,
OA_PATHPLAN_BENDYRULER = 1,
OA_PATHPLAN_DIJKSTRA = 2,
OA_PATHPLAN_DJIKSTRA_BENDYRULER = 3,
};
和另一个相关的枚举:
// path planner responsible for a particular result
enum OAPathPlannerUsed : uint8_t {
None = 0,
BendyRulerHorizontal,
BendyRulerVertical,
Dijkstras
};
在.cpp中查找OA_PATHPLAN_DISABLED并联系上下文就可以回答问题2:
再看看是谁调用了这个mission_avoidance()?
进去看看:
原来如此,如果OA_TYPE = 0,则不会进行路径规划,也不会进行避障!!问题2得到回答。
不过以上都只是根据代码看出来的结果,实际还是得测试才知道真正的结果!
至于问题3…
从类AC_Avoid.h中的类AC_Avoid可知,避障动作必定与这几个关键词有关:“BehaviourType”、“BEHAVIOR_SLIDE”、“_behavior”,在AC_Avoid.cpp中搜索这几个关键词即可找到答案:
可以总共在两种情况下使用:
已知AC_Avoid.h中的类AC_Avoid是实现简单避障模式的类。
先搜索哪个文件包含了AC_Avoid.h:
那必然在AC_Loiter.cpp中引用了避障类,在AC_Loiter.cpp中搜索类关键字“AC_Avoid”:
找到结果!
先找到定高模式坐在的cpp,并在该cpp中搜索类关键字“AC_Avoid”:
也找到结果!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。