AP_Mount: move get_bf_yaw to be a method on the object it takes

This commit is contained in:
Peter Barker 2023-03-25 14:50:56 +11:00 committed by Randy Mackay
parent 5f469f2596
commit 07160e2985
7 changed files with 23 additions and 23 deletions

View File

@ -162,7 +162,7 @@ void AP_Mount_Alexmos::control_axis(const MountTarget& angle_target_rad)
outgoing_buffer.angle_speed.speed_pitch = DEGREE_PER_SEC_TO_VALUE(AP_MOUNT_ALEXMOS_SPEED); outgoing_buffer.angle_speed.speed_pitch = DEGREE_PER_SEC_TO_VALUE(AP_MOUNT_ALEXMOS_SPEED);
outgoing_buffer.angle_speed.angle_pitch = DEGREE_TO_VALUE(degrees(angle_target_rad.pitch)); outgoing_buffer.angle_speed.angle_pitch = DEGREE_TO_VALUE(degrees(angle_target_rad.pitch));
outgoing_buffer.angle_speed.speed_yaw = DEGREE_PER_SEC_TO_VALUE(AP_MOUNT_ALEXMOS_SPEED); outgoing_buffer.angle_speed.speed_yaw = DEGREE_PER_SEC_TO_VALUE(AP_MOUNT_ALEXMOS_SPEED);
outgoing_buffer.angle_speed.angle_yaw = DEGREE_TO_VALUE(degrees(get_bf_yaw_angle(angle_target_rad))); outgoing_buffer.angle_speed.angle_yaw = DEGREE_TO_VALUE(angle_target_rad.get_bf_yaw());
send_command(CMD_CONTROL, (uint8_t *)&outgoing_buffer.angle_speed, sizeof(alexmos_angles_speed)); send_command(CMD_CONTROL, (uint8_t *)&outgoing_buffer.angle_speed, sizeof(alexmos_angles_speed));
} }

View File

@ -466,27 +466,27 @@ bool AP_Mount_Backend::get_angle_target_to_roi(MountTarget& angle_rad) const
} }
// return body-frame yaw angle from a mount target // return body-frame yaw angle from a mount target
float AP_Mount_Backend::get_bf_yaw_angle(const MountTarget& angle_rad) const float AP_Mount_Backend::MountTarget::get_bf_yaw() const
{ {
if (angle_rad.yaw_is_ef) { if (yaw_is_ef) {
// convert to body-frame // convert to body-frame
return wrap_PI(angle_rad.yaw - AP::ahrs().yaw); return wrap_PI(yaw - AP::ahrs().yaw);
} }
// target is already body-frame // target is already body-frame
return angle_rad.yaw; return yaw;
} }
// return earth-frame yaw angle from a mount target // return earth-frame yaw angle from a mount target
float AP_Mount_Backend::get_ef_yaw_angle(const MountTarget& angle_rad) const float AP_Mount_Backend::MountTarget::get_ef_yaw() const
{ {
if (angle_rad.yaw_is_ef) { if (yaw_is_ef) {
// target is already earth-frame // target is already earth-frame
return angle_rad.yaw; return yaw;
} }
// convert to earth-frame // convert to earth-frame
return wrap_PI(angle_rad.yaw + AP::ahrs().yaw); return wrap_PI(yaw + AP::ahrs().yaw);
} }
// update angle targets using a given rate target // update angle targets using a given rate target
@ -501,9 +501,9 @@ void AP_Mount_Backend::update_angle_target_from_rate(const MountTarget& rate_rad
// ensure angle yaw frames matches rate yaw frame // ensure angle yaw frames matches rate yaw frame
if (angle_rad.yaw_is_ef != rate_rad.yaw_is_ef) { if (angle_rad.yaw_is_ef != rate_rad.yaw_is_ef) {
if (rate_rad.yaw_is_ef) { if (rate_rad.yaw_is_ef) {
angle_rad.yaw = get_ef_yaw_angle(angle_rad); angle_rad.yaw = angle_rad.get_ef_yaw();
} else { } else {
angle_rad.yaw = get_bf_yaw_angle(angle_rad); angle_rad.yaw = angle_rad.get_bf_yaw();
} }
angle_rad.yaw_is_ef = rate_rad.yaw_is_ef; angle_rad.yaw_is_ef = rate_rad.yaw_is_ef;
} }

View File

@ -161,6 +161,12 @@ protected:
float pitch; float pitch;
float yaw; float yaw;
bool yaw_is_ef; bool yaw_is_ef;
// return body-frame yaw angle from a mount target (in radians)
float get_bf_yaw() const;
// return earth-frame yaw angle from a mount target (in radians)
float get_ef_yaw() const;
}; };
// returns true if user has configured a valid yaw angle range // returns true if user has configured a valid yaw angle range
@ -197,12 +203,6 @@ protected:
// returns true on success, false on failure // returns true on success, false on failure
bool get_angle_target_to_sysid(MountTarget& angle_rad) const WARN_IF_UNUSED; bool get_angle_target_to_sysid(MountTarget& angle_rad) const WARN_IF_UNUSED;
// return body-frame yaw angle from a mount target
float get_bf_yaw_angle(const MountTarget& angle_rad) const;
// return earth-frame yaw angle from a mount target
float get_ef_yaw_angle(const MountTarget& angle_rad) const;
// update angle targets using a given rate target // update angle targets using a given rate target
// the resulting angle_rad yaw frame will match the rate_rad yaw frame // the resulting angle_rad yaw frame will match the rate_rad yaw frame
// assumes a 50hz update rate // assumes a 50hz update rate

View File

@ -102,7 +102,7 @@ void AP_Mount_SToRM32::update()
// get attitude as a quaternion. returns true on success // get attitude as a quaternion. returns true on success
bool AP_Mount_SToRM32::get_attitude_quaternion(Quaternion& att_quat) bool AP_Mount_SToRM32::get_attitude_quaternion(Quaternion& att_quat)
{ {
att_quat.from_euler(_angle_rad.roll, _angle_rad.pitch, get_bf_yaw_angle(_angle_rad)); att_quat.from_euler(_angle_rad.roll, _angle_rad.pitch, _angle_rad.get_bf_yaw());
return true; return true;
} }
@ -149,7 +149,7 @@ void AP_Mount_SToRM32::send_do_mount_control(const MountTarget& angle_target_rad
0, // confirmation of zero means this is the first time this message has been sent 0, // confirmation of zero means this is the first time this message has been sent
-degrees(angle_target_rad.pitch), -degrees(angle_target_rad.pitch),
degrees(angle_target_rad.roll), degrees(angle_target_rad.roll),
-degrees(get_bf_yaw_angle(angle_target_rad)), -degrees(angle_target_rad.get_bf_yaw()),
0, 0, 0, // param4 ~ param6 unused 0, 0, 0, // param4 ~ param6 unused
MAV_MOUNT_MODE_MAVLINK_TARGETING); MAV_MOUNT_MODE_MAVLINK_TARGETING);

View File

@ -171,7 +171,7 @@ void AP_Mount_SToRM32_serial::send_target_angles(const MountTarget& angle_target
// send CMD_SETANGLE (Note: reversed pitch and yaw) // send CMD_SETANGLE (Note: reversed pitch and yaw)
cmd_set_angles_data.pitch = -degrees(angle_target_rad.pitch); cmd_set_angles_data.pitch = -degrees(angle_target_rad.pitch);
cmd_set_angles_data.roll = degrees(angle_target_rad.roll); cmd_set_angles_data.roll = degrees(angle_target_rad.roll);
cmd_set_angles_data.yaw = -degrees(get_bf_yaw_angle(angle_target_rad)); cmd_set_angles_data.yaw = -degrees(angle_target_rad.get_bf_yaw());
uint8_t* buf = (uint8_t*)&cmd_set_angles_data; uint8_t* buf = (uint8_t*)&cmd_set_angles_data;

View File

@ -139,7 +139,7 @@ void AP_Mount_Servo::update_angle_outputs(const MountTarget& angle_rad)
const AP_AHRS &ahrs = AP::ahrs(); const AP_AHRS &ahrs = AP::ahrs();
// get target yaw in body-frame with limits applied // get target yaw in body-frame with limits applied
const float yaw_bf_rad = constrain_float(get_bf_yaw_angle(angle_rad), radians(_params.yaw_angle_min), radians(_params.yaw_angle_max)); const float yaw_bf_rad = constrain_float(angle_rad.get_bf_yaw(), radians(_params.yaw_angle_min), radians(_params.yaw_angle_max));
// default output to target earth-frame roll and pitch angles, body-frame yaw // default output to target earth-frame roll and pitch angles, body-frame yaw
_angle_bf_output_rad.x = angle_rad.roll; _angle_bf_output_rad.x = angle_rad.roll;

View File

@ -106,7 +106,7 @@ bool AP_Mount_SoloGimbal::get_attitude_quaternion(Quaternion& att_quat)
if (!_gimbal.aligned()) { if (!_gimbal.aligned()) {
return false; return false;
} }
att_quat.from_euler(_angle_rad.roll, _angle_rad.pitch, get_bf_yaw_angle(_angle_rad)); att_quat.from_euler(_angle_rad.roll, _angle_rad.pitch, _angle_rad.get_bf_yaw());
return true; return true;
} }
@ -115,7 +115,7 @@ bool AP_Mount_SoloGimbal::get_attitude_quaternion(Quaternion& att_quat)
*/ */
void AP_Mount_SoloGimbal::handle_gimbal_report(mavlink_channel_t chan, const mavlink_message_t &msg) void AP_Mount_SoloGimbal::handle_gimbal_report(mavlink_channel_t chan, const mavlink_message_t &msg)
{ {
_gimbal.update_target(Vector3f{_angle_rad.roll, _angle_rad.pitch, get_bf_yaw_angle(_angle_rad)}); _gimbal.update_target(Vector3f{_angle_rad.roll, _angle_rad.pitch, _angle_rad.get_bf_yaw()});
_gimbal.receive_feedback(chan,msg); _gimbal.receive_feedback(chan,msg);
AP_Logger *logger = AP_Logger::get_singleton(); AP_Logger *logger = AP_Logger::get_singleton();