mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-06-02 11:59:17 +08:00
rover: fix speed setpoint in position controller
This commit is contained in:
committed by
chfriedrich98
parent
54f2652329
commit
b8dacf5ae4
@@ -61,12 +61,14 @@ void AckermannPosControl::updatePosControl()
|
|||||||
if (target_waypoint_ned.isAllFinite()) {
|
if (target_waypoint_ned.isAllFinite()) {
|
||||||
float distance_to_target = (target_waypoint_ned - _curr_pos_ned).norm();
|
float distance_to_target = (target_waypoint_ned - _curr_pos_ned).norm();
|
||||||
|
|
||||||
if (distance_to_target > _acceptance_radius) {
|
if (_arrival_speed > FLT_EPSILON) {
|
||||||
float arrival_speed = PX4_ISFINITE(_rover_position_setpoint.arrival_speed) ? _rover_position_setpoint.arrival_speed :
|
distance_to_target -= _acceptance_radius; // shift target to the edge of the acceptance radius if arrival speed not zero
|
||||||
0.f;
|
}
|
||||||
const float distance = arrival_speed > 0.f + FLT_EPSILON ? distance_to_target - _acceptance_radius : distance_to_target;
|
|
||||||
|
if (distance_to_target > _acceptance_radius || _arrival_speed > FLT_EPSILON) {
|
||||||
|
|
||||||
float speed_setpoint = math::trajectory::computeMaxSpeedFromDistance(_param_ro_jerk_limit.get(),
|
float speed_setpoint = math::trajectory::computeMaxSpeedFromDistance(_param_ro_jerk_limit.get(),
|
||||||
_param_ro_decel_limit.get(), distance, fabsf(arrival_speed));
|
_param_ro_decel_limit.get(), distance_to_target, fabsf(_arrival_speed));
|
||||||
speed_setpoint = math::min(speed_setpoint, _param_ro_speed_limit.get());
|
speed_setpoint = math::min(speed_setpoint, _param_ro_speed_limit.get());
|
||||||
|
|
||||||
if (PX4_ISFINITE(_rover_position_setpoint.cruising_speed)) {
|
if (PX4_ISFINITE(_rover_position_setpoint.cruising_speed)) {
|
||||||
@@ -130,6 +132,7 @@ void AckermannPosControl::updateSubscriptions()
|
|||||||
_rover_position_setpoint_sub.copy(&_rover_position_setpoint);
|
_rover_position_setpoint_sub.copy(&_rover_position_setpoint);
|
||||||
_start_ned = Vector2f(_rover_position_setpoint.start_ned[0], _rover_position_setpoint.start_ned[1]);
|
_start_ned = Vector2f(_rover_position_setpoint.start_ned[0], _rover_position_setpoint.start_ned[1]);
|
||||||
_start_ned = _start_ned.isAllFinite() ? _start_ned : _curr_pos_ned;
|
_start_ned = _start_ned.isAllFinite() ? _start_ned : _curr_pos_ned;
|
||||||
|
_arrival_speed = PX4_ISFINITE(_rover_position_setpoint.arrival_speed) ? _rover_position_setpoint.arrival_speed : 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ private:
|
|||||||
Quatf _vehicle_attitude_quaternion{};
|
Quatf _vehicle_attitude_quaternion{};
|
||||||
Vector2f _curr_pos_ned{};
|
Vector2f _curr_pos_ned{};
|
||||||
Vector2f _start_ned{};
|
Vector2f _start_ned{};
|
||||||
|
float _arrival_speed{0.f};
|
||||||
float _vehicle_yaw{0.f};
|
float _vehicle_yaw{0.f};
|
||||||
float _max_yaw_rate{0.f};
|
float _max_yaw_rate{0.f};
|
||||||
float _acceptance_radius{0.f}; // Acceptance radius for the waypoint.
|
float _acceptance_radius{0.f}; // Acceptance radius for the waypoint.
|
||||||
|
|||||||
@@ -54,24 +54,19 @@ void DifferentialPosControl::updatePosControl()
|
|||||||
|
|
||||||
hrt_abstime timestamp = hrt_absolute_time();
|
hrt_abstime timestamp = hrt_absolute_time();
|
||||||
|
|
||||||
if (_rover_position_setpoint_sub.updated()) {
|
|
||||||
_rover_position_setpoint_sub.copy(&_rover_position_setpoint);
|
|
||||||
_start_ned = Vector2f(_rover_position_setpoint.start_ned[0], _rover_position_setpoint.start_ned[1]);
|
|
||||||
_start_ned = _start_ned.isAllFinite() ? _start_ned : _curr_pos_ned;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Vector2f target_waypoint_ned(_rover_position_setpoint.position_ned[0], _rover_position_setpoint.position_ned[1]);
|
const Vector2f target_waypoint_ned(_rover_position_setpoint.position_ned[0], _rover_position_setpoint.position_ned[1]);
|
||||||
|
|
||||||
if (target_waypoint_ned.isAllFinite()) {
|
if (target_waypoint_ned.isAllFinite()) {
|
||||||
float distance_to_target = (target_waypoint_ned - _curr_pos_ned).norm();
|
float distance_to_target = (target_waypoint_ned - _curr_pos_ned).norm();
|
||||||
|
|
||||||
if (distance_to_target > _param_nav_acc_rad.get()) {
|
if (_arrival_speed > FLT_EPSILON) {
|
||||||
float arrival_speed = PX4_ISFINITE(_rover_position_setpoint.arrival_speed) ? _rover_position_setpoint.arrival_speed :
|
distance_to_target -=
|
||||||
0.f;
|
_param_nav_acc_rad.get(); // shift target to the edge of the acceptance radius if arrival speed not zero
|
||||||
const float distance = arrival_speed > 0.f + FLT_EPSILON ? distance_to_target - _param_nav_acc_rad.get() :
|
}
|
||||||
distance_to_target;
|
|
||||||
|
if (distance_to_target > _param_nav_acc_rad.get() || _arrival_speed > FLT_EPSILON) {
|
||||||
float speed_setpoint = math::trajectory::computeMaxSpeedFromDistance(_param_ro_jerk_limit.get(),
|
float speed_setpoint = math::trajectory::computeMaxSpeedFromDistance(_param_ro_jerk_limit.get(),
|
||||||
_param_ro_decel_limit.get(), distance, fabsf(arrival_speed));
|
_param_ro_decel_limit.get(), distance_to_target, fabsf(_arrival_speed));
|
||||||
speed_setpoint = math::min(speed_setpoint, _param_ro_speed_limit.get());
|
speed_setpoint = math::min(speed_setpoint, _param_ro_speed_limit.get());
|
||||||
|
|
||||||
if (PX4_ISFINITE(_rover_position_setpoint.cruising_speed)) {
|
if (PX4_ISFINITE(_rover_position_setpoint.cruising_speed)) {
|
||||||
@@ -119,6 +114,14 @@ void DifferentialPosControl::updateSubscriptions()
|
|||||||
_curr_pos_ned = Vector2f(vehicle_local_position.x, vehicle_local_position.y);
|
_curr_pos_ned = Vector2f(vehicle_local_position.x, vehicle_local_position.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_rover_position_setpoint_sub.updated()) {
|
||||||
|
_rover_position_setpoint_sub.copy(&_rover_position_setpoint);
|
||||||
|
_start_ned = Vector2f(_rover_position_setpoint.start_ned[0], _rover_position_setpoint.start_ned[1]);
|
||||||
|
_start_ned = _start_ned.isAllFinite() ? _start_ned : _curr_pos_ned;
|
||||||
|
_arrival_speed = PX4_ISFINITE(_rover_position_setpoint.arrival_speed) ? _rover_position_setpoint.arrival_speed : 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DifferentialPosControl::runSanityChecks()
|
bool DifferentialPosControl::runSanityChecks()
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ private:
|
|||||||
// Variables
|
// Variables
|
||||||
Vector2f _curr_pos_ned{};
|
Vector2f _curr_pos_ned{};
|
||||||
Vector2f _start_ned{};
|
Vector2f _start_ned{};
|
||||||
|
float _arrival_speed{0.f};
|
||||||
float _vehicle_yaw{0.f};
|
float _vehicle_yaw{0.f};
|
||||||
|
|
||||||
DEFINE_PARAMETERS(
|
DEFINE_PARAMETERS(
|
||||||
|
|||||||
@@ -56,26 +56,21 @@ void MecanumPosControl::updatePosControl()
|
|||||||
|
|
||||||
hrt_abstime timestamp = hrt_absolute_time();
|
hrt_abstime timestamp = hrt_absolute_time();
|
||||||
|
|
||||||
if (_rover_position_setpoint_sub.updated()) {
|
|
||||||
_rover_position_setpoint_sub.copy(&_rover_position_setpoint);
|
|
||||||
_start_ned = Vector2f(_rover_position_setpoint.start_ned[0], _rover_position_setpoint.start_ned[1]);
|
|
||||||
_start_ned = _start_ned.isAllFinite() ? _start_ned : _curr_pos_ned;
|
|
||||||
_yaw_setpoint = PX4_ISFINITE(_rover_position_setpoint.yaw) ? _rover_position_setpoint.yaw : _vehicle_yaw;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Vector2f target_waypoint_ned(_rover_position_setpoint.position_ned[0], _rover_position_setpoint.position_ned[1]);
|
const Vector2f target_waypoint_ned(_rover_position_setpoint.position_ned[0], _rover_position_setpoint.position_ned[1]);
|
||||||
|
|
||||||
if (target_waypoint_ned.isAllFinite()) {
|
if (target_waypoint_ned.isAllFinite()) {
|
||||||
|
|
||||||
float distance_to_target = (target_waypoint_ned - _curr_pos_ned).norm();
|
float distance_to_target = (target_waypoint_ned - _curr_pos_ned).norm();
|
||||||
|
|
||||||
if (distance_to_target > _param_nav_acc_rad.get()) {
|
if (_arrival_speed > FLT_EPSILON) {
|
||||||
float arrival_speed = PX4_ISFINITE(_rover_position_setpoint.arrival_speed) ? _rover_position_setpoint.arrival_speed :
|
distance_to_target -=
|
||||||
0.f;
|
_param_nav_acc_rad.get(); // shift target to the edge of the acceptance radius if arrival speed not zero
|
||||||
const float distance = arrival_speed > 0.f + FLT_EPSILON ? distance_to_target - _param_nav_acc_rad.get() :
|
}
|
||||||
distance_to_target;
|
|
||||||
|
if (distance_to_target > _param_nav_acc_rad.get() || _arrival_speed > FLT_EPSILON) {
|
||||||
|
|
||||||
float speed_setpoint = math::trajectory::computeMaxSpeedFromDistance(_param_ro_jerk_limit.get(),
|
float speed_setpoint = math::trajectory::computeMaxSpeedFromDistance(_param_ro_jerk_limit.get(),
|
||||||
_param_ro_decel_limit.get(), distance, fabsf(arrival_speed));
|
_param_ro_decel_limit.get(), distance_to_target, fabsf(_arrival_speed));
|
||||||
speed_setpoint = math::min(speed_setpoint, _param_ro_speed_limit.get());
|
speed_setpoint = math::min(speed_setpoint, _param_ro_speed_limit.get());
|
||||||
|
|
||||||
if (PX4_ISFINITE(_rover_position_setpoint.cruising_speed)) {
|
if (PX4_ISFINITE(_rover_position_setpoint.cruising_speed)) {
|
||||||
@@ -130,6 +125,14 @@ void MecanumPosControl::updateSubscriptions()
|
|||||||
_curr_pos_ned = Vector2f(vehicle_local_position.x, vehicle_local_position.y);
|
_curr_pos_ned = Vector2f(vehicle_local_position.x, vehicle_local_position.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_rover_position_setpoint_sub.updated()) {
|
||||||
|
_rover_position_setpoint_sub.copy(&_rover_position_setpoint);
|
||||||
|
_start_ned = Vector2f(_rover_position_setpoint.start_ned[0], _rover_position_setpoint.start_ned[1]);
|
||||||
|
_start_ned = _start_ned.isAllFinite() ? _start_ned : _curr_pos_ned;
|
||||||
|
_yaw_setpoint = PX4_ISFINITE(_rover_position_setpoint.yaw) ? _rover_position_setpoint.yaw : _vehicle_yaw;
|
||||||
|
_arrival_speed = PX4_ISFINITE(_rover_position_setpoint.arrival_speed) ? _rover_position_setpoint.arrival_speed : 0.f;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MecanumPosControl::runSanityChecks()
|
bool MecanumPosControl::runSanityChecks()
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ private:
|
|||||||
Quatf _vehicle_attitude_quaternion{};
|
Quatf _vehicle_attitude_quaternion{};
|
||||||
Vector2f _curr_pos_ned{};
|
Vector2f _curr_pos_ned{};
|
||||||
Vector2f _start_ned{};
|
Vector2f _start_ned{};
|
||||||
|
float _arrival_speed{0.f};
|
||||||
float _vehicle_yaw{0.f};
|
float _vehicle_yaw{0.f};
|
||||||
float _max_yaw_rate{0.f};
|
float _max_yaw_rate{0.f};
|
||||||
float _yaw_setpoint{NAN};
|
float _yaw_setpoint{NAN};
|
||||||
|
|||||||
Reference in New Issue
Block a user