From cc73f214d18b92c07fba4e579c59d1705b868a19 Mon Sep 17 00:00:00 2001 From: TSC21 <n.marques21@hotmail.com> Date: Fri, 14 Sep 2018 11:43:48 +0100 Subject: [PATCH] add covariance matrices index aliases --- msg/vehicle_odometry.msg | 20 +++++++++++-- .../attitude_estimator_q_main.cpp | 14 +++++---- src/modules/ekf2/ekf2_main.cpp | 15 ++++++---- .../sensors/mocap.cpp | 30 +++++++++++++------ .../sensors/vision.cpp | 30 +++++++++++++------ .../position_estimator_inav_main.cpp | 24 +++++++++------ src/modules/simulator/simulator_mavlink.cpp | 8 +++-- 7 files changed, 98 insertions(+), 43 deletions(-) diff --git a/msg/vehicle_odometry.msg b/msg/vehicle_odometry.msg index 98bac50dc4..138f34b8a2 100644 --- a/msg/vehicle_odometry.msg +++ b/msg/vehicle_odometry.msg @@ -1,6 +1,20 @@ # Vehicle odometry data. Fits ROS REP 147 for aerial vehicles uint64 timestamp # time since system start (microseconds) +# Covariance matrix index constants +uint8 COVARIANCE_MATRIX_X_VARIANCE=0 +uint8 COVARIANCE_MATRIX_Y_VARIANCE=6 +uint8 COVARIANCE_MATRIX_Z_VARIANCE=11 +uint8 COVARIANCE_MATRIX_ROLL_VARIANCE=15 +uint8 COVARIANCE_MATRIX_PITCH_VARIANCE=18 +uint8 COVARIANCE_MATRIX_YAW_VARIANCE=20 +uint8 COVARIANCE_MATRIX_VX_VARIANCE=0 +uint8 COVARIANCE_MATRIX_VY_VARIANCE=6 +uint8 COVARIANCE_MATRIX_VZ_VARIANCE=11 +uint8 COVARIANCE_MATRIX_ROLLRATE_VARIANCE=15 +uint8 COVARIANCE_MATRIX_PITCHRATE_VARIANCE=18 +uint8 COVARIANCE_MATRIX_YAWRATE_VARIANCE=20 + # Position in NED earth-fixed frame (meters). NaN if invalid/unknown float32 x # North position float32 y # East position @@ -12,7 +26,8 @@ float32[4] q # Quaternion rotation from NED earth-fixed frame to XYZ body fram # Row-major representation of 6x6 pose cross-covariance matrix URT. # NED earth-fixed frame. # Order: x, y, z, rotation about X axis, rotation about Y axis, rotation about Z axis -# If invalid/unknown, first cell is NaN +# If position covariance invalid/unknown, first cell is NaN +# If orientation covariance invalid/unknown, 16th cell is NaN float32[21] pose_covariance # Velocity in NED earth-fixed frame (meters/sec). NaN if invalid/unknown @@ -28,7 +43,8 @@ float32 yawspeed # Angular velocity about Z body axis # Row-major representation of 6x6 velocity cross-covariance matrix URT. # Linear velocity in NED earth-fixed frame. Angular velocity in body-fixed frame. # Order: vx, vy, vz, rotation rate about X axis, rotation rate about Y axis, rotation rate about Z axis -# If invalid/unknown, first cell is NaN +# If linear velocity covariance invalid/unknown, first cell is NaN +# If angular velocity covariance invalid/unknown, 16th cell is NaN float32[21] velocity_covariance # TOPICS vehicle_odometry vehicle_mocap_odometry vehicle_visual_odometry diff --git a/src/modules/attitude_estimator_q/attitude_estimator_q_main.cpp b/src/modules/attitude_estimator_q/attitude_estimator_q_main.cpp index aa806698a2..2c9aa01c06 100644 --- a/src/modules/attitude_estimator_q/attitude_estimator_q_main.cpp +++ b/src/modules/attitude_estimator_q/attitude_estimator_q_main.cpp @@ -350,9 +350,10 @@ void AttitudeEstimatorQ::task_main() if (orb_copy(ORB_ID(vehicle_visual_odometry), _vision_odom_sub, &vision) == PX4_OK) { // validation check for vision attitude data bool vision_att_valid = PX4_ISFINITE(vision.q[0]) - && (PX4_ISFINITE(vision.pose_covariance[0]) ? fabsf(sqrtf(fmaxf(vision.pose_covariance[15], - fmaxf(vision.pose_covariance[18], - vision.pose_covariance[20]))) - _eo_max_std_dev) < FLT_EPSILON : true); + && (PX4_ISFINITE(vision.pose_covariance[vision.COVARIANCE_MATRIX_ROLL_VARIANCE]) ? fabsf(sqrtf(fmaxf( + vision.pose_covariance[vision.COVARIANCE_MATRIX_ROLL_VARIANCE], + fmaxf(vision.pose_covariance[vision.COVARIANCE_MATRIX_PITCH_VARIANCE], + vision.pose_covariance[vision.COVARIANCE_MATRIX_YAW_VARIANCE]))) - _eo_max_std_dev) < FLT_EPSILON : true); if (vision_att_valid) { Dcmf Rvis = Quatf(vision.q); @@ -381,9 +382,10 @@ void AttitudeEstimatorQ::task_main() if (orb_copy(ORB_ID(vehicle_mocap_odometry), _mocap_odom_sub, &mocap) == PX4_OK) { // validation check for mocap attitude data bool mocap_att_valid = PX4_ISFINITE(mocap.q[0]) - && (PX4_ISFINITE(mocap.pose_covariance[0]) ? fabsf(sqrtf(fmaxf(mocap.pose_covariance[15], - fmaxf(mocap.pose_covariance[18], - mocap.pose_covariance[20]))) - _eo_max_std_dev) < FLT_EPSILON : true); + && (PX4_ISFINITE(mocap.pose_covariance[mocap.COVARIANCE_MATRIX_ROLL_VARIANCE]) ? fabsf(sqrtf(fmaxf( + mocap.pose_covariance[mocap.COVARIANCE_MATRIX_ROLL_VARIANCE], + fmaxf(mocap.pose_covariance[mocap.COVARIANCE_MATRIX_PITCH_VARIANCE], + mocap.pose_covariance[mocap.COVARIANCE_MATRIX_YAW_VARIANCE]))) - _eo_max_std_dev) < FLT_EPSILON : true); if (mocap_att_valid) { Dcmf Rmoc = Quatf(mocap.q); diff --git a/src/modules/ekf2/ekf2_main.cpp b/src/modules/ekf2/ekf2_main.cpp index a8ee9a2e36..d3c142cabf 100644 --- a/src/modules/ekf2/ekf2_main.cpp +++ b/src/modules/ekf2/ekf2_main.cpp @@ -1172,9 +1172,10 @@ void Ekf2::run() ev_data.posNED(2) = ev_odom.z; // position measurement error from parameters - if (PX4_ISFINITE(ev_odom.pose_covariance[0])) { - ev_data.posErr = fmaxf(_ev_pos_noise.get(), sqrtf(fmaxf(ev_odom.pose_covariance[0], ev_odom.pose_covariance[6]))); - ev_data.hgtErr = fmaxf(_ev_pos_noise.get(), sqrtf(fmaxf(ev_odom.pose_covariance[11])); + if (PX4_ISFINITE(ev_odom.COVARIANCE_MATRIX_X_VARIANCE)) { + ev_data.posErr = fmaxf(_ev_pos_noise.get(), sqrtf(fmaxf(ev_odom.pose_covariance[ev_odom.COVARIANCE_MATRIX_X_VARIANCE], + ev_odom.pose_covariance[ev_odom.COVARIANCE_MATRIX_Y_VARIANCE]))); + ev_data.hgtErr = fmaxf(_ev_pos_noise.get(), sqrtf(ev_odom.pose_covariance[ev_odom.COVARIANCE_MATRIX_Z_VARIANCE]))); } else { ev_data.posErr = _ev_pos_noise.get(); ev_data.hgtErr = _ev_pos_noise.get(); @@ -1186,9 +1187,11 @@ void Ekf2::run() ev_data.quat = matrix::Quatf(ev_odom.q); // orientation measurement error from parameters - if (PX4_ISFINITE(ev_odom.pose_covariance[15])) { - ev_data.angErr = fmaxf(_ev_ang_noise.get(), sqrtf(fmaxf(ev_odom.pose_covariance[15], fmaxf(ev_odom.pose_covariance[18], - ev_odom.pose_covariance[20])))); + if (PX4_ISFINITE(ev_odom.COVARIANCE_MATRIX_ROLL_VARIANCE)) { + ev_data.angErr = fmaxf(_ev_ang_noise.get(), + sqrtf(fmaxf(ev_odom.pose_covariance[ev_odom.COVARIANCE_MATRIX_ROLL_VARIANCE], + fmaxf(ev_odom.pose_covariance[ev_odom.COVARIANCE_MATRIX_PITCH_VARIANCE], + ev_odom.pose_covariance[ev_odom.COVARIANCE_MATRIX_YAW_VARIANCE])))); } else { ev_data.angErr = _ev_ang_noise.get(); diff --git a/src/modules/local_position_estimator/sensors/mocap.cpp b/src/modules/local_position_estimator/sensors/mocap.cpp index ee0c028784..2ad5983bfb 100644 --- a/src/modules/local_position_estimator/sensors/mocap.cpp +++ b/src/modules/local_position_estimator/sensors/mocap.cpp @@ -60,10 +60,15 @@ void BlockLocalPositionEstimator::mocapInit() int BlockLocalPositionEstimator::mocapMeasure(Vector<float, n_y_mocap> &y) { - if (PX4_ISFINITE(_sub_mocap_odom.get().pose_covariance[0])) { + uint8_t x_variance = _sub_mocap_odom.get().COVARIANCE_MATRIX_X_VARIANCE; + uint8_t y_variance = _sub_mocap_odom.get().COVARIANCE_MATRIX_Y_VARIANCE; + uint8_t z_variance = _sub_mocap_odom.get().COVARIANCE_MATRIX_Z_VARIANCE; + + if (PX4_ISFINITE(_sub_mocap_odom.get().pose_covariance[x_variance])) { // check if the mocap data is valid based on the covariances - _mocap_eph = sqrtf(fmaxf(_sub_mocap_odom.get().pose_covariance[0], _sub_mocap_odom.get().pose_covariance[6])); - _mocap_epv = sqrtf(_sub_mocap_odom.get().pose_covariance[11]); + _mocap_eph = sqrtf(fmaxf(_sub_mocap_odom.get().pose_covariance[x_variance], + _sub_mocap_odom.get().pose_covariance[y_variance])); + _mocap_epv = sqrtf(_sub_mocap_odom.get().pose_covariance[z_variance]); _mocap_xy_valid = _mocap_eph <= EP_MAX_STD_DEV; _mocap_z_valid = _mocap_epv <= EP_MAX_STD_DEV; @@ -78,13 +83,20 @@ int BlockLocalPositionEstimator::mocapMeasure(Vector<float, n_y_mocap> &y) return -1; } else { - y.setZero(); - y(Y_mocap_x) = _sub_mocap_odom.get().x; - y(Y_mocap_y) = _sub_mocap_odom.get().y; - y(Y_mocap_z) = _sub_mocap_odom.get().z; - _mocapStats.update(y); _time_last_mocap = _sub_mocap_odom.get().timestamp; - return OK; + + if (PX4_ISFINITE(_sub_mocap_odom.get().x)) { + y.setZero(); + y(Y_mocap_x) = _sub_mocap_odom.get().x; + y(Y_mocap_y) = _sub_mocap_odom.get().y; + y(Y_mocap_z) = _sub_mocap_odom.get().z; + _mocapStats.update(y); + + return OK; + + } else { + return -1; + } } } diff --git a/src/modules/local_position_estimator/sensors/vision.cpp b/src/modules/local_position_estimator/sensors/vision.cpp index ad20d3d3b9..71dbd528d7 100644 --- a/src/modules/local_position_estimator/sensors/vision.cpp +++ b/src/modules/local_position_estimator/sensors/vision.cpp @@ -65,10 +65,15 @@ void BlockLocalPositionEstimator::visionInit() int BlockLocalPositionEstimator::visionMeasure(Vector<float, n_y_vision> &y) { - if (PX4_ISFINITE(_sub_visual_odom.get().pose_covariance[0])) { + uint8_t x_variance = _sub_visual_odom.get().COVARIANCE_MATRIX_X_VARIANCE; + uint8_t y_variance = _sub_visual_odom.get().COVARIANCE_MATRIX_Y_VARIANCE; + uint8_t z_variance = _sub_visual_odom.get().COVARIANCE_MATRIX_Z_VARIANCE; + + if (PX4_ISFINITE(_sub_visual_odom.get().pose_covariance[x_variance])) { // check if the vision data is valid based on the covariances - _vision_eph = sqrtf(fmaxf(_sub_visual_odom.get().pose_covariance[0], _sub_visual_odom.get().pose_covariance[6])); - _vision_epv = sqrtf(_sub_visual_odom.get().pose_covariance[11]); + _vision_eph = sqrtf(fmaxf(_sub_visual_odom.get().pose_covariance[x_variance], + _sub_visual_odom.get().pose_covariance[y_variance])); + _vision_epv = sqrtf(_sub_visual_odom.get().pose_covariance[z_variance]); _vision_xy_valid = _vision_eph <= EP_MAX_STD_DEV; _vision_z_valid = _vision_epv <= EP_MAX_STD_DEV; @@ -83,13 +88,20 @@ int BlockLocalPositionEstimator::visionMeasure(Vector<float, n_y_vision> &y) return -1; } else { - y.setZero(); - y(Y_vision_x) = _sub_visual_odom.get().x; - y(Y_vision_y) = _sub_visual_odom.get().y; - y(Y_vision_z) = _sub_visual_odom.get().z; - _visionStats.update(y); _time_last_vision_p = _sub_visual_odom.get().timestamp; - return OK; + + if (PX4_ISFINITE(_sub_visual_odom.get().x)) { + y.setZero(); + y(Y_vision_x) = _sub_visual_odom.get().x; + y(Y_vision_y) = _sub_visual_odom.get().y; + y(Y_vision_z) = _sub_visual_odom.get().z; + _visionStats.update(y); + + return OK; + + } else { + return -1; + } } } diff --git a/src/modules/position_estimator_inav/position_estimator_inav_main.cpp b/src/modules/position_estimator_inav/position_estimator_inav_main.cpp index 790a72c7ca..17b5229402 100644 --- a/src/modules/position_estimator_inav/position_estimator_inav_main.cpp +++ b/src/modules/position_estimator_inav/position_estimator_inav_main.cpp @@ -792,13 +792,17 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) static float last_vision_y = 0.0f; static float last_vision_z = 0.0f; - vision_xy_valid = PX4_ISFINITE(visual_odom.pose_covariance[0]) ? sqrtf(fmaxf(visual_odom.pose_covariance[0], - visual_odom.pose_covariance[6])) > ep_max_std_dev : true; - vision_z_valid = PX4_ISFINITE(visual_odom.pose_covariance[0]) ? visual_odom.pose_covariance[11] > ep_max_std_dev : + vision_xy_valid = PX4_ISFINITE(visual_odom.pose_covariance[visual_odom.COVARIANCE_MATRIX_X_VARIANCE]) ? sqrtf(fmaxf( + visual_odom.pose_covariance[visual_odom.COVARIANCE_MATRIX_X_VARIANCE], + visual_odom.pose_covariance[visual_odom.COVARIANCE_MATRIX_Y_VARIANCE])) > ep_max_std_dev : true; + vision_z_valid = PX4_ISFINITE(visual_odom.pose_covariance[visual_odom.COVARIANCE_MATRIX_X_VARIANCE]) ? + visual_odom.pose_covariance[visual_odom.COVARIANCE_MATRIX_Z_VARIANCE] > ep_max_std_dev : true; - vision_vxy_valid = PX4_ISFINITE(visual_odom.velocity_covariance[0]) ? sqrtf(fmaxf(visual_odom.velocity_covariance[0], - visual_odom.velocity_covariance[6])) > ev_max_std_dev : true; - vision_vz_valid = PX4_ISFINITE(visual_odom.velocity_covariance[0]) ? visual_odom.velocity_covariance[11] > + vision_vxy_valid = PX4_ISFINITE(visual_odom.velocity_covariance[visual_odom.COVARIANCE_MATRIX_VX_VARIANCE]) ? sqrtf( + fmaxf(visual_odom.velocity_covariance[visual_odom.COVARIANCE_MATRIX_VX_VARIANCE], + visual_odom.velocity_covariance[visual_odom.COVARIANCE_MATRIX_VY_VARIANCE])) > ev_max_std_dev : true; + vision_vz_valid = PX4_ISFINITE(visual_odom.velocity_covariance[visual_odom.COVARIANCE_MATRIX_VX_VARIANCE]) ? + visual_odom.velocity_covariance[visual_odom.COVARIANCE_MATRIX_VZ_VARIANCE] > ep_max_std_dev : true; /* reset position estimate on first vision update */ @@ -913,9 +917,11 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) if (updated) { orb_copy(ORB_ID(vehicle_mocap_odometry), mocap_position_sub, &mocap); - mocap_xy_valid = (PX4_ISFINITE(mocap.pose_covariance[0]) ? sqrtf(fmaxf(mocap.pose_covariance[0], - mocap.pose_covariance[6])) > ep_max_std_dev : true) ? false : true; - mocap_z_valid = (PX4_ISFINITE(mocap.pose_covariance[0]) ? mocap.pose_covariance[11] > ep_max_std_dev : true) ? false : + mocap_xy_valid = (PX4_ISFINITE(mocap.pose_covariance[mocap.COVARIANCE_MATRIX_X_VARIANCE]) ? sqrtf(fmaxf( + mocap.pose_covariance[mocap.COVARIANCE_MATRIX_X_VARIANCE], + mocap.pose_covariance[mocap.COVARIANCE_MATRIX_Y_VARIANCE])) > ep_max_std_dev : true) ? false : true; + mocap_z_valid = (PX4_ISFINITE(mocap.pose_covariance[mocap.COVARIANCE_MATRIX_X_VARIANCE]) ? + mocap.pose_covariance[mocap.COVARIANCE_MATRIX_Z_VARIANCE] > ep_max_std_dev : true) ? false : true; if (!params.disable_mocap) { diff --git a/src/modules/simulator/simulator_mavlink.cpp b/src/modules/simulator/simulator_mavlink.cpp index 4b195135f7..dc52ca3dc8 100644 --- a/src/modules/simulator/simulator_mavlink.cpp +++ b/src/modules/simulator/simulator_mavlink.cpp @@ -1131,6 +1131,8 @@ int Simulator::publish_odometry_topic(mavlink_message_t *odom_mavlink) odom.timestamp = timestamp; + const size_t POS_URT_SIZE = sizeof(odom.pose_covariance) / sizeof(odom.pose_covariance[0]); + if (odom_mavlink->msgid == MAVLINK_MSG_ID_ODOMETRY) { mavlink_odometry_t odom_msg; mavlink_msg_odometry_decode(odom_mavlink, &odom_msg); @@ -1155,7 +1157,6 @@ int Simulator::publish_odometry_topic(mavlink_message_t *odom_mavlink) matrix::Quatf q(odom_msg.q[0], odom_msg.q[1], odom_msg.q[2], odom_msg.q[3]); q.copyTo(odom.q); - const size_t POS_URT_SIZE = sizeof(odom.pose_covariance) / sizeof(odom.pose_covariance[0]); static_assert(POS_URT_SIZE == (sizeof(odom_msg.pose_covariance) / sizeof(odom_msg.pose_covariance[0])), "Odometry Pose Covariance matrix URT array size mismatch"); @@ -1194,8 +1195,11 @@ int Simulator::publish_odometry_topic(mavlink_message_t *odom_mavlink) matrix::Quatf q(matrix::Eulerf(ev.roll, ev.pitch, ev.yaw)); q.copyTo(odom.q); + static_assert(POS_URT_SIZE == (sizeof(ev.covariance) / sizeof(ev.covariance[0])), + "Vision Position Estimate Pose Covariance matrix URT array size mismatch"); + /* The pose covariance URT */ - for (size_t i = 0; i < (sizeof(odom.pose_covariance) / sizeof(odom.pose_covariance[0])); i++) { + for (size_t i = 0; i < POS_URT_SIZE; i++) { odom.pose_covariance[i] = ev.covariance[i]; } -- GitLab