mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 18:47:21 +08:00
Remove q_valid flag from attitude topic
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
# This is similar to the mavlink message ATTITUDE, but for onboard use
|
# This is similar to the mavlink message ATTITUDE_QUATERNION, but for onboard use
|
||||||
float32 rollspeed # Angular velocity about body north axis (x) in rad/s
|
float32 rollspeed # Angular velocity about body north axis (x) in rad/s
|
||||||
float32 pitchspeed # Angular velocity about body east axis (y) in rad/s
|
float32 pitchspeed # Angular velocity about body east axis (y) in rad/s
|
||||||
float32 yawspeed # Angular velocity about body down axis (z) in rad/s
|
float32 yawspeed # Angular velocity about body down axis (z) in rad/s
|
||||||
float32[4] q # Quaternion (NED)
|
float32[4] q # Quaternion (NED)
|
||||||
bool q_valid # Quaternion valid
|
|
||||||
|
|
||||||
# TOPICS vehicle_attitude vehicle_attitude_groundtruth
|
# TOPICS vehicle_attitude vehicle_attitude_groundtruth
|
||||||
|
|||||||
@@ -617,7 +617,6 @@ int attitude_estimator_ekf_thread_main(int argc, char *argv[])
|
|||||||
matrix::Quaternion<float> q(Ro);
|
matrix::Quaternion<float> q(Ro);
|
||||||
|
|
||||||
memcpy(&att.q[0],&q._data[0],sizeof(att.q));
|
memcpy(&att.q[0],&q._data[0],sizeof(att.q));
|
||||||
att.q_valid = true;
|
|
||||||
|
|
||||||
if (PX4_ISFINITE(att.q[0]) && PX4_ISFINITE(att.q[1])
|
if (PX4_ISFINITE(att.q[0]) && PX4_ISFINITE(att.q[1])
|
||||||
&& PX4_ISFINITE(att.q[2]) && PX4_ISFINITE(att.q[3])) {
|
&& PX4_ISFINITE(att.q[2]) && PX4_ISFINITE(att.q[3])) {
|
||||||
@@ -625,7 +624,7 @@ int attitude_estimator_ekf_thread_main(int argc, char *argv[])
|
|||||||
orb_publish(ORB_ID(vehicle_attitude), pub_att, &att);
|
orb_publish(ORB_ID(vehicle_attitude), pub_att, &att);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
warnx("ERR: NaN estimate!");
|
PX4_ERR("ERR: NaN estimate!");
|
||||||
}
|
}
|
||||||
|
|
||||||
perf_end(ekf_loop_perf);
|
perf_end(ekf_loop_perf);
|
||||||
|
|||||||
@@ -826,7 +826,6 @@ void AttitudePositionEstimatorEKF::publishAttitude()
|
|||||||
_att.q[1] = _ekf->states[1];
|
_att.q[1] = _ekf->states[1];
|
||||||
_att.q[2] = _ekf->states[2];
|
_att.q[2] = _ekf->states[2];
|
||||||
_att.q[3] = _ekf->states[3];
|
_att.q[3] = _ekf->states[3];
|
||||||
_att.q_valid = true;
|
|
||||||
|
|
||||||
_att.rollspeed = _ekf->dAngIMU.x / _ekf->dtIMU - _ekf->states[10] / _ekf->dtIMUfilt;
|
_att.rollspeed = _ekf->dAngIMU.x / _ekf->dtIMU - _ekf->states[10] / _ekf->dtIMUfilt;
|
||||||
_att.pitchspeed = _ekf->dAngIMU.y / _ekf->dtIMU - _ekf->states[11] / _ekf->dtIMUfilt;
|
_att.pitchspeed = _ekf->dAngIMU.y / _ekf->dtIMU - _ekf->states[11] / _ekf->dtIMUfilt;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "terrain_estimator.h"
|
#include "terrain_estimator.h"
|
||||||
|
#include <geo/geo.h>
|
||||||
|
|
||||||
#define DISTANCE_TIMEOUT 100000 // time in usec after which laser is considered dead
|
#define DISTANCE_TIMEOUT 100000 // time in usec after which laser is considered dead
|
||||||
|
|
||||||
@@ -65,17 +66,12 @@ void TerrainEstimator::predict(float dt, const struct vehicle_attitude_s *attitu
|
|||||||
const struct sensor_combined_s *sensor,
|
const struct sensor_combined_s *sensor,
|
||||||
const struct distance_sensor_s *distance)
|
const struct distance_sensor_s *distance)
|
||||||
{
|
{
|
||||||
if (attitude->q_valid) {
|
|
||||||
matrix::Quaternion<float> q(&attitude->q[0]);
|
matrix::Quaternion<float> q(&attitude->q[0]);
|
||||||
matrix::Dcm<float> R_att(q);
|
matrix::Dcm<float> R_att(q);
|
||||||
matrix::Vector<float, 3> a(&sensor->accelerometer_m_s2[0]);
|
matrix::Vector<float, 3> a(&sensor->accelerometer_m_s2[0]);
|
||||||
matrix::Vector<float, 3> u;
|
matrix::Vector<float, 3> u;
|
||||||
u = R_att * a;
|
u = R_att * a;
|
||||||
_u_z = u(2) + 9.81f; // compensate for gravity
|
_u_z = u(2) + CONSTANTS_ONE_G; // compensate for gravity
|
||||||
|
|
||||||
} else {
|
|
||||||
_u_z = 0.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// dynamics matrix
|
// dynamics matrix
|
||||||
matrix::Matrix<float, n_x, n_x> A;
|
matrix::Matrix<float, n_x, n_x> A;
|
||||||
|
|||||||
@@ -473,7 +473,6 @@ void AttitudeEstimatorQ::task_main()
|
|||||||
att.yawspeed = _rates(2);
|
att.yawspeed = _rates(2);
|
||||||
|
|
||||||
memcpy(&att.q[0], _q.data, sizeof(att.q));
|
memcpy(&att.q[0], _q.data, sizeof(att.q));
|
||||||
att.q_valid = true;
|
|
||||||
|
|
||||||
/* the instance count is not used here */
|
/* the instance count is not used here */
|
||||||
int att_inst;
|
int att_inst;
|
||||||
|
|||||||
@@ -726,7 +726,6 @@ void Ekf2::task_main()
|
|||||||
att.q[1] = q(1);
|
att.q[1] = q(1);
|
||||||
att.q[2] = q(2);
|
att.q[2] = q(2);
|
||||||
att.q[3] = q(3);
|
att.q[3] = q(3);
|
||||||
att.q_valid = true;
|
|
||||||
|
|
||||||
att.rollspeed = gyro_rad[0];
|
att.rollspeed = gyro_rad[0];
|
||||||
att.pitchspeed = gyro_rad[1];
|
att.pitchspeed = gyro_rad[1];
|
||||||
|
|||||||
@@ -535,15 +535,15 @@ void Ekf2Replay::logIfUpdated()
|
|||||||
log_message.body.att.q_x = att.q[1];
|
log_message.body.att.q_x = att.q[1];
|
||||||
log_message.body.att.q_y = att.q[2];
|
log_message.body.att.q_y = att.q[2];
|
||||||
log_message.body.att.q_z = att.q[3];
|
log_message.body.att.q_z = att.q[3];
|
||||||
log_message.body.att.roll = att.roll;
|
log_message.body.att.roll = 0;
|
||||||
log_message.body.att.pitch = att.pitch;
|
log_message.body.att.pitch = 0;
|
||||||
log_message.body.att.yaw = att.yaw;
|
log_message.body.att.yaw = 0;
|
||||||
log_message.body.att.roll_rate = att.rollspeed;
|
log_message.body.att.roll_rate = att.rollspeed;
|
||||||
log_message.body.att.pitch_rate = att.pitchspeed;
|
log_message.body.att.pitch_rate = att.pitchspeed;
|
||||||
log_message.body.att.yaw_rate = att.yawspeed;
|
log_message.body.att.yaw_rate = att.yawspeed;
|
||||||
log_message.body.att.gx = att.g_comp[0];
|
log_message.body.att.gx = 0;
|
||||||
log_message.body.att.gy = att.g_comp[1];
|
log_message.body.att.gy = 0;
|
||||||
log_message.body.att.gz = att.g_comp[2];
|
log_message.body.att.gz = 0;
|
||||||
|
|
||||||
writeMessage(_write_fd, (void *)&log_message.head1, _formats[LOG_ATT_MSG].length);
|
writeMessage(_write_fd, (void *)&log_message.head1, _formats[LOG_ATT_MSG].length);
|
||||||
|
|
||||||
|
|||||||
@@ -929,7 +929,7 @@ void BlockLocalPositionEstimator::predict()
|
|||||||
// state or covariance
|
// state or covariance
|
||||||
if (!_validXY && !_validZ) { return; }
|
if (!_validXY && !_validZ) { return; }
|
||||||
|
|
||||||
if (integrate && _sub_att.get().q_valid) {
|
if (integrate) {
|
||||||
matrix::Quaternion<float> q(&_sub_att.get().q[0]);
|
matrix::Quaternion<float> q(&_sub_att.get().q[0]);
|
||||||
_eul = matrix::Euler<float>(q);
|
_eul = matrix::Euler<float>(q);
|
||||||
_R_att = matrix::Dcm<float>(q);
|
_R_att = matrix::Dcm<float>(q);
|
||||||
|
|||||||
@@ -1925,7 +1925,6 @@ MavlinkReceiver::handle_message_hil_state_quaternion(mavlink_message_t *msg)
|
|||||||
hil_attitude.q[1] = q(1);
|
hil_attitude.q[1] = q(1);
|
||||||
hil_attitude.q[2] = q(2);
|
hil_attitude.q[2] = q(2);
|
||||||
hil_attitude.q[3] = q(3);
|
hil_attitude.q[3] = q(3);
|
||||||
hil_attitude.q_valid = true;
|
|
||||||
|
|
||||||
hil_attitude.rollspeed = hil_state.rollspeed;
|
hil_attitude.rollspeed = hil_state.rollspeed;
|
||||||
hil_attitude.pitchspeed = hil_state.pitchspeed;
|
hil_attitude.pitchspeed = hil_state.pitchspeed;
|
||||||
|
|||||||
@@ -507,7 +507,6 @@ int position_estimator_inav_thread_main(int argc, char *argv[])
|
|||||||
orb_copy(ORB_ID(sensor_combined), sensor_combined_sub, &sensor);
|
orb_copy(ORB_ID(sensor_combined), sensor_combined_sub, &sensor);
|
||||||
|
|
||||||
if (sensor.timestamp + sensor.accelerometer_timestamp_relative != accel_timestamp) {
|
if (sensor.timestamp + sensor.accelerometer_timestamp_relative != accel_timestamp) {
|
||||||
if (att.q_valid) {
|
|
||||||
/* correct accel bias */
|
/* correct accel bias */
|
||||||
sensor.accelerometer_m_s2[0] -= acc_bias[0];
|
sensor.accelerometer_m_s2[0] -= acc_bias[0];
|
||||||
sensor.accelerometer_m_s2[1] -= acc_bias[1];
|
sensor.accelerometer_m_s2[1] -= acc_bias[1];
|
||||||
@@ -524,10 +523,6 @@ int position_estimator_inav_thread_main(int argc, char *argv[])
|
|||||||
|
|
||||||
acc[2] += CONSTANTS_ONE_G;
|
acc[2] += CONSTANTS_ONE_G;
|
||||||
|
|
||||||
} else {
|
|
||||||
memset(acc, 0, sizeof(acc));
|
|
||||||
}
|
|
||||||
|
|
||||||
accel_timestamp = sensor.timestamp + sensor.accelerometer_timestamp_relative;
|
accel_timestamp = sensor.timestamp + sensor.accelerometer_timestamp_relative;
|
||||||
accel_updates++;
|
accel_updates++;
|
||||||
}
|
}
|
||||||
@@ -551,7 +546,8 @@ int position_estimator_inav_thread_main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (updated) { //check if altitude estimation for lidar is enabled and new sensor data
|
if (updated) { //check if altitude estimation for lidar is enabled and new sensor data
|
||||||
|
|
||||||
if (params.enable_lidar_alt_est && lidar.current_distance > lidar.min_distance && lidar.current_distance < lidar.max_distance
|
if (params.enable_lidar_alt_est && lidar.current_distance > lidar.min_distance
|
||||||
|
&& lidar.current_distance < lidar.max_distance
|
||||||
&& (R(2, 2) > 0.7f)) {
|
&& (R(2, 2) > 0.7f)) {
|
||||||
|
|
||||||
if (!use_lidar_prev && use_lidar) {
|
if (!use_lidar_prev && use_lidar) {
|
||||||
@@ -614,7 +610,7 @@ int position_estimator_inav_thread_main(int argc, char *argv[])
|
|||||||
float body_v_est[2] = { 0.0f, 0.0f };
|
float body_v_est[2] = { 0.0f, 0.0f };
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
body_v_est[i] = R( 0, i) * x_est[1] + R(1, i) * y_est[1] + R(2, i) * z_est[1];
|
body_v_est[i] = R(0, i) * x_est[1] + R(1, i) * y_est[1] + R(2, i) * z_est[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set this flag if flow should be accurate according to current velocity and attitude rate estimate */
|
/* set this flag if flow should be accurate according to current velocity and attitude rate estimate */
|
||||||
|
|||||||
@@ -321,7 +321,6 @@ void Simulator::handle_message(mavlink_message_t *msg, bool publish)
|
|||||||
hil_attitude.q[1] = q(1);
|
hil_attitude.q[1] = q(1);
|
||||||
hil_attitude.q[2] = q(2);
|
hil_attitude.q[2] = q(2);
|
||||||
hil_attitude.q[3] = q(3);
|
hil_attitude.q[3] = q(3);
|
||||||
hil_attitude.q_valid = true;
|
|
||||||
|
|
||||||
hil_attitude.rollspeed = hil_state.rollspeed;
|
hil_attitude.rollspeed = hil_state.rollspeed;
|
||||||
hil_attitude.pitchspeed = hil_state.pitchspeed;
|
hil_attitude.pitchspeed = hil_state.pitchspeed;
|
||||||
|
|||||||
Reference in New Issue
Block a user