havv和vacc不是GST标准差,
https://blog.csdn.net/qq_38429958/article/details/135639678
https://uav.chinaflier.com/thread-25814-1-1.html
飞控需要GPS哪些信息(即需要设置哪些参数)?
以开源飞控px4为例:
实际应用中,我们可以不需要解码出这么多信息,常用的如下:
经纬度、海平面高度 lat lon alt
锁定类型 fix_type
水平/垂直精度估计 eph epv
水平/垂直精度因子 hdop vdop
GPS噪声值 noise_per_ms
NED系速度 vel_n_m_s vel_e_m_s vel_d_m_s
卫星数 satellites_used
飞控中如何判定GPS可用?
标准不定,但是基本原则是根据精度来判定。
这里插入讲一下,笔者有次在某个群里看到有人问飞控算法里的eph epv表示什么意思,有人回答说是水平和垂直的精度因子,然后一大群人附和这个说法,但其实这个说法是错误的。
首先,水平/垂直精度因子是dop数据包解析出来的hdop vdop。
这里的eph epv是pvt数据包里的hAcc vAcc,单位是mm,飞控中将其转换到m。简单理解就是水平和垂直方向的精度,这个数据是估计出来的。
在飞控算法中也更新这个数据。所以,参考开源代码的时候,要看的细致一些,不能想当然的认为,包括网络查找的答案不能尽信,要自己审核确认下。
这里通过判定gps的噪声值、fix_type来判定gps是否可用。
在组合导航算法中,通过eph、epv和fix_type来判定。
// 在UBX-NAV-PVT消息的回调函数中 void onUbxNavPvt(const ublox_msgs::msg::NavPVT& pvt) {auto nav_sat_fix_msg = sensor_msgs::msg::NavSatFix();// 1. 填充基本位置信息(注意单位转换)nav_sat_fix_msg.latitude = pvt.lat * 1e-7; // 度nav_sat_fix_msg.longitude = pvt.lon * 1e-7; // 度nav_sat_fix_msg.altitude = pvt.height * 1e-3; // 米// 2. 设置状态指示符,反映RTK状态if (pvt.flags.carr_soln == 2) { // CarrSoln == 2 表示RTK固定解nav_sat_fix_msg.status.status = sensor_msgs::msg::NavSatStatus::STATUS_GBAS_FIX;} else if (pvt.flags.carr_soln == 1) { // CarrSoln == 1 表示RTK浮动解nav_sat_fix_msg.status.status = sensor_msgs::msg::NavSatStatus::STATUS_SBAS_FIX;} else {// SPP或其他模式nav_sat_fix_msg.status.status = (pvt.fix_type == 3) ? sensor_msgs::msg::NavSatStatus::STATUS_FIX : sensor_msgs::msg::NavSatStatus::STATUS_NO_FIX;}// 3. 【核心】填充 position_covariance// 将hAcc和vAcc从毫米转换为米,并计算方差(标准差的平方)double h_std_dev = pvt.h_acc * 1e-3; // 水平精度估计 (米)double v_std_dev = pvt.v_acc * 1e-3; // 垂直精度估计 (米)// 重置协方差矩阵std::fill(nav_sat_fix_msg.position_covariance.begin(), nav_sat_fix_msg.position_covariance.end(), 0.0);// 填充对角矩阵 [East方差, North方差, Up方差]// 假设东/北方向误差相等,均为h_std_devnav_sat_fix_msg.position_covariance[0] = h_std_dev * h_std_dev; // E-E variancenav_sat_fix_msg.position_covariance[4] = h_std_dev * h_std_dev; // N-N variancenav_sat_fix_msg.position_covariance[8] = v_std_dev * v_std_dev; // U-U variance// 4. 设置协方差类型// 由于hAcc/vAcc是接收机提供的估计值,我们使用APPROXIMATEDnav_sat_fix_msg.position_covariance_type = sensor_msgs::msg::NavSatFix::COVARIANCE_TYPE_APPROXIMATED;// 5. 发布消息nav_sat_fix_pub_->publish(nav_sat_fix_msg); }
为什么这是首选?
-
自动适应所有模式:ZED-F9P的固件已经为你计算好了当前模式下的精度。RTK固定时,
hAcc
为0.01-0.03米;SPP时,为1-3米。你无需自己判断模式。 -
实时准确:它反映了当前卫星几何结构、信号质量和解算算法的实时状态,比任何经验公式都准确。
常用的有:
PDOP(position dilution of precision ) 三维位置精度因子:为纬度、经度和高程等误差平方和的开根号值
HDOP(horizontal dilution of precision )水平分量精度因子:为纬度和经度等误差平方和的开根号值
VDOP(vertical dilution of precision )垂直分量精度因子
GDOP(Geometric Dilution Precision)几何精度因子:是衡量一个定位系统精度的重要标准之一
它们之间的简单关系为:
HDOP2+VDOP2=PDOP2
DOP值的大小与GPS定位的误差成正比,DOP值越大,定位误差越大,定位的精度就低。PDOP则直接反映GPS卫星的分布情况,当PDOP较大时,表明空中的4颗GPS卫星几何分布不是太理想,他们构成的图形周长太短,定位精度就低,反之亦然。小于等于4的PDOP产生最佳位置。5到7之间的PDOP可接受,大于等于7的PDOP较差。