【开发环境】PX4无人机实物使用视觉或运动捕捉系统进行位置估计

ops/2024/10/9 15:15:15/

PX4无人机实物使用视觉或运动捕捉系统进行位置估计

    • PX4中关于外部位置信息的MAVLink话题
    • 参考坐标系
    • EKF2调整配置参数
      • 调整EKF2_EV_DELAY参数
    • 与ROS共同使用
      • OptiTrack MoCap系统提供的姿态数据导入ROS
        • Motive MoCap软件的步骤
        • 将姿态数据导入ROS
        • 重新映射姿态数据
      • 将姿态数据转发到PX4
      • PX4和ROS的参考坐标系
    • 飞行测试

视觉惯性里程计(VIO)和运动捕捉系统(MoCap)允许无人机在全局位置信息不可用或不可靠时导航(例如在室内或在桥下飞行等)。

VIOMoCap都根据视觉信息确定车辆的位置和姿态,它们之间的主要区别在于坐标系视角:

  • VIO使用机载传感器从无人机的视角获取姿态数据。

  • MoCap使用机外摄像机系统来获取3D空间中的无人机姿态数据。

来自VIOMoCap的姿态数据都可用于更新基于PX4的自动驾驶仪的局部位置估计(相对于局部原点),并且还可选择性地融合到无人机姿态估计中。此外,如果外部姿态系统也提供线速度测量数据,则该数据可以用于改进状态估计(线速度测量数据的融合仅由EKF2算法支持)。

这篇文章介绍了如何配置基于PX4飞控的无人机系统,通过ROS或其他MAVLink系统从MoCap/VIO系统获取数据。主要介绍如何设置像VICON和Optitrack这样的MoCap系统,以及像ROVIO、SVO和PTAM这样的VIO系统。

PX4MAVLink_14">PX4中关于外部位置信息的MAVLink话题

PX4使用以下MAVLink话题获取外部位置信息,并将其映射到uORB话题。

MAVLink话题名称uORB话题
VISION_POSITION_ESTIMATEvehicle_visual_odometry
ODOMETRY (frame_id = MAV_FRAME_LOCAL_FRD)vehicle_visual_odometry
ATT_POS_MOCAPvehicle_mocap_odometry
ODOMETRY (frame_id = MAV_FRAME_MOCAP_NED)vehicle_mocap_odometry

EKF2状态估计器只能订阅vehicle_visual_odometry话题获取外部位置信息,因此只能处理前两条话题,如果使用MoCap系统则必须生成这些话题才能够使用EKF2。vehicle_visual_odometry话题是唯一一个可以向PX4发送线速度测量数据的话题。

话题的传输频率应在30Hz和50Hz之间。如果信息速率过低,EKF2将不会熔断外部视觉信息。

PX4当前不支持以下MAVLink视觉话题:GLOBAL_vision_POSITION_ESTIMATEvision_SPEED_ESTIMATEVICON_POSTION_ESTIMATE

参考坐标系

PX4将FRD(X向前、Y向右和Z向下)用于局部机体坐标系以及参考坐标系。

当使用磁力计的航向时,PX4参考系的X轴将与北方对齐,因此它被称为NED(X North,Y East,Z Down)。

PX4估计器的参考帧的航向和外部姿态估计的航向在大多数情况下将不匹配。因此,外部姿态估计的参考帧以不同的方式命名,称为MAV_frame_LOCAL_FRD

根据参考系的来源,在发送MAVLink Vision/MoCap话题之前,您需要对姿态估计应用自定义变换。这对于更改姿态估计的父帧和子帧的方向是必要的,以使其符合PX4约定。可以根据MAVROS odom插件了解必要的转换。

例如,如果使用Optitrack坐标系,则局部坐标系位于水平面上(x前和z右),而y轴垂直并指向上。一个简单的技巧是交换轴以获得NED坐标系。

如果x_{mav}y_{mav}z_{mav}是通过MAVLink作为位置反馈发送的坐标,则我们获得:

x_{mav} = x_{mocap}
y_{mav} = z_{mocap}
z_{mav} = - y_{mocap}

对于无人机姿态方向的坐标系变换,保持四元数的标量部分w相同,并以相同的方式交换矢量部分x、y和z。你可以在每个系统中应用这个技巧-如果你需要获得NED坐标系,请查看你的MoCap输出并相应地交换轴。

EKF2调整配置参数

必须设置以下参数才能将外部位置信息与EKF2一起使用。

参数名称外部位置估计设置
EKF2_AID_MASK根据融合模型需求设置视觉位置融合、视觉速度融合、视觉偏航角融合和外部视觉欧拉角融合。
EKF2_HGT_MODE设置为使用视觉作为海拔估计的主要来源。
EKF2_EV_DELAY设置为测量的时间戳与实际捕获时间之间的差值。
EKF2_EV_POS_X, EKF2_EV_POS_Y, EKF2_EV_POS_Z设置视觉传感器(或MoCap标记)相对于无人机机体坐标系的位置。

调整EKF2_EV_DELAY参数

EKF2_EV_DELAY参数是相对于IMU测量的视觉位置估计器延迟。

或者换句话说,这是视觉系统时间戳和IMU时钟(EKF2的基本时钟)记录的实际捕获时间之间的差异。

从技术上讲,如果MoCap和ROS计算机之间有正确的时间戳(而不仅仅是到达时间)和时间同步(例如NTP),则可以将其设置为0。事实上,这需要一些经验调整,因为整个MoCapPX4的通信链路中的延迟是需要特殊设置的。使用完全同步的通信链路来设置系统是罕见的!

通过检查IMU速率和EV速率之间的偏移,可以从日志中获得延迟的粗略估计。要启用EV速率的日志记录,请在参数设置中勾选SDLOG_PROFILE参数的第7选项(计算机视觉和禁用)。

在这里插入图片描述

在这里插入图片描述

可以通过调整参数来进一步降低该值,以找到在动态机动过程中产生最低EKF的值。

与ROS共同使用

ROS不需要用于提供外部姿态信息,但强烈建议使用,因为它已经与VIOMoCap系统进行了良好的集成。

OptiTrack_MoCapROS_106">将OptiTrack MoCap系统提供的姿态数据导入ROS

VIOMoCap系统有不同的获取姿态数据的方式,并且有自己的设置和话题。

下面介绍了OptiTrack MoCap系统的设置。对于其他系统,请参阅供应商设置文档。

OptiTrack官网

以下步骤说明如何将OptiTrack系统的位置估计值输入PX4。假设MoCap系统已校准。

校准过程的教程

MoCap_118">Motive MoCap软件的步骤

无人机上粘贴3个以上的标记点。

无人机的前进方向与系统X轴正方向对齐。

在Motive软件中定义刚体。给无人机一个不包含空格的名称。

启用姿态数据广播和VRPN数据流。

将向上轴设置为Z轴(默认值为Y轴向上)。

将姿态数据导入ROS

安装vrpn_client_ros软件包。

vrpn_client_ros github地址

可以通过运行以下命令获得每个刚体姿态的话题。

roslaunch vrpn_client_ros sample.launch server:=<mocap machine ip>

如果你的刚体命名为robot1,则会得到类似/vrpn_client_node/robot1/pose的话题。

重新映射姿态数据

MAVROS提供了一个插件,用于将在/mavros/vision_pose/pose上发布的姿态数据转换到PX4。假设MAVROS正在运行,您只需要将从MoCap/vrpn_client_node/<rigid_body_name>/pose获得的姿态话题直接重新映射到/mavros/vision_pose/pose即可。

如果您已经如上所述配置了EKF2参数,现在设置PX4并融合MoCap数据。

PX4_150">将姿态数据转发到PX4

MAVROS提供了一个插件,可使用以下话题中继来自VIOMoCap系统的视觉估计数据。

ROS话题名称MAVLink话题名称uORB话题名称
/mavros/vision_pose/poseVISION_POSITION_ESTIMATEvehicle_visual_odometry
/mavros/odometry/out (frame_id = odom, child_frame_id = base_link)ODOMETRY (frame_id = MAV_FRAME_LOCAL_FRD)vehicle_visual_odometry
/mavros/mocap/poseATT_POS_MOCAPvehicle_mocap_odometry
/mavros/odometry/out (frame_id = odom, child_frame_id = base_link)ODOMETRY (frame_id = MAV_FRAME_LOCAL_FRD)vehicle_mocap_odometry

如果使用EKF2,则仅支持vision话题。要将MoCap数据与EKF2一起使用,您必须重新映射从MoCap获得的姿态话题:

  • geometry_msgs/PoseStampedgeometry_msgs/PoseWithCovarianceStamped类型的MoCap ROS话题必须重新映射到/mavros/vision_pose/pose话题。geometry_msgs/PoseStamped话题最常见,因为MoCap通常与数据没有相关的协变量。
  • 如果您通过nav_msgs/OdometryROS话题获取数据,则需要将其重新映射到/mavros/odometry/out,确保相应地更新frame_idchild_frame_id
  • 里程计框架frame_id=odomchild_frame_id=base_link可以通过更新mavros/slaunch/px4_config.yaml文件来更改。然而,当前版本的mavros(1.3.0)需要能够使用tf树来找到从frame_id到硬编码框架odom_ned的转换。这同样适用于child_frame_id,它需要在tf树中连接到硬编码框架base_link_frd。如果您使用的是mavros 1.2.0,并且没有更新文件mavros/slaunch/px4_config.yaml,那么您可以安全地使用里程计框架frame_id=odomchild_frame_id=base_link而不用担心。
  • 请注意,如果您使用child_frame_id=base_link将里程计数据发送到PX4,则需要确保nav_msgs/odometry话题的twist部分以机体坐标系表示,而不是以惯性坐标系表示!

PX4ROS_172">PX4和ROS的参考坐标系

ROS和PX4使用的机体坐标系和世界坐标系是不同的。

坐标系PX4ROS
机体FRD(X轴向前,Y轴向右,Z轴向下)FRD(X轴向前,Y轴向右,Z轴向下),通常命名为base_link
世界FRD或NED(X轴向北、Y轴向东、Z轴向下)FRD或NED(X轴向北、Y轴向东、Z轴向下),命名为odom或map

两个坐标系如下图所示(左侧为FRD,右侧为FLU)。

在这里插入图片描述

使用EKF2,当使用外部航向估计时,磁北可以被忽略,或者可以计算和补偿到磁北的航向偏移。根据您的选择,偏航角是相对于磁北或局部X轴给出的。

使用MAVROS时此操作非常简单。ROS使用ENU坐标系,因此必须在ENU中提供位置反馈。如果你有Optitrack系统,你可以使用mocap_optitrack节点,该节点可以在ENU中的ROS话题上流式传输对象姿态。通过重新映射,您可以直接在mocap_pose_estimate上发布它,而无需任何转换,MAVROS将负责NED转换。

MAVROS里程计插件使处理坐标系变得简单。它使用ROS的tf包。您的外部姿态系统可能使用与PX4完全不同的坐标系。外部姿态估计的机体坐标系可能取决于如何在MOCAP软件中设置机体坐标系,或者如何在无人机上安装VIO传感器。MAVROS里程计插件需要知道外部姿态的子坐标系相对于MAVROS已知的FRD或FLU机体坐标系的方向。因此,您必须将外部姿态的机体坐标系添加到tf树中。这可以通过在ROS启动文件中包含以下行的代码来完成。

  <node pkg="tf" type="static_transform_publisher" name="tf_baseLink_externalPoseChildFrame"args="0 0 0 <yaw> <pitch> <roll> base_link <external_pose_child_frame> 1000"/>

确保更改偏航、俯仰和滚转的值,使其将外部姿态的机体坐标系正确地附加到base_linkbase_link_frd。请查看tf包以获得有关如何指定坐标系之间转换的进一步帮助。您可以使用rviz检查是否正确连接了坐标系。external_pose_child_frame的名称必须与nav_msgs/odometry话题的child_frame_id匹配。这同样适用于外部姿态的参考系。您必须将外部姿态的参考坐标系作为子坐标系附加到odomodom_frd坐标系。因此,相应地调整以下代码行。

  <node pkg="tf" type="static_transform_publisher" name="tf_odom_externalPoseParentFrame"args="0 0 0 <yaw> <pitch> <roll> odom <external_pose_parent_frame> 1000"/>

如果参考系的Z轴指向上方,则可以将其附加到odom坐标系,而无需任何旋转(偏航=0、俯仰=0、滚转=0)。external_pose_rent_frame的名称必须与里程计话题的frame_id匹配。

飞行测试

下面介绍了如何为MoCapVIO系统进行设置。

请务必在首次飞行前进行以下检查:

  • PX4参数MAV_ODOM_LP设置为1。PX4随后将接收到的外部姿态作为MAVLink话题流式传输回地面站。
  • 您可以使用QGroundControl地面站的MAVLink Inspector功能检查这些MAVLink话题。转动无人机,直到ODOMETRY话题的四元数非常接近单位四元数(w=1,x=y=z=0)。
  • 这时机体坐标系与外部姿态系统的参考坐标系对齐。如果在不滚转或俯仰车辆的情况下无法使四元数接近单位四元数,则坐标系可能仍有俯仰或滚转偏移。如果是这种情况,请不要继续,并再次检查坐标系。
  • 一旦对齐,您可以从地面上拾起无人机,您应该会看到位置的Z坐标减小。向前移动车辆,应增加位置的X坐标。将车辆向右移动时,应增加Y坐标。如果还从外部姿态系统发送线速度数据,则还应检查线速度是否在FRD机体参考系中表示。
  • PX4参数MAV_ODOM_LP设置回0。PX4将停止MAVLink话题流传输。

如果这些步骤都执行完毕,你可以进行你的飞行测试。

无人机放在地面上,开始MoCap的数据流传输。油门给到最低,切换到位置模式。如果一切正常,地面站的位置模式处应该为绿色,绿色表示位置反馈可用,位置控制已激活。

将油门放在中间死区处。在该处无人机将保持其高度,升高操纵杆会增加高度,而降低操纵杆会降低高度。在X轴和Y轴上,右操纵杆也是如此。

增加油门的值,无人机就会起飞,然后把它油门放在中间死区处,检查它是否能够保持其位置。

如果无人机能保持其位置,则可以通过offboard模式进行飞行测试。


参考资料:

Using Vision or Motion Capture Systems for Position Estimation


http://www.ppmy.cn/ops/50175.html

相关文章

MySQL之优化服务器设置和复制(一)

优化服务器设置 操作系统状态 CPU密集型的机器 CPU密集型服务器的vmstat输出通常在us列会有一个很高的值&#xff0c;报告了花费在非内核代码上的CPU时钟;也可能在sy列有很高的值&#xff0c;表示系统CPU利用率&#xff0c;超过20%就足以令人不安了。在大部分情况下&#xff…

003 gitee怎样将默认的私有仓库变成公开仓库

先点击“管理”&#xff0c; 再点击“基本信息” 在“是否开源”里&#xff0c; 选择&#xff1a;开源

Github上前十大开源Rust项目

在github上排名前十的Rust开源项目整理出来与大家共享&#xff0c;以当前的Star数为准。 Deno Deno 是 V8 上的安全 TypeScript 运行时。Deno 是一个建立在V8、Rust和Tokio之上的 JavaScript、TypeScript 和 WebAssembly 的运行时环境&#xff0c;具有自带安全的设置和出色的开…

探索未来工作新伙伴:机器人流程自动化(RPA)揭秘

想象一下&#xff0c;如果你的日常工作中那些繁琐、重复的任务&#xff0c;比如数据录入、文件整理、邮件发送等&#xff0c;都能自动完成&#xff0c;你将拥有更多时间专注于真正需要创造力和智慧的工作&#xff0c;是不是听起来就像拥有了一个私人助理&#xff1f;这并不是遥…

数字孪生定义及应用介绍

数字孪生定义及应用介绍 1 数字孪生&#xff08;Digital Twin, DT&#xff09;概述1.1 定义1.2 功能1.3 使用场景1.4 数字孪生三步走1.4.1 数字模型1.4.2 数字影子1.4.3 数字孪生 数字孪生地球平台Earth-2 参考 1 数字孪生&#xff08;Digital Twin, DT&#xff09;概述 数字孪…

阿里巴巴全球数学竞赛报名条件

#竞赛概览与历史# “阿里巴巴全球数学竞赛”&#xff08;Alibaba Global Mathematics Competition&#xff09;由阿里巴巴公益、阿里巴巴达摩院共同举办&#xff0c;面向全球的数学爱好者&#xff0c;集竞赛、培训、交流于一体&#xff0c;旨在全球范围内引领开启关注数学、理解…

【LeetCode算法】第112题:路径总和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;二叉树先序遍历。首先访问根节点&#xff0c;若根节点是叶子节点并且值等于目标值&#xff0c;则返回true&#xff0c;否则递归访问左子树和右子树&#xff0c;只要左…

记录一次基于Vite搭建Vue3项目的过程

Vue2已经于2023年12月31日停止维护了&#xff0c;2024年算是vue3的崭新的一年&#xff0c;我们的项目也基本从vue2逐渐向着Vue3过渡&#xff0c;Vue3相较于vue2有更好的开发体验&#xff0c;和ts的自然融合使得项目的结构、功能拆分变得更加的清晰&#xff1b;组合式声明有种MV…