用于非GPS导航的VIO跟踪摄像机
Last updated
Last updated
此 wiki 页面介绍了如何将 VIO 跟踪摄像头(如英特尔实感 T265)与 ROS 一起使用,以促进非 GPS 飞行。
注意
为简洁起见,系统某些部分的解释将保持简短。更深入的讨论可以在以下博客文章第 1 部分、第 2 部分、第 3 部分中找到。
传感器:英特尔实感跟踪摄像头 T265
配套电脑:树莓派3 B型
注意
根据您对 T265 的需求,配套计算机应具有 USB2(仅姿势数据)或 USB3(姿势 + 图像数据)。对于定位和导航,我们只需要捕获姿势数据,因此RPi 3B足以完成任务。
从节点获取的位置数据将由节点处理,并通过主题发送到节点。 将负责ENU-NED帧转换,并通过MAVLink将其发送到ArduPilot。realsense-rosvision_to_mavrosmavros/mavros/vision_pose/posemavros
librealsense
¶注意
Realsense T265 在 Windows 和 Linux 上通过 librealsense 提供支持。不同系统的安装过程差异很大。有关特定系统的说明,请参阅官方github页面,例如Jetson,Odroid,Windows,Raspbian。
以下步骤适用于 Ubuntu Linux。由于没有可用于 RPi 的 Debian 软件包,因此必须从源代码构建。librealsense
安装操作系统(如果您尚未这样做):Ubuntu MATE 16.04 LTS。
增加交换大小:RPi 没有足够的 RAM 来编译 SDK,因此需要增加交换大小。2048 (2GB) 的交换大小似乎运行良好,但您可以使用更少的大小。
克隆 librealsense 存储库并编译 SDK
测试 pyrealsense2 python 包装器:如果您启用了构建 Python 包装器(标志),则编译后的库位于构建文件夹中:。BUILD_PYTHON_BINDINGS~/librealsense/build/wrappers/python
更新环境变量以将路径添加到库中:。或者,复制脚本旁边的生成输出(和文件,位于 中)。PYTHONPATHpyrealsenseexport PYTHONPATH=$PYTHONPATH:/usr/local/liblibrealsense2.sopyrealsense2.so~/librealsense/build/
英特尔提供的基本示例可以在文件夹中找到。使用 Python3 运行它。~/librealsense/wrappers/python/example
注意
带有 USB3 的 RPi 2B 无法处理图像流。尝试显示鱼眼图像可能会导致应用程序崩溃。
realsense-ros
¶ROS的安装步骤很简单,您可以按照此处官方存储库上的说明进行操作。
启动节点:。所有传感器数据将作为 ROS 主题发布:roslaunch realsense2_camera rs_t265.launch
在另一个终端中,运行以查看当前的 CPU 使用率。top
注意
的版本需要与 的版本匹配,因此每次更新 ros/lib 时,另一个也应该更新。realsense-roslibrealsense
mavros
¶建立串行连接:使用 MAVLink 将 RPi 连接到 ArduPilot。
如果RPi-ArduPilot之间的连接是通过UART串行端口建立的,请同时更改/boot/config.txt中的设置。
安装 :按照我们维基页面上的说明进行操作。mavros
在 ROS 中建立连接:使用 MAVROS连接到 ArduPilot。
vision_to_mavros
¶克隆并构建包:
根据 T265 摄像头的方向修改参数:为前置摄像头设置默认参数。在启动文件中,从值列表中修改参数 、、 或使用与您的设置对应的您自己的值。t265_tf_to_mavros.launchroll_campitch_camyaw_camgamma_world
注意
存在一个已知问题,即朝下方向的偏航角不一致,并且已经讨论了一些解决方法。在撰写本文时,似乎有效的方法如下:当相机开始流式传输姿势(启动或调用 的 API 以调用姿势数据)时,它需要稍微倾斜(即不完全平坦)。否则,世界坐标的偏航角可能会随机初始化。realsense-roslibrealsense
使用地面站(即任务规划器)连接到飞行控制器,并检查是否设置了如下所示的参数:
AHRS_EKF_TYPE = 2(默认值)以使用 EKF2(在撰写本文时,处理外部导航数据不支持 EKF3)
EK2_ENABLE = 1(默认值)
EK3_ENABLE = 0(默认值)
GPS_TYPE = 0 禁用 GPS
EK2_GPS_TYPE = 3 禁用 EKF 对 GPS 的使用
EK2_POSNE_M_NSE = 0.1
EK2_VELD_M_NSE = 0.1
EK2_VELNE_M_NSE = 0.1
COMPASS_ENABLE = 0、COMPASS_USE = 0、COMPASS_USE2 = 0、COMPASS_USE3 = 0 以禁用 EKF 对指南针的使用,而是依赖来自外部导航数据的航向。
修改参数后,重启飞控。
此设置中运行 3 个 ROS 节点:、 和 。在 3 个独立的终端中启动:realsense-rosmavrosvision_to_mavros
realsense-ros
节点:。roslaunch realsense2_camera rs_t265.launch
该主题,应以 200Hz 发布。/camera/odom/sample//tf
mavros
节点:(修改了您的设置中的其他参数)。roslaunch mavros apm.launchfcu_urlapm.launch
rostopic echo /mavros/state
应显示 FCU 已连接。
rostopic echo /mavros/vision_pose/pose
未发布。
vision_to_mavros
节点:roslaunch vision_to_mavros t265_tf_to_mavros.launch
rostopic echo /mavros/vision_pose/pose
现在应该显示来自 T265 的姿势数据。
rostopic hz /mavros/vision_pose/pose
应显示该主题正在以 30Hz 发布。
要验证ArduPilot是否在Mission Planner上接收:按下并单击“Mavlink Inspector”,您应该能够看到传入的数据。VISION_POSITION_ESTIMATECtrl+F
一旦所有节点都可以成功运行,下次您可以使用 一次启动所有节点,这将启动:roslaunch vision_to_mavros t265_all_nodes.launch
rs_t265.launch
,如最初提供的,无需修改。realsense-ros
apm.launch
,使用您自己的配置进行修改。
t265_tf_to_mavros.launch
参数根据您的 T265 方向。
开机后,启动所有ROS节点。
通常(但并非总是如此),一旦运行并且FCU开始接收消息,您将看到消息“GPS故障”和“GPS故障清除”,确认系统正在识别外部定位数据。mavrosVISION_POSITION_ESTIMATE
现在你需要告诉EKF车辆在世界上的位置(即将EKF设置为家),否则传入的数据将不会融合。为此,您需要SET_GPS_GLOBAL_ORIGIN和SET_HOME_POSITION发送 MAVLink 消息。有许多选项可以完成此操作:
使用任务规划器:右键单击地图上的任意点> >。Set Home HereSet EKF Origin Here
使用代码:通过 MAVLink 将所需的消息发送到 FCU。在 Python 中,您可以在set_origin.py使用此脚本。
安装 :按照此处的说明进行操作。pymavlink
运行脚本:。rosrun vision_to_mavros set_origin.py
您应该会看到地图上出现一个四轴飞行器图标。
拿起车辆并四处走动,检查车辆的位置运动是否显示在地图上。车辆在地图上的轨迹应反映真实运动,没有太多失真或超调。下面是一个在 2m x 2m 正方形中行走的示例。
对于您的首次飞行: - 起飞在稳定或Alt-Hold,检查飞行器是否稳定。
移动车辆并观察任务规划器上的位置,并查看跟踪是否稳定。rviz
切换到 Loiter,但随时准备在出现任何问题时切换回稳定/Alt-Hold。
否则,车辆应稳定悬停并能够保持其位置。来回移动车辆2-3米,验证刻度(更容易查看)。rviz
以不同的速度移动车辆(平移、旋转),随时准备切换回稳定/Alt-Hold。
如果一切按预期进行,下次您可以在 Loiter 模式下武装和起飞。
提示
在切换到 Loiter 模式之前,请务必确认位置反馈运行正常。注意环境中的工作边界,即由于缺乏功能、快速或旋转移动而可能丢失跟踪的位置。
视觉里程计信息将显示在数据闪存日志消息中。VISO