Skip to content

Commit f4247ae

Browse files
authored
rover_mecanum: enable yaw control via MAVLink SET_POSITION_TARGET commands (#26218)
* rover_mecanum: enable yaw control via MAVLink SET_POSITION_TARGET commands * Maintain the original judgment conditions --------- Co-authored-by: V <null>
1 parent ec8f343 commit f4247ae

File tree

6 files changed

+20
-15
lines changed

6 files changed

+20
-15
lines changed

src/modules/mavlink/mavlink_receiver.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1115,6 +1115,8 @@ MavlinkReceiver::handle_message_set_position_target_local_ned(mavlink_message_t
11151115
ocm.position = !matrix::Vector3f(setpoint.position).isAllNan();
11161116
ocm.velocity = !matrix::Vector3f(setpoint.velocity).isAllNan();
11171117
ocm.acceleration = !matrix::Vector3f(setpoint.acceleration).isAllNan();
1118+
ocm.attitude = PX4_ISFINITE(setpoint.yaw);
1119+
ocm.body_rate = PX4_ISFINITE(setpoint.yawspeed);
11181120

11191121
if (ocm.acceleration && (type_mask & POSITION_TARGET_TYPEMASK_FORCE_SET)) {
11201122
mavlink_log_critical(&_mavlink_log_pub, "SET_POSITION_TARGET_LOCAL_NED force not supported\t");
@@ -1237,6 +1239,8 @@ MavlinkReceiver::handle_message_set_position_target_global_int(mavlink_message_t
12371239
ocm.position = !matrix::Vector3f(setpoint.position).isAllNan();
12381240
ocm.velocity = !matrix::Vector3f(setpoint.velocity).isAllNan();
12391241
ocm.acceleration = !matrix::Vector3f(setpoint.acceleration).isAllNan();
1242+
ocm.attitude = PX4_ISFINITE(setpoint.yaw);
1243+
ocm.body_rate = PX4_ISFINITE(setpoint.yawspeed);
12401244

12411245
if (ocm.acceleration && (type_mask & POSITION_TARGET_TYPEMASK_FORCE_SET)) {
12421246
mavlink_log_critical(&_mavlink_log_pub, "SET_POSITION_TARGET_GLOBAL_INT force not supported\t");

src/modules/rover_mecanum/MecanumAttControl/MecanumAttControl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ void MecanumAttControl::updateAttControl()
7676
rover_attitude_setpoint_s rover_attitude_setpoint{};
7777
_rover_attitude_setpoint_sub.copy(&rover_attitude_setpoint);
7878
_yaw_setpoint = rover_attitude_setpoint.yaw_setpoint;
79+
_last_yaw_setpoint_timestamp = hrt_absolute_time();
80+
}
81+
82+
if (hrt_elapsed_time(&_last_yaw_setpoint_timestamp) > YAW_SETPOINT_TIMEOUT_US) {
83+
_yaw_setpoint = NAN;
7984
}
8085

8186
if (PX4_ISFINITE(_yaw_setpoint)) {

src/modules/rover_mecanum/MecanumAttControl/MecanumAttControl.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#pragma once
3535

3636
// PX4 includes
37+
#include <drivers/drv_hrt.h>
3738
#include <px4_platform_common/module_params.h>
3839
#include <px4_platform_common/events.h>
3940

@@ -52,6 +53,8 @@
5253
#include <uORB/topics/rover_attitude_status.h>
5354
#include <uORB/topics/rover_attitude_setpoint.h>
5455

56+
using namespace time_literals;
57+
5558
/**
5659
* @brief Class for mecanum attitude control.
5760
*/
@@ -103,6 +106,10 @@ class MecanumAttControl : public ModuleParams
103106
float _max_yaw_rate{0.f};
104107
float _yaw_setpoint{NAN};
105108

109+
hrt_abstime _last_yaw_setpoint_timestamp{0};
110+
/** Timeout in us for yaw setpoint to get considered invalid */
111+
static constexpr uint64_t YAW_SETPOINT_TIMEOUT_US = 500_ms;
112+
106113
// Controllers
107114
PID _pid_yaw;
108115
SlewRateYaw<float> _adjusted_yaw_setpoint;

src/modules/rover_mecanum/MecanumDriveModes/MecanumOffboardMode/MecanumOffboardMode.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,10 @@ void MecanumOffboardMode::offboardControl()
8888
rover_attitude_setpoint.yaw_setpoint = atan2f(velocity_ned(1), velocity_ned(0));
8989
_rover_attitude_setpoint_pub.publish(rover_attitude_setpoint);
9090

91-
} else if (offboard_control_mode.attitude) {
91+
}
92+
93+
// For Mecanum wheel systems, attitude and position control can be decoupled
94+
if (offboard_control_mode.attitude) {
9295
rover_attitude_setpoint_s rover_attitude_setpoint{};
9396
rover_attitude_setpoint.timestamp = hrt_absolute_time();
9497
rover_attitude_setpoint.yaw_setpoint = trajectory_setpoint.yaw;

src/modules/rover_mecanum/MecanumPosControl/MecanumPosControl.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ MecanumPosControl::MecanumPosControl(ModuleParams *parent) : ModuleParams(parent
4747
void MecanumPosControl::updateParams()
4848
{
4949
ModuleParams::updateParams();
50-
_max_yaw_rate = _param_ro_yaw_rate_limit.get() * M_DEG_TO_RAD_F;
51-
5250
}
5351

5452
void MecanumPosControl::updatePosControl()
@@ -89,21 +87,13 @@ void MecanumPosControl::updatePosControl()
8987
rover_speed_setpoint.speed_body_x = velocity_in_body_frame(0);
9088
rover_speed_setpoint.speed_body_y = velocity_in_body_frame(1);
9189
_rover_speed_setpoint_pub.publish(rover_speed_setpoint);
92-
rover_attitude_setpoint_s rover_attitude_setpoint{};
93-
rover_attitude_setpoint.timestamp = timestamp;
94-
rover_attitude_setpoint.yaw_setpoint = _yaw_setpoint;
95-
_rover_attitude_setpoint_pub.publish(rover_attitude_setpoint);
9690

9791
} else {
9892
rover_speed_setpoint_s rover_speed_setpoint{};
9993
rover_speed_setpoint.timestamp = timestamp;
10094
rover_speed_setpoint.speed_body_x = 0.f;
10195
rover_speed_setpoint.speed_body_y = 0.f;
10296
_rover_speed_setpoint_pub.publish(rover_speed_setpoint);
103-
rover_attitude_setpoint_s rover_attitude_setpoint{};
104-
rover_attitude_setpoint.timestamp = timestamp;
105-
rover_attitude_setpoint.yaw_setpoint = _vehicle_yaw;
106-
_rover_attitude_setpoint_pub.publish(rover_attitude_setpoint);
10797

10898
if (!_stopped && fabsf(_vehicle_speed) < FLT_EPSILON) {
10999
_stopped = true;
@@ -124,7 +114,6 @@ void MecanumPosControl::updateSubscriptions()
124114
vehicle_attitude_s vehicle_attitude{};
125115
_vehicle_attitude_sub.copy(&vehicle_attitude);
126116
_vehicle_attitude_quaternion = matrix::Quatf(vehicle_attitude.q);
127-
_vehicle_yaw = matrix::Eulerf(_vehicle_attitude_quaternion).psi();
128117
}
129118

130119
if (_vehicle_local_position_sub.updated()) {

src/modules/rover_mecanum/MecanumPosControl/MecanumPosControl.hpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ class MecanumPosControl : public ModuleParams
114114
Vector2f _start_ned{};
115115
Vector2f _target_waypoint_ned{};
116116
float _arrival_speed{0.f};
117-
float _vehicle_yaw{0.f};
118-
float _max_yaw_rate{0.f};
119-
float _yaw_setpoint{NAN};
120117
float _vehicle_speed{0.f};
121118
float _cruising_speed{NAN};
122119
bool _stopped{false};

0 commit comments

Comments
 (0)