参考:px4官方WIKI
EKF2使用扩展卡尔曼滤波器进行三维的姿态,位置/速度以及风的状态进行估计。
1.1 将QGC中System中的SYS_MC_EST_GROUP设置为1
1.2 启用外部位姿输入:
# vision_speed_estimate
vision_speed:
listen_twist: true # enable listen to twist topic, else listen to vec3d topic
twist_cov: true # enable listen to twist with covariance topic
发现listen_twist: true是监听第二个话题。那vec3d和twist有什么区别呢?
答:前者只能穿速度,后者可以传linear和angular,即多了一个angular,果断选择前者(因为vins里程计并没有给angular,而且飞控本身的angular其实挺准的)。
4.1 在3中发现了问题之后,更改为:
# vision_speed_estimate
vision_speed:
listen_twist: false # enable listen to twist topic, else listen to vec3d topic
twist_cov: false # enable listen to twist with covariance topic
4.2 此时再次运行程序,查看rqt_graph,发现话题被成功订阅:
4.3 干,测试好像还是会有那种停下后慢慢融合的样子,速度还是差距好大,不过好像是好了一点丢丢(心里安慰?)。
4.4 监听/mavros/odometry/in,实锤了,linear项全为nan。
4.5 发送/mavros/vision_speed/speed_twist试试?用的摄像头的imu,效果更差。。。。
测试EKF2_EV_POS_X
将EKF2_EV_POS_X=0.08,因为我的摄像头在飞控前大概8cm的位置,测试成功,mavros返回值初始x为-0.08。
最终解决方案—>发送视觉里程计
6.1 突然发现可以用发送里程计的方法,即发送/mavros/odometry/out话题的方法(注意frame_id=odom)。然后我就整合上面的发送数据为里程计信息,发送给/mavros/odometry/out,然后监听/mavros/odometry/in,并观察数据,成功!!!
tf树为:
ps:world和base_link连接是因为我更改了px4_config.yaml文件(但是测试好像这样最开始不太吻合,动几下就好了)。
# local_position
local_position:
frame_id: "world"
tf:
send: true
frame_id: "world"
child_frame_id: "base_link"
send_fcu: true
6.2 rqt_grph为:
6.3 /mavros/odometry/out和/mavros/odometry/in如下:
6.4 发现一个大问题
px4的线速度永远是body系,所以需要使用公式将local系的速度转换为body系,否则yaw轴角度改变后将导致无人机原地画圈。
LPE (Local Position Estimator) 位置估计使用扩展卡尔曼滤波器对三维位置以及速度进行估计。
2.1 将QGC中System中的SYS_MC_EST_GROUP设置为1(local_positon_estimator)
2.2 重启PX4和QGC,在Parameters中会出现Local Position Estimator配置。
2.3 启用外部位姿输入:
2.4 优化噪声参数
如果你的视觉或动作捕捉数据非常精确,并且你希望评估者能够紧密地跟踪它,你就应该减少标准偏差参数:LPE_VIS_XY和LPE_VIS_Z(针对VIO)或LPE_VIC_P(针对MoCap)。减少它们将使估计器更信任传入的姿态估计。您可能需要将它们设置为低于允许的最小值并强制保存()。
TIP:如果性能仍然很差,请尝试增加LPE_PN_V参数。这将导致估计器在速度估计过程中更加信任度量值。
TIP:设置LPE_VIS_XY和LPE_VIS_Z时,最小只支持0.01,但是可以输入一个0,点Save,然后下面会出来一个Force save(dangerous)选项,勾选就可以强制更改。
2.5 将视觉估计的结果以/mavros/vision_pose/pose话题发给px4。
1)首先优化噪声参数全部为默认值:
在文章中间的External Vision System部分
与所有估计器一样,大部分表现来自于匹配传感器特性的调优。调优是准确性和鲁棒性之间的折衷,尽管我们试图提供满足大多数用户需求的调优,但仍会有需要进行调优更改的应用程序。(我们其实需要的是准确行,鲁棒性应该在视觉估计中考虑)。
For this reason, no claims for accuracy (没有精确度的要求???我感觉视觉估计的比你准确) relative to the legacy combination of attitude_estimator_q + local_position_estimator have been made and the best choice of estimator will depend on the application and tuning.
这么多优点,好像对我球用没有。
px4+vins+ego单机鲁棒飞行二-1(更改px4外部视觉估计固件)
结果:px4的位置完全服从外部视觉给位置,唯一缺点就是,相机位置和飞机中心位置在QGC中设置的自动转换没用了,只能自己再写静态tf转换。
这样子不行,这样的位置与px4估计严重不符,px4会切断位置输入。
最终解决方案:自己写位置PID,只用到了飞控的速度控制。还有各种应用层模式也自己写。(效果还不错)
用到的是/mavros/setpoint_raw/local话题,具体的PID就不公布了,大家可以自己写。
使用注意事项