旋翼飞行器物体规避

ArduCopter 从 3.5 版开始支持使用 Lightware SF40C, 特拉朗格塔 或使用 MAVLink 提供距离的任何传感器 距离传感器 信息。本页介绍了物体避让功能的工作原理,以及 "接近传感器 "应如何向 ArduPilot 提供数据。

Loiter 中的避让

上面的视频显示的是 EnRoute EX700 旋翼飞行器安装了 Lightware SF40C 360 度激光雷达.无论载具驶向栅栏的速度如何,载具都会在距离栅栏 2 米处停下。之所以能做到这一点,是因为 ArduPilot 知道载具的速度(使用 GPS 和加速度计)、到围栏的距离以及载具的最大加速度/减速度。

"这款" AP_Proximity 图书馆 收集来自传感器的原始距离测量值。这些原始距离测量值经过整合,只存储和使用 8 个扇区内最近的距离和角度。

每个扇形宽 45 度,扇形 0 指向载具前方,扇形 1 指向载具右前方,等等。根据这些距离和角度,可以在载具周围建立一个栅栏(二维矢量阵列)。栅栏点落在扇形之间的直线上,并保持一定的距离。

备注

默认设置是将载具周围区域划分为 8 个扇区,但每个接近传感器驱动程序都可以覆盖这一设置,使用不同的扇区数。

../_images/code-overview-object-avoidance1.png

"这款" AC_Avoidance 库 会消耗上述栅栏,并用它来调整(主要是缩短)由 装载控制器 (搜索 "avoid->adjust_velocity")。Loiter 的预期速度矢量来自飞行员的输入。

备注

物体避让也适用于制导模式的速度控制器

AltHold 中的回避

"这款" AP_ProximityAC_Avoidance 库 也用于 AltHold 的避障。由于 AltHold 不依赖 GPS,因此不知道载具驶向障碍物的速度,因此使用了一种更简单的避障方法,即将到障碍物的距离转换为倾斜角。

下图显示了将不同物体的距离组合在一起以得出最终侧倾/俯仰倾角的方法。每个感应到的物体与载具的距离和角度都会转化为一个侧倾/俯仰角。找到最大的正负侧倾角和俯仰角,并将其组合在一起,得出最终的侧倾角/俯仰角。

../_images/code-overview-object-avoidance2.png

这个最终的滚转/俯仰角与飞行员的输入相结合,意味着飞行器倾向于飞离物体,但飞行员始终保持覆盖避开物体的能力。这与驾驶员不能强迫飞行器撞向物体的 "闲置 "模式截然不同。

备注

如果有一个向上的测距仪,载具也会在撞到上方障碍物之前停下来。目前,该测距仪的距离必须使用 距离传感器 信息的方向字段设置为 24(向上)。

向地面站报告

MissionPlanner 从 v1.3.48 版开始(希望将来也能在其他地面站上使用),会在雷达类型的窗口中显示与附近物体的距离。

../_images/code-overview-object-avoidance4.png

打开该窗口的方法是进入 "飞行数据 "屏幕,按下 Ctrl-F 并按下 "接近度 "按钮。如果 PRX_TYPE 参数设置为启用传感器,并且正在接收信息。

../_images/code-overview-object-avoidance-show-radar-view.png

为此,飞行器定期向地面站发送 DISTANCE_SENSOR 信息。实现这一目的的方法可参见 GCS_Common.cpp 文件 (搜索 "send_proximity")。请注意,这意味着 DISTANCE_SENSOR 信息有可能同时用于向飞行器代码发送距离,然后类似的 DISTANCE_SENSOR 信息也可能从飞行器发送到地面站。不过这些都是不同的信息,传输速率也可能不同。

向 ArduPilot 提供距离传感器信息

对于新型 "近距离 "传感器(即能以某种方式提供附近物体距离的传感器)的开发人员来说,将距离测量值输入 ardupilot 的最简单方法是发送以下信息 距离传感器 为传感器所能识别的每个方向发送信息。信息的系统 ID 应与载具的系统 ID 一致(默认为 "1",但可使用 SYSID_THISMAV 参数更改)。组件 ID 可以是任何名称,但 MAV_COMP_ID_PATHPLANNER (195) 或 MAV_COMP_ID_PERIPHERAL (158) 可能是不错的选择。

这些信息的发送频率应在 10 赫兹到 50 赫兹之间(越快越好)。填写的字段应如下所示:

  • time_boost_ms : 0 (忽略)

  • min_distance:传感器可测量的最小距离,单位为厘米(即 100 = 1 米)。这个数字一般不会改变,无论在哪个方位区域都应相同。

  • max_distance(最大距离):传感器可测量的最大距离,单位为厘米(即 1500 = 15 米)。这个数字一般不会改变,无论在哪个方位区域都应相同。

  • current_distance : 与目标物之间的最短距离(单位:厘米

  • 类型:0(忽略)

  • id : 0 (忽略)

  • 方向:0 至 7(0=向前,每递增一次顺时针方向增加 45 度)、24(向上)或 25(向下)。 mavlink/common page.

  • 协方差 : 0 (忽略)

如果没有收到全部 8 个扇区的 DISTANCE_SENSOR 信息,则会用相邻扇区的距离(如果有的话)来填补空扇区。这样可以方便地形成 "杯 "形栅栏,从而更有可能保护载具不撞击物体。在今后的版本中很可能会对这一点进行修改,尤其是在配置了 "停止 "行为(而不是 "滑动 "行为)的情况下。

../_images/code-overview-object-avoidance3.png

这两段视频展示了 ZED 3D 摄像机 连接到 英伟达 TX1 跑步 OpenKai 并使用上述方法向 ArduPilot 提供前向距离测量值。

未来步骤

  • 将避让功能添加到其他模式,包括 RTL、自动 (这里的问题)

  • 改进与 ROS 的集成 (这里的问题)

  • 在我们无法(或不想)在载具上实施 ROS 的情况下,实施一个简单的占用网格 (这里的问题)

如果您想参与该区域的开发,请考虑在上面列出的问题中发帖,或通过以下方式与开发人员聊天 ArduPilot 纪谈.