# 视觉惯性里程计(VIO)
视觉惯性里程计测距(VIO)是一种计算机视觉技术,用于估算3D姿态(local 位置和方向),相对于 local 起始位置的移动的机体 速度。 它通常用于在GPS不存在或不可靠的情况下(例如室内或在桥下飞行时)给载具导航。
VIO 使用 视觉里程计(Visual Odometry) (opens new window) 从相机图像中估计机身姿态,并结合机身IMU的惯性测量(以校正因不良的图像捕获导致的机身快速移动的错误)。
本节说明如何通过设置 PX4 和机载计算机来使用已支持的 VIO 配置。
提示
上面的 Auterion 产品视频 (opens new window) 展示了一个无人机飞行使用了支持的设置。
提示
Note 这个(支持的)解决方案使用 ROS 来路由 VIO 信息到 PX4 。 PX4 本身并不关心消息源,通过 MAVLink接口 提供消息就行。
# 支持的配置
提示
上面的 Auterion 产品视频 (opens new window) 展示了一个无人机飞行使用了
支持的设置</0>。 :::
# 相机安装
将相机连接到机载计算机并将其安装到机架上:
- 使用提供的线缆连接 T265 Intel Realse 追踪摄像头。
- 尽可能使镜头朝下安装相机(默认)。
- 该相机对振动非常敏感,建议软安装(例如使用振动隔离海绵)。
# ROS/VIO 安装
设置桥接,ROS 和 PX4:
在机载计算机上安装和配置 MAVROS。
获取 Auterion VIO Bridge ROS 节点 (opens new window):
- 从仓库中克隆代码到你的 catkin 工作空间。
cd ~/catkin_ws/src git clone https://github.com/Auterion/VIO.git
构建软件包:
cd ~/catkin_ws/src catkin building px4_realsense_bridge
如果需要,配置摄像头方向:
如果摄像机的镜头朝下安装(默认设置),则VIO桥接器不需要任何配置。
对于任何其他方向,请在以下部分中修改 bridge_mavros.launch (opens new window):
<node pkg="tf" type="static_transform_publisher" name="tf_baseLink_cameraPose" args="0 0 0 0 1.5708 0 base_link camera_pose_frame 1000"/>
这是将摄像机ROS帧camera_pose_frame
链接到mavros无人机帧base_link
的静态转换。
前三个
参数
指定解释为从飞控中心到摄像机的 x,y,z方向,以米为单位。 例如,如果摄像头在飞控前方10cm,上方4cm, 则前三个数字将是:[0.1, 0, 0.04 ...]接下来的三个
参数
是旋转弧度(偏航, 俯仰, 横滚)。 所以[... 0, 1.5708, 0]
是向下俯仰90度(朝向地面)。 直面是 [... 0 0 0]。按照下方的说明调整 PX4 EKF2 估计器。
通过使用适当的启动文件调用
roslaunch
来运行VIO:cd ~/catkin_ws/src roslaunched px4_realsense_bridge_mavros.launch
启动文件选项是:
- bridge_mavros.launch (opens new window): 在大多数情况下在无人机/无人车上使用(启动桥桥接和MAVROS)。
- bridge.launch (opens new window): 如果其他组件负责启动 MAVROS(仅启动桥接),则使用
- bridge_mavros_sitl.launch (opens new window):用于模拟仿真(启动桥接, MAVROS, SITL)
- 验证与飞控的连接。
提示
您可以使用*QGroundControl * MAVLink检查器 (opens new window)来验证是否收到ODOMETRY
或VISION_POSITION_ESTIMATE
消息(或检查是否存在 HEARTBEAT
消息,其组件ID为197(MAV_COMP_ID_VISUAL_INERTIAL_ODOMETRY
)。
- 在第一次飞行前 确认 VIO 设置正确!
# PX4 调试
将相机连接到机载计算机并将其安装到框架:
参数 | 外部位置估计的设置 |
---|---|
EKF2_AID_MASK | 设置 视觉位置合成 和 视觉偏航合成 |
EKF2_HGT_MODE | 设置为 Vision 使用视觉作为高度估计的主要来源。 |
EKF2_EV_DELAY | 设置为测量的时间戳和 "实际" 捕获时间之间的差异。 有关详细信息,请参阅 below。 |
EKF2_EV_POS_X, EKF2_EV_POS_Y, EKF2_EV_POS_Z | 设置视觉传感器相对于车身框架的位置。 |
这些参数可以在QGroundControl>Vehicle Setup > Parameters > EKF2中设置(切记要使参数更改生效需要重启飞控)。
更多详情/附加信息,见: ECL/EKF 概述 & 调试 > 外部视觉系统。
# EKF2_EV_DELAY 调参
EKF2_EV_DELAY是相对于 IMU 测量值的视觉位置估算器的延迟 。 换而言之,这是视觉系统时间戳和 IMU 时钟( EKF2 “时基” )记录的“实际”捕获时间之间的差异。
从技术上讲,如果 MoCap 和(例如)ROS 计算机之间有正确的时间戳(而不仅仅是到达时间)和时间同步(例如 NTP ),则可以将其设置为0。 实际上,由于通信链路的延迟非常特殊,这可能需要一些经验来调整。 系统设置完全同步链的情况很少见!
通过检查 IMU 速率和 EV 速率之间的偏移,可以从日志中获取对延迟的粗略估计:
提示
注意 可以使用 FlightPlot 或类似的飞行分析工具生成一组外部数据与板载估计(如上)。
可以通过更改参数来进一步调整该值,以找到在动态变化中最低的 EKF 更新值。
# 检查/校验 VIO 估计
执行以下检查,以确保在首次飞行之前 VIO 正常运行:
设置 PX4 参数
MAV_ODOM_LP
为1。 然后PX4将接收到的外部姿态用MAVLinkODOMETRY (opens new window)消息回传。 您可以使用 QGroundControl MAVLink 检查器 (opens new window) 查看这些MAVLink 消息偏航机身,直到
ODOMETRY
消息的四元数非常接近单位四元数(w = 1,x = y = z = 0)。- 在这一点上,机架与外部姿态系统的参考机架一致。
- 如果在不使横滚或俯仰的情况下无法使四元数接近单位四元数,则机架可能仍存在俯仰或滚动偏移。 这种情况下不要再检查机架坐标系。
对齐后,将机架抬离地面,应该看到位置的z坐标减小。 向前移动无人机,应该增加位置的 x 坐标。 向右移动无人机时,应增加 y 坐标。
检查消息中的线性速度是否以 FRD 机架参照系表示。
设置 PX4 参数
MAV_ODOM_LP
为 0。 PX4 将停止ODOMETRY
消息回传。
可以通过更改参数来进一步调整该值,以找到在动态变化中最低的EKF更新值。
将无人机放在地面上,并开始流式传输
ODOMETRY
反馈(如上所述)。 油门杆推到最低并解锁。此时,设置为位置控制模式。 如果切换成功,飞控会闪绿灯。 绿灯代表:你的外部位置信息已经注入到飞控中,并且位置控制模式已经切换成功。
油门杆放到中间位置(死区),以便无人机保持飞行高度。 提高操控杆会增加参考高度,降低操控杆会降低参考高度。 同样,另一个操控杆会更改离地位置。
推油门杆无人机会起飞,起飞后立即将油门杆回中。
确保无人机可以保持位置。
# 故障处理
执行以下检查,以确保在首次飞行之前 VIO 正常运行:
如果连接正确, 常见问题 / 解决方案是:
问题: 当无人机飞行时发生漂移/飞走,但是当拿掉螺旋桨时不会发生漂移。
- 如果使用 T265,请尝试将其软安装(soft-mounting,做好减震,此相机对高频振动非常敏感)。
问题: 启用 VIO 时产生了马桶效应。
- 确保相机的方向与启动文件中的变换匹配。 使用 QGroundControl MAVLink 检查器 (opens new window) 验证来自 MAVROS 的
ODOMETRY
消息中的速度是否与 FRD 坐标系统一致。
- 确保相机的方向与启动文件中的变换匹配。 使用 QGroundControl MAVLink 检查器 (opens new window) 验证来自 MAVROS 的
问题: 想使用视觉位置来做闭环,也想运行 GPS 。
- 这确实很困难,因为当他们不同意时,就会混淆 EKF。 通过测试,仅使用视觉速度更为可靠(如果您想出一种使该配置可靠的方法,请告诉我们)。
# 开发人员信息
对扩展此实现感兴趣的开发人员(或编写另一种不依赖 ROS 的实现)应该看看 使用视觉或运动捕获系统进行位置估计。
本主题还说明了如何配置 VIO 来配合 LPE 估计器 一起使用(不推荐)。