From 0e583e861d27ac07fd8e3a248c7cb5a854024ed6 Mon Sep 17 00:00:00 2001 From: Jaeyoung Lim Date: Thu, 6 Oct 2022 17:50:34 +0200 Subject: [PATCH] Add rate controller for rover controls --- .../init.d-posix/airframes/1060_rover | 1 - .../init.d-posix/airframes/1061_r1_rover | 1 - .../init.d-posix/airframes/1062_tf-r1 | 1 - .../init.d-posix/airframes/1070_boat | 10 +- .../airframes/50004_nxpcup_car_dfrobot_gpx | 1 - platforms/nuttx/NuttX/apps | 2 +- platforms/nuttx/NuttX/nuttx | 2 +- src/drivers/gps/devices | 2 +- src/lib/events/libevents | 2 +- src/modules/mavlink/mavlink | 2 +- src/modules/rover_pos_control/CMakeLists.txt | 2 + .../RoverPositionControl.cpp | 113 +++++++++++++--- .../RoverPositionControl.hpp | 33 ++++- .../rover_pos_control_params.c | 123 ++++++++++++++++-- 14 files changed, 248 insertions(+), 47 deletions(-) diff --git a/ROMFS/px4fmu_common/init.d-posix/airframes/1060_rover b/ROMFS/px4fmu_common/init.d-posix/airframes/1060_rover index 135dbbfbcf..90e08efa8d 100644 --- a/ROMFS/px4fmu_common/init.d-posix/airframes/1060_rover +++ b/ROMFS/px4fmu_common/init.d-posix/airframes/1060_rover @@ -25,7 +25,6 @@ param set-default NAV_LOITER_RAD 2 param set-default CBRK_AIRSPD_CHK 162128 param set-default GND_MAX_ANG 0.6 -param set-default GND_WHEEL_BASE 2.0 param set-default CA_AIRFRAME 5 diff --git a/ROMFS/px4fmu_common/init.d-posix/airframes/1061_r1_rover b/ROMFS/px4fmu_common/init.d-posix/airframes/1061_r1_rover index 2ef7a8a34d..f8897d4140 100644 --- a/ROMFS/px4fmu_common/init.d-posix/airframes/1061_r1_rover +++ b/ROMFS/px4fmu_common/init.d-posix/airframes/1061_r1_rover @@ -25,7 +25,6 @@ param set-default NAV_LOITER_RAD 2 param set-default CBRK_AIRSPD_CHK 162128 param set-default GND_MAX_ANG 0.6 -param set-default GND_WHEEL_BASE 2.0 param set-default CA_AIRFRAME 6 diff --git a/ROMFS/px4fmu_common/init.d-posix/airframes/1062_tf-r1 b/ROMFS/px4fmu_common/init.d-posix/airframes/1062_tf-r1 index d3cc92e2ee..549accaaa1 100644 --- a/ROMFS/px4fmu_common/init.d-posix/airframes/1062_tf-r1 +++ b/ROMFS/px4fmu_common/init.d-posix/airframes/1062_tf-r1 @@ -32,7 +32,6 @@ param set-default NAV_LOITER_RAD 2 param set-default CBRK_AIRSPD_CHK 162128 param set-default GND_MAX_ANG 0.6 -param set-default GND_WHEEL_BASE 3.0 param set-default CA_AIRFRAME 5 diff --git a/ROMFS/px4fmu_common/init.d-posix/airframes/1070_boat b/ROMFS/px4fmu_common/init.d-posix/airframes/1070_boat index b6556b710c..665a047f36 100644 --- a/ROMFS/px4fmu_common/init.d-posix/airframes/1070_boat +++ b/ROMFS/px4fmu_common/init.d-posix/airframes/1070_boat @@ -13,19 +13,23 @@ param set-default GND_SPEED_I 8 param set-default GND_SPEED_IMAX 0.125 param set-default GND_SPEED_P 2 param set-default GND_SPEED_THR_SC 1 -param set-default GND_SPEED_TRIM 1 +param set-default GND_SPEED_TRIM 3 param set-default GND_THR_CRUISE 0.85 param set-default GND_THR_MAX 1 param set-default GND_THR_MIN 0 +param set-default GND_RATE_P 0.08 +param set-default GND_RATE_D 0.02 +param set-default GND_RATE_FF 0.0 +param set-default GND_RATE_I 0.0 +param set-default GND_RATE_MAX 0.5 param set-default MIS_TAKEOFF_ALT 0.01 -param set-default NAV_ACC_RAD 0.5 +param set-default NAV_ACC_RAD 5 param set-default NAV_LOITER_RAD 2 param set-default CBRK_AIRSPD_CHK 162128 param set-default GND_MAX_ANG 0.6 -param set-default GND_WHEEL_BASE 2.0 param set-default CA_AIRFRAME 9 diff --git a/ROMFS/px4fmu_common/init.d/airframes/50004_nxpcup_car_dfrobot_gpx b/ROMFS/px4fmu_common/init.d/airframes/50004_nxpcup_car_dfrobot_gpx index d3660aa22a..2c1a64c2e6 100644 --- a/ROMFS/px4fmu_common/init.d/airframes/50004_nxpcup_car_dfrobot_gpx +++ b/ROMFS/px4fmu_common/init.d/airframes/50004_nxpcup_car_dfrobot_gpx @@ -34,7 +34,6 @@ param set-default GND_THR_MAX 0.5 # Differential drive acts like ackermann steering with a maximum turn angle of 60 degrees, or pi/3 radians param set-default GND_MAX_ANG 1.042 -param set-default GND_WHEEL_BASE 0.17 # TODO: Set to -1.0, to allow reversing. This will require many changes in the codebase # to support negative throttle. diff --git a/platforms/nuttx/NuttX/apps b/platforms/nuttx/NuttX/apps index a489381b49..6d9010f47e 160000 --- a/platforms/nuttx/NuttX/apps +++ b/platforms/nuttx/NuttX/apps @@ -1 +1 @@ -Subproject commit a489381b49835ecba6f3b873b5071d882a18152f +Subproject commit 6d9010f47e7b00d9d86bbdd4630c78cd8d57ba35 diff --git a/platforms/nuttx/NuttX/nuttx b/platforms/nuttx/NuttX/nuttx index b527c6a0af..6bafcb22b7 160000 --- a/platforms/nuttx/NuttX/nuttx +++ b/platforms/nuttx/NuttX/nuttx @@ -1 +1 @@ -Subproject commit b527c6a0af07dc184f4d9bfe5acd9a6546bd04a6 +Subproject commit 6bafcb22b7d62184fd1158c0b53c8dbd884275b8 diff --git a/src/drivers/gps/devices b/src/drivers/gps/devices index b49a6c2573..fa2177d690 160000 --- a/src/drivers/gps/devices +++ b/src/drivers/gps/devices @@ -1 +1 @@ -Subproject commit b49a6c257371abae6e26e0a3e0fc04b963b2f13d +Subproject commit fa2177d690207e42e0d8c92e9663578340d44fe4 diff --git a/src/lib/events/libevents b/src/lib/events/libevents index 0c8bc543db..179f86a8fc 160000 --- a/src/lib/events/libevents +++ b/src/lib/events/libevents @@ -1 +1 @@ -Subproject commit 0c8bc543db2f8c78f59214d5bcf959bdadd96677 +Subproject commit 179f86a8fc7fd74cb80630e77b1b9435d3c5b748 diff --git a/src/modules/mavlink/mavlink b/src/modules/mavlink/mavlink index d012c7afd5..1618ffb1e0 160000 --- a/src/modules/mavlink/mavlink +++ b/src/modules/mavlink/mavlink @@ -1 +1 @@ -Subproject commit d012c7afd5f4e2a9388710596fd3eb9a1b3eb086 +Subproject commit 1618ffb1e09e3bcf14272a00856d9a271a3bbd75 diff --git a/src/modules/rover_pos_control/CMakeLists.txt b/src/modules/rover_pos_control/CMakeLists.txt index 5e093862e7..2c42cce5fd 100644 --- a/src/modules/rover_pos_control/CMakeLists.txt +++ b/src/modules/rover_pos_control/CMakeLists.txt @@ -30,6 +30,7 @@ # POSSIBILITY OF SUCH DAMAGE. # ############################################################################ + px4_add_module( MODULE modules__rover_pos_control MAIN rover_pos_control @@ -37,6 +38,7 @@ px4_add_module( RoverPositionControl.cpp RoverPositionControl.hpp DEPENDS + RateControl l1 pid ) diff --git a/src/modules/rover_pos_control/RoverPositionControl.cpp b/src/modules/rover_pos_control/RoverPositionControl.cpp index 5e620948c4..02df877a84 100644 --- a/src/modules/rover_pos_control/RoverPositionControl.cpp +++ b/src/modules/rover_pos_control/RoverPositionControl.cpp @@ -102,6 +102,10 @@ void RoverPositionControl::parameters_update(bool force) _param_speed_d.get(), _param_speed_imax.get(), _param_gndspeed_max.get()); + _rate_control.setGains(matrix::Vector3f(0.0, 0.0, _param_rate_p.get()), matrix::Vector3f(0.0, 0.0, _param_rate_i.get()), + matrix::Vector3f(0.0, 0.0, _param_rate_d.get())); + _rate_control.setFeedForwardGain(matrix::Vector3f(0.0, 0.0, _param_rate_ff.get())); + _rate_control.setIntegratorLimit(matrix::Vector3f(0.0, 0.0, _param_rate_imax.get())); } } @@ -151,6 +155,17 @@ RoverPositionControl::manual_control_setpoint_poll() _attitude_sp_pub.publish(_att_sp); + } else if (_control_mode.flag_control_rates_enabled) { + // STABILIZED mode generate the attitude setpoint from manual user inputs + _rates_sp.roll = 0.0; + _rates_sp.pitch = 0.0; + _rates_sp.yaw = _manual_control_setpoint.y; + _rates_sp.thrust_body[0] = _manual_control_setpoint.z; + + _rates_sp.timestamp = hrt_absolute_time(); + + _rates_sp_pub.publish(_rates_sp); + } else { _act_controls.control[actuator_controls_s::INDEX_ROLL] = 0.0f; // Nominally roll: _manual_control_setpoint.roll; _act_controls.control[actuator_controls_s::INDEX_PITCH] = 0.0f; // Nominally pitch: -_manual_control_setpoint.pitch; @@ -187,6 +202,14 @@ RoverPositionControl::attitude_setpoint_poll() } } +void +RoverPositionControl::rates_setpoint_poll() +{ + if (_rates_sp_sub.updated()) { + _rates_sp_sub.copy(&_rates_sp); + } +} + void RoverPositionControl::vehicle_attitude_poll() { @@ -195,6 +218,14 @@ RoverPositionControl::vehicle_attitude_poll() } } +void +RoverPositionControl::vehicle_angular_acceleration_poll() +{ + if (_vehicle_angular_acceleration_sub.updated()) { + _vehicle_angular_acceleration_sub.copy(&_vehicle_angular_acceleration); + } +} + bool RoverPositionControl::control_position(const matrix::Vector2d ¤t_position, const matrix::Vector3f &ground_speed, const position_setpoint_triplet_s &pos_sp_triplet) @@ -232,6 +263,7 @@ RoverPositionControl::control_position(const matrix::Vector2d ¤t_position, matrix::Vector2f ground_speed_2d(ground_speed); float mission_throttle = _param_throttle_cruise.get(); + float max_yaw_rate = _param_rate_max.get(); /* Just control the throttle */ if (_param_speed_control_mode.get() == 1) { @@ -287,21 +319,29 @@ RoverPositionControl::control_position(const matrix::Vector2d ¤t_position, prev_wp(1)); _gnd_control.navigate_waypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed_2d); - _act_controls.control[actuator_controls_s::INDEX_THROTTLE] = mission_throttle; - - float desired_r = ground_speed_2d.norm_squared() / math::abs_t(_gnd_control.nav_lateral_acceleration_demand()); - float desired_theta = (0.5f * M_PI_F) - atan2f(desired_r, _param_wheel_base.get()); - float control_effort = (desired_theta / _param_max_turn_angle.get()) * sign( - _gnd_control.nav_lateral_acceleration_demand()); - control_effort = math::constrain(control_effort, -1.0f, 1.0f); - _act_controls.control[actuator_controls_s::INDEX_YAW] = control_effort; + ///WIP: Convert Lateral acceleration demand to rate control reference + float min_speed = _param_gndspeed_min.get(); + matrix::Vector2f saturated_speed_2d = (ground_speed_2d.norm() < min_speed) ? ground_speed_2d : + ground_speed_2d.normalized() * min_speed; + ///TODO: Max yaw rate + float desired_yaw_rate = _gnd_control.nav_lateral_acceleration_demand() / saturated_speed_2d.norm(); + _rates_sp.roll = 0.0; + _rates_sp.pitch = 0.0; + _rates_sp.yaw = math::constrain(desired_yaw_rate, -max_yaw_rate, max_yaw_rate); + _rates_sp.thrust_body[0] = math::constrain(mission_throttle, 0.0f, 1.0f); + _rates_sp.timestamp = hrt_absolute_time(); + _rates_sp_pub.publish(_rates_sp); } } break; case STOPPING: { - _act_controls.control[actuator_controls_s::INDEX_YAW] = 0.0f; - _act_controls.control[actuator_controls_s::INDEX_THROTTLE] = 0.0f; + _rates_sp.roll = 0.0; + _rates_sp.pitch = 0.0; + _rates_sp.yaw = 0.0; + _rates_sp.thrust_body[0] = 0.0; + _rates_sp.timestamp = hrt_absolute_time(); + _rates_sp_pub.publish(_rates_sp); // Note _prev_wp is different to the local prev_wp which is related to a mission waypoint. float dist_between_waypoints = get_distance_to_next_waypoint((double)_prev_wp(0), (double)_prev_wp(1), (double)curr_wp(0), (double)curr_wp(1)); @@ -380,31 +420,57 @@ RoverPositionControl::control_attitude(const vehicle_attitude_s &att, const vehi // quaternion attitude control law, qe is rotation from q to qd const Quatf qe = Quatf(att.q).inversed() * Quatf(att_sp.q_d); const Eulerf euler_sp = qe; + // PX4_INFO("Yaw error: %f", double(euler_sp(2))); - float control_effort = euler_sp(2) / _param_max_turn_angle.get(); - control_effort = math::constrain(control_effort, -1.0f, 1.0f); + _rates_sp.roll = 0.0; + _rates_sp.pitch = 0.0; + _rates_sp.yaw = euler_sp(2) / _param_max_turn_angle.get(); + _rates_sp.thrust_body[0] = math::constrain(att_sp.thrust_body[0], 0.0f, 1.0f); + _rates_sp.timestamp = hrt_absolute_time(); + _rates_sp_pub.publish(_rates_sp); +} - _act_controls.control[actuator_controls_s::INDEX_YAW] = control_effort; +void +RoverPositionControl::control_rates(const vehicle_angular_velocity_s &rates, const vehicle_angular_acceleration_s &acc, + const vehicle_local_position_s &local_pos, + const vehicle_rates_setpoint_s &rates_sp) +{ + float dt = (_control_rates_last_called > 0) ? hrt_elapsed_time(&_control_rates_last_called) * 1e-6f : 0.01f; + _control_rates_last_called = hrt_absolute_time(); - const float control_throttle = att_sp.thrust_body[0]; + const matrix::Vector3f vehicle_rates(rates.xyz[0], rates.xyz[1], rates.xyz[2]); + const matrix::Vector3f rates_setpoint(rates_sp.roll, rates_sp.pitch, rates_sp.yaw); + + const matrix::Vector3f current_velocity(local_pos.vx, local_pos.vy, local_pos.vz); + bool lock_integrator = bool(current_velocity.norm() < _param_rate_i_minspeed.get()); + + const matrix::Vector3f angular_acceleration{acc.xyz}; + const matrix::Vector3f torque = _rate_control.update(vehicle_rates, rates_setpoint, angular_acceleration, dt, + lock_integrator); + + _steering_input = math::constrain(_steering_input + torque(2), -1.0f, 1.0f); + + _act_controls.control[actuator_controls_s::INDEX_YAW] = _steering_input; + + const float control_throttle = rates_sp.thrust_body[0]; _act_controls.control[actuator_controls_s::INDEX_THROTTLE] = math::constrain(control_throttle, 0.0f, 1.0f); - } + void RoverPositionControl::Run() { parameters_update(true); /* run controller on gyro changes */ - vehicle_angular_velocity_s angular_velocity; - - if (_vehicle_angular_velocity_sub.update(&angular_velocity)) { - + if (_vehicle_angular_velocity_sub.update(&_vehicle_rates)) { + // grab corresponding vehicle_angular_acceleration immediately after vehicle_angular_velocity copy + vehicle_angular_acceleration_poll(); /* check vehicle control mode for changes to publication state */ vehicle_control_mode_poll(); attitude_setpoint_poll(); + rates_setpoint_poll(); vehicle_attitude_poll(); manual_control_setpoint_poll(); @@ -413,6 +479,10 @@ RoverPositionControl::Run() /* update parameters from storage */ parameters_update(); + if (!PX4_ISFINITE(_steering_input)) { + _steering_input = 0.0; + } + /* only run controller if position changed */ if (_local_pos_sub.update(&_local_pos)) { @@ -492,6 +562,11 @@ RoverPositionControl::Run() } + //Body Rate control + if (_control_mode.flag_control_rates_enabled) { + control_rates(_vehicle_rates, _vehicle_angular_acceleration, _local_pos, _rates_sp); + } + /* Only publish if any of the proper modes are enabled */ if (_control_mode.flag_control_velocity_enabled || _control_mode.flag_control_attitude_enabled || diff --git a/src/modules/rover_pos_control/RoverPositionControl.hpp b/src/modules/rover_pos_control/RoverPositionControl.hpp index 6d1e293d73..704bd4c0a0 100644 --- a/src/modules/rover_pos_control/RoverPositionControl.hpp +++ b/src/modules/rover_pos_control/RoverPositionControl.hpp @@ -41,14 +41,15 @@ * @author Marco Zorzi */ -#include +#include #include #include #include #include #include #include +#include #include #include #include @@ -67,6 +68,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -106,6 +110,7 @@ private: uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s}; + uORB::Publication _rates_sp_pub{ORB_ID(vehicle_rates_setpoint)}; uORB::Publication _attitude_sp_pub{ORB_ID(vehicle_attitude_setpoint)}; uORB::Publication _pos_ctrl_status_pub{ORB_ID(position_controller_status)}; /**< navigation capabilities publication */ uORB::Publication _actuator_controls_pub{ORB_ID(actuator_controls_0)}; /**< actuator controls publication */ @@ -118,15 +123,20 @@ private: uORB::Subscription _att_sub{ORB_ID(vehicle_attitude)}; uORB::Subscription _att_sp_sub{ORB_ID(vehicle_attitude_setpoint)}; uORB::Subscription _trajectory_setpoint_sub{ORB_ID(trajectory_setpoint)}; - + uORB::Subscription _rates_sp_sub{ORB_ID(vehicle_rates_setpoint)}; + uORB::Subscription _vehicle_angular_acceleration_sub{ORB_ID(vehicle_angular_acceleration)}; manual_control_setpoint_s _manual_control_setpoint{}; /**< r/c channel data */ position_setpoint_triplet_s _pos_sp_triplet{}; /**< triplet of mission items */ vehicle_attitude_setpoint_s _att_sp{}; /**< attitude setpoint > */ + vehicle_rates_setpoint_s _rates_sp{}; /**< rate setpoint > */ vehicle_control_mode_s _control_mode{}; /**< control mode */ vehicle_global_position_s _global_pos{}; /**< global vehicle position */ vehicle_local_position_s _local_pos{}; /**< global vehicle position */ actuator_controls_s _act_controls{}; /**< direct control of actuators */ vehicle_attitude_s _vehicle_att{}; + vehicle_angular_acceleration_s _vehicle_angular_acceleration{}; + vehicle_angular_velocity_s _vehicle_rates{}; + trajectory_setpoint_s _trajectory_setpoint{}; uORB::Publication _vehicle_thrust_setpoint_pub{ORB_ID(vehicle_thrust_setpoint)}; uORB::Publication _vehicle_torque_setpoint_pub{ORB_ID(vehicle_torque_setpoint)}; @@ -136,6 +146,7 @@ private: perf_counter_t _loop_perf; /**< loop performance counter */ hrt_abstime _control_position_last_called{0}; /**) _param_gndspeed_trim, (ParamFloat) _param_gndspeed_max, + (ParamFloat) _param_gndspeed_min, (ParamInt) _param_speed_control_mode, (ParamFloat) _param_speed_p, @@ -187,12 +201,20 @@ private: (ParamFloat) _param_speed_imax, (ParamFloat) _param_throttle_speed_scaler, + (ParamFloat) _param_rate_p, + (ParamFloat) _param_rate_i, + (ParamFloat) _param_rate_d, + (ParamFloat) _param_rate_ff, + (ParamFloat) _param_rate_imax, + (ParamFloat) _param_rate_max, + (ParamFloat) _param_rate_i_minspeed, + (ParamFloat) _param_throttle_min, (ParamFloat) _param_throttle_max, (ParamFloat) _param_throttle_cruise, - (ParamFloat) _param_wheel_base, (ParamFloat) _param_max_turn_angle, + (ParamFloat) _param_att_p, (ParamFloat) _param_gnd_man_y_max, (ParamFloat) _param_nav_loiter_rad /**< loiter radius for Rover */ ) @@ -204,8 +226,10 @@ private: void position_setpoint_triplet_poll(); void attitude_setpoint_poll(); + void rates_setpoint_poll(); void vehicle_control_mode_poll(); void vehicle_attitude_poll(); + void vehicle_angular_acceleration_poll(); void manual_control_setpoint_poll(); /** @@ -215,5 +239,8 @@ private: const position_setpoint_triplet_s &_pos_sp_triplet); void control_velocity(const matrix::Vector3f ¤t_velocity); void control_attitude(const vehicle_attitude_s &att, const vehicle_attitude_setpoint_s &att_sp); + void control_rates(const vehicle_angular_velocity_s &rates, const vehicle_angular_acceleration_s &acc, + const vehicle_local_position_s &local_pos, + const vehicle_rates_setpoint_s &rates_sp); }; diff --git a/src/modules/rover_pos_control/rover_pos_control_params.c b/src/modules/rover_pos_control/rover_pos_control_params.c index 6458fb1fea..df5a43067e 100644 --- a/src/modules/rover_pos_control/rover_pos_control_params.c +++ b/src/modules/rover_pos_control/rover_pos_control_params.c @@ -48,19 +48,6 @@ * Controller parameters, accessible via MAVLink */ -/** - * Distance from front axle to rear axle - * - * A value of 0.31 is typical for 1/10 RC cars. - * - * @unit m - * @min 0.0 - * @decimal 3 - * @increment 0.01 - * @group Rover Position Control - */ -PARAM_DEFINE_FLOAT(GND_WHEEL_BASE, 0.31f); - /** * L1 distance * @@ -247,6 +234,19 @@ PARAM_DEFINE_FLOAT(GND_SPEED_THR_SC, 1.0f); */ PARAM_DEFINE_FLOAT(GND_SPEED_TRIM, 3.0f); +/** + * Minimum ground speed + * + * + * @unit m/s + * @min 0.0 + * @max 40 + * @decimal 1 + * @increment 0.5 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_SPEED_MIN, 1.0f); + /** * Maximum ground speed * @@ -275,6 +275,19 @@ PARAM_DEFINE_FLOAT(GND_SPEED_MAX, 10.0f); */ PARAM_DEFINE_FLOAT(GND_MAX_ANG, 0.7854f); +/** + * Attitude control P gain + * + * + * @unit rad + * @min 0.0 + * @max 5.0 + * @decimal 3 + * @increment 0.01 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_ATT_P, 1.0f); + /** * Max manual yaw rate * @@ -285,3 +298,87 @@ PARAM_DEFINE_FLOAT(GND_MAX_ANG, 0.7854f); * @group Rover Position Control */ PARAM_DEFINE_FLOAT(GND_MAN_Y_MAX, 150.0f); + +/** + * Rover Rate Proportional Gain + * + * @unit rad/s + * @min 0.0 + * @max 10.0 + * @decimal 3 + * @increment 0.01 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_P, 5.0f); + +/** + * Rover Rate Integral Gain + * + * @unit rad/s + * @min 0.0 + * @max 1.0 + * @decimal 3 + * @increment 0.005 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_I, 0.5f); + +/** + * Rover Rate Integral Gain + * + * @unit rad/s + * @min 0.0 + * @max 1.0 + * @decimal 3 + * @increment 0.005 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_D, 0.0f); + +/** + * Rover Rate Proportional Gain + * + * @unit rad/s + * @min 0.0 + * @max 10.0 + * @decimal 3 + * @increment 0.01 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_FF, 1.6f); + +/** + * Rover Rate Maximum Integral Gain + * + * @unit rad/s + * @min 0.0 + * @max 50.0 + * @decimal 3 + * @increment 0.005 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_IMAX, 1.0f); + +/** + * Rover Rate Maximum Rate + * + * @unit rad/s + * @min 0.0 + * @max 1.0 + * @decimal 3 + * @increment 0.005 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_MAX, 0.5f); + +/** + * Rover Rate Integral Minimum speed + * + * @unit m/s + * @min 0.0 + * @max 50.0 + * @decimal 3 + * @increment 0.005 + * @group Rover Position Control + */ +PARAM_DEFINE_FLOAT(GND_RATE_IMINSPD, 1.0f);