位置解算之inav
2022-02-16 18:39:37 0 举报
Pixhawk位置解算之INAV
作者其他创作
大纲/内容
以baro为例,函数计算如下:
z向位移和速度分别为:z_est[0](k) = z_est[0](k-1)+z_est[1](k-1)*dt +acc[2]*dt*dt/2z_est[1](k) = acc[2] * dt
wait_baro=falselocal_pos.z_valid = truelocal_pos.v_z_valid = true
position_estimator_inav_thread_main()
主题sensor_combined中的数据已更新
x_est[0] = 0.0f y_est[0] = 0.0f x_est[1] = gps.vel_n_m_s y_est[1] = gps.vel_e_m_s
否
是
lidar数据的有效性检查、数据更新与处理数据在主题distance_sensor中
函数inav_parameters_init()初始化各传感器的权重,存储在变量pos_inav_param_handles中
气压计的修正量 : corr_baro=corr_baro+w_z_gps_p * dt * corr_gps[2][0]
gps中数据精度是否满足要求
accel_updates++
如果lidar传感器无效,则使用baro对加速度z向修正,方法如下:
函数结束
由 att.q 得到旋转矩阵 R
while循环
R_gps= 前面第20组的旋转矩阵R_buf
利用函数inertial_filter_predict()求解x y向的位置和速度,存储到变量x_est y_est中
by 蜗牛拉火车
气压计的零点漂移 : baro_offset(k) = baro_offset(k-1)+w_z_gps_p * dt * corr_gps[2][0]=baro_offset(0)+∑(w_z_gps_p * dt * corr_gps[2][0])
每隔0.01s发布一次数据
vision数据的有效性检查、数据更新与处理数据在主题vision_position_estimate中
eph epv在不超限的情况下: eph=eph*(1+dt) epv=epv+0.05*dt
同样方法,利用mocap vision对z向数据修正
处理如下
公告的新主题:vehicle_local_positionvehicle_global_position
计算GPS各参数的权重:w_xy_gps_p = 1.0 * w_gps_xyw_xy_gps_v = 2.0 * w_gps_xyw_z_gps_p=0.005 * w_gps_zw_z_gps_v = 0.0 * w_gps_z其中:前面乘的数字在params中配置
GPS的修正量=测量值-估计值:corr_gps[0][0] = gps_proj[0] - est_buf[0][0]corr_gps[1][0] = gps_proj[1] - est_buf[1][0]corr_gps[2][0] = local_pos.ref_alt - gps.alt - est_buf[2][0]corr_gps[0][1] = gps.vel_n_m_s - est_buf[0][1]corr_gps[1][1] = gps.vel_e_m_s - est_buf[1][1]corr_gps[2][1] = gps.vel_d_m_s - est_buf[2][1]
轮询失败
利用卡尔曼估计方法,结合lidar和GPS的测量值,对z向数据(z Vz az)更新
气压计的修正量 : corr_baro=baro_offset(k-1) - sensor.baro_alt_meter - z_est[0]其中:sensor.baro_alt_meter为气压计测量值 z_est[0]为上个循环的估计值 baro_offset(k-1) 为上一组循环的零点漂移
baro_updates++
函数 inertial_filter_correct()使用lidar或baro(lidar无效时才用baro)的修正量对z向位置和速度进行修正
所有样本求和样本数加一
函数inav_parameters_update()将pos_inav_param_handles中的配置参数复制给变量params
函数map_projection_project()由((gps.lon gps.lat)-ref)得到相对于初始位置的位置变化,存储到变量gps_proj中
z_est[0] = z_est[0] +0.5 * corr_baro * dtz_est[1] = z_est[1] +0.5*0.5* corr_baro * dt
依据配置的GPS的延迟补偿取前面第20组的估计值作为本次计算使用的估计值est_buf
采集的baro样本数小于200
几点说明
函数内部
加速度计的测量值减去偏移量(acc_bias(k-1)),再由机体坐标系转换到地理坐标系下,得到NED下的加速度acc
GPS数据的有效性检查、数据的更新与处理
sensor中加速度计的数据是否已更新
当x y向的测量源丢失时,缓慢减小x y向的速度:y_est[1] = y_est[1] - 0.5 * y_est[1] * dty_est[1] = y_est[1] - 0.5* y_est[1] * dt
轮询成功
corr_gps=0
local_pos.ref_lat = gps.latlocal_pos.ref_lon = gps.lonlocal_pos.ref_alt = gps.alt + z_est[0]
position_estimator_inav_main.cpp流程图
函数inertial_filter_predict()
mocap数据的有效性检查、数据更新与处理数据在主题att_pos_mocap中
拷贝主题vehicle_attitude中的数据到变量att中,数据包括三轴角速度、四元数
利用GPS的修正量对z向数据修正:z_est[0] = z_est[0] +w_z_gps_p * corr_gps[2][0]* dtz_est[1] = z_est[1] +(w_z_gps_p)2 * corr_gps[2][0]* dt + w_z_gps_v * corr_gps[2][1] * dt
如果使用光流,降低GPS在xy向的权重:w_xy_gps_p = 0.1 * w_xy_gps_pw_xy_gps_v = 0.1 * w_xy_gps_v
extern \"C\" __EXPORT int position_estimator_inav_main指明函数入口
x_est[0] = gps_proj[0] y_est[0] = gps_proj[1] x_est[1] = gps.vel_n_m_s y_est[1] = gps.vel_e_m_s
拷贝主题vehicle_gps_position中的数据到变量gps
x_est y_est中数据的有效性检查
轮询超时
由baro修正得到的NED系下z向的加速度偏移量acc_bias[2]=acc_bias[2]+0.05*dt*( RT * accel_bias_corr[2] )
利用函数inertial_filter_correct()结合GPS vision mocap flow的修正量对x y向的数据进行修正
thread_should_exit=ture
打印各传感器的更新频率
光流数据的有效性检查、数据更新与处理数据在主题optical_flow中
accel_bias_corr[0]= -(corr_gps[0][0] * w_xy_gps_p * w_xy_gps_p + corr_gps[0][1] * w_xy_gps_v)accel_bias_corr[1]= -(corr_gps[1][0] * w_xy_gps_p * w_xy_gps_p + corr_gps[1][1] * w_xy_gps_v)accel_bias_corr[2]= -(corr_gps[2][0] * w_z_gps_p * w_z_gps_p + corr_gps[2][1] * w_z_gps_v)
函数map_projection_init()将gps测得的经纬度处理后(角度转弧度、sin、cos)作为初始经纬度存入到变量ref中
初始位置是否已初始化
订阅以下主题:parameter_update actuator_controls_0actuator_armed sensor_combinedvehicle_attitude vision_position_estimatevehicle_gps_position optical_flow att_pos_mocap distance_sensorvehicle_rates_setpoint
z_est中数据的有效性检查
position_estimator_inav_main()
计算由Vision mocap flow修正得到的加速度的偏移量,与上面GPS的处理方法类似,处理后累加即可
sensor中气压计的数据是否已更新
光流 GPS vision mocap lidar的超时检查
若主题中的数据更新,拷贝主题的数据到对应的变量当中:parameter_update ------ updateactuator_controls_0 ------ actuatoractuator_armed ------ armedparameter_update ------ update
accel_bias_corr[2] = - 0.5*0.5*corr_baro
gps_updates++
w_gps_xy=2/max(2,gps.eph)w_gps_z = 2/max(2,gps.epv)
拷贝主题sensor_combined中的数据到变量sensor中
计算循环周期dt
eph = min(eph,eph_vision,eph_flow,gps.eph,eph_mocap)epv = min(epv,gps.epv,epv_vision,epv_mocap)不明白为什么是取其中的最小值
attitude_updates++
配置轮询主题sensor_combined中数据的阻塞时间为1s
R_buf = R
配置轮询主题vehicle_attitude中数据的阻塞时间为20ms
wait_baro=false
1. 流程图中参数表示说明: ▲ xx[*][0] 代表的是位置 xx[*][1] 代表的是速度 ▲ xx(k)表示本次循环的值 xx(k-1)表示上次循环的值 ▲ 以w_开头的参数表示权重,在params中配置2. 部分参数所代表的含义▲ x_est,y_est,z_est都为2维向量,表示各向的位置和速度▲ acc:加速度 ▲ acc_bias:加速度的偏移量,用于对下一组采集的加速度修正▲ coor_gps coor_baro等:表示gps、baro等传感器的的修正 量,其求法为测量值减去上次循环的估计值▲ baro_offset:气压计的零点漂移(不太明白为什么每次要叠加 一个gps的修正,而且气压计的修正量corr_baro计算中也包 含了gps的修正量,希望懂的大神能够指点)3. 本函数的主要思路就是利用加速度积分求得位移和速度;利用 GPS、baro等传感器进行修正。其中,修正包含两个方面: (1) 对加速度计测得的加速度进行修正。加速度测量值减去上 次循环求得的加速度的偏移量acc_bias,得到本次计算中 积分使用的值。 (2) 对积分得到的位移和速度进行修正。各传感器的修正量 (coor_gps coor_baro等)乘以权重累加到位移和速度上4. 本流程图主要以GPS和气压计为例进行说明。 欢迎多批评指正! 460864915@qq.com
由GPS修正得到的NED系下加速度的偏移量 acc_bias[*](k) =acc_bias[*](k-1)+0.05*dt*( R_gps(转置) * accel_bias_corr[*] )
将sensor_combined中的数据拷贝到变量sensor中,数据主要包括加速度计、陀螺仪、气压计、磁力计的测量数据
计算vision mocap等参数的权重
通过变量local_pos发布数据到主题vehicle_local_position中,包括 当前位置和速度(x_est,y_est,z_est),计算精度(eph,epv),初始经纬度(ref_lat,ref_lon)(在刚开始读取GPS数值时赋值),偏航角,各向位置和速度数据的有效性等
wait_baro=false(用于退出while循环)
该函数利用如下原理求解位移和速度:Δs = v*t + 0.5*a*t*tΔv = a*t
通过变量global_pos 发布数据到主题vehicle_global_position中,包括由位置变化计算得出的相对于初始位置的经纬度/高度变化,速度,计算精度(eph,epv),偏航角等
0 条评论
下一页