Skip to content

Commit 2bd01bc

Browse files
Sub: implement set_target_angle_and_climbrate for scripting
1 parent cf8650a commit 2bd01bc

File tree

4 files changed

+43
-1
lines changed

4 files changed

+43
-1
lines changed

ArduSub/Sub.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,34 @@ void Sub::update_batt_compass()
218218
}
219219
}
220220

221+
#if AP_SCRIPTING_ENABLED
222+
bool Sub::set_target_velocity_NED(const Vector3f& target_vel_ned_ms)
223+
{
224+
// exit if vehicle is not in Guided mode or Auto-Guided mode
225+
if (!flightmode->in_guided_mode()) {
226+
return false;
227+
}
228+
229+
const Vector3f vel_neu_ms{target_vel_ned_ms.x, target_vel_ned_ms.y, -target_vel_ned_ms.z};
230+
mode_guided.set_vel_NEU_ms(vel_neu_ms);
231+
return true;
232+
}
233+
234+
// set target roll pitch and yaw angles with throttle (for use by scripting)
235+
bool Sub::set_target_angle_and_climbrate(float roll_deg, float pitch_deg, float yaw_deg, float climb_rate_ms, bool use_yaw_rate, float yaw_rate_degs)
236+
{
237+
// exit if vehicle is not in Guided mode or Auto-Guided mode
238+
if (!flightmode->in_guided_mode()) {
239+
return false;
240+
}
241+
242+
Quaternion q;
243+
q.from_euler(radians(roll_deg), radians(pitch_deg), radians(yaw_deg));
244+
245+
mode_guided.guided_set_angle(q, climb_rate_ms * 100);
246+
return true;
247+
}
248+
#endif // AP_SCRIPTING_ENABLED
221249
#if HAL_LOGGING_ENABLED
222250
// ten_hz_logging_loop
223251
// should be run at 10hz

ArduSub/Sub.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,9 @@ class Sub : public AP_Vehicle {
650650
// For Lua scripting, so index is 1..4, not 0..3
651651
uint8_t get_and_clear_button_count(uint8_t index);
652652

653+
bool set_target_velocity_NED(const Vector3f& vel_ned) override;
654+
bool set_target_angle_and_climbrate(float roll_deg, float pitch_deg, float yaw_deg, float climb_rate_ms, bool use_yaw_rate, float yaw_rate_degs) override;
655+
653656
#if AP_RANGEFINDER_ENABLED
654657
float get_rangefinder_target_cm() const WARN_IF_UNUSED { return mode_surftrak.get_rangefinder_target_cm(); }
655658
bool set_rangefinder_target_cm(float new_target_cm) { return mode_surftrak.set_rangefinder_target_cm(new_target_cm); }

ArduSub/mode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ class ModeGuided : public Mode
278278
float get_auto_heading();
279279
void guided_limit_clear();
280280
void set_auto_yaw_mode(autopilot_yaw_mode yaw_mode);
281+
void set_vel_NEU_ms(const Vector3f& vel_neu_ms);
281282

282283
protected:
283284

ArduSub/mode_guided.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ struct {
1717
float pitch_cd;
1818
float yaw_cd;
1919
float climb_rate_cms;
20-
} static guided_angle_state = {0,0.0f, 0.0f, 0.0f, 0.0f};
20+
float speed_forward_cms;
21+
float speed_lateral_cms;
22+
} static guided_angle_state = {0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
2123

2224
struct Guided_Limit {
2325
uint32_t timeout_ms; // timeout (in seconds) from the time that guided is invoked
@@ -717,6 +719,8 @@ void ModeGuided::guided_angle_control_run()
717719
// call attitude controller
718720
attitude_control->input_euler_angle_roll_pitch_yaw_cd(roll_in, pitch_in, yaw_in, true);
719721

722+
motors.set_lateral(guided_angle_state.speed_lateral_cms * 0.01);
723+
motors.set_forward(guided_angle_state.speed_forward_cms * 0.01);
720724
// call position controller
721725
position_control->set_pos_target_U_from_climb_rate_cm(climb_rate_cms);
722726
position_control->update_U_controller();
@@ -733,6 +737,12 @@ void ModeGuided::guided_limit_clear()
733737
guided_limit.horiz_max_cm = 0.0f;
734738
}
735739

740+
void ModeGuided::set_vel_NEU_ms(const Vector3f& vel_neu_ms) {
741+
guided_angle_state.speed_forward_cms = vel_neu_ms.x * 100.0f;
742+
guided_angle_state.speed_lateral_cms = vel_neu_ms.y * 100.0f;
743+
guided_angle_state.climb_rate_cms = vel_neu_ms.z * 100.0f;
744+
guided_angle_state.update_time_ms = AP_HAL::millis();
745+
}
736746

737747
// set_auto_yaw_mode - sets the yaw mode for auto
738748
void ModeGuided::set_auto_yaw_mode(autopilot_yaw_mode yaw_mode)

0 commit comments

Comments
 (0)