利用 VELOCITY_MASK 在无全球定位系统环境中生存
如果你仅使用光流传感器和向下安装的激光雷达在室内飞行微型无人机,标准的自主飞行指令很快就会让你失望。
当你发出传统的 MAV_CMD_NAV_TAKEOFF(起飞导航命令)时,阿杜皮洛特(ArduPilot)期望能够访问全局位置信息。如果没有全球定位系统(GPS),导航栈可能会拒绝移动。
为了解决这个问题,我们绕过了高层导航控制器,并使用 set_attitude_target_send() 通过串行接口注入原始 MAVLink 命令。这使得无人机能够仅依靠其板载传感器爬升。
然而,起飞只是成功的一半。
让无人机保持在空中才是事情变得有趣的地方。
“零油门下落”陷阱
在我们第一次系留试飞期间,我们设法在 GUIDED(引导)模式下爬升到大约一米的高度。
为了命令稳定的悬停,我们将飞行器切换到 LOITER(盘旋)模式。
模式切换的瞬间,电机减速,无人机下落。
发生了什么?
问题不在于硬件。
而是软件冲突。
GUIDED(引导)模式是完全自主的,会忽略飞行员的操作杆输入。
另一方面,LOITER(盘旋)是一种混合模式。
一旦飞行控制器进入 LOITER(盘旋)模式,它就会检查遥控发射器。
我们的油门杆停留在零位。
阿杜皮洛特(ArduPilot)将其解释为飞行员发出的下降命令。
纯自主修复方案:VELOCITY_MASK
我们没有依赖物理操纵杆,而是完全停留在 GUIDED(引导)模式内,并持续发送零速度命令。
使用 set_position_target_local_ned_send(),我们可以指定一个位掩码,告诉 Pixhawk 飞控哪些字段是重要的。
掩码值 3527(0b110111000111)意味着:
- 忽略位置坐标
- 忽略加速度
- 忽略偏航角
- 强制控制 X、Y 和 Z 轴速度
通过命令:
Vx = 0
Vy = 0
Vz = 0
我们实际上是在告诉飞行控制器:
保持完全静止。
速度保持循环
VELOCITY_MASK = 3527
# 保持悬停 10 秒
for i in range(20):
master.mav.set_position_target_local_ned_send(
0,
master.target_system,
master.target_component,
mavutil.mavlink.MAV_FRAME_LOCAL_NED,
VELOCITY_MASK,
0, 0, 0, 免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。