|
|
|
@ -7,7 +7,6 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
@@ -7,7 +7,6 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
|
|
|
|
|
{ |
|
|
|
|
uint8_t base_mode = MAV_MODE_FLAG_CUSTOM_MODE_ENABLED; |
|
|
|
|
uint8_t system_status = MAV_STATE_ACTIVE; |
|
|
|
|
const uint32_t custom_mode = control_mode; |
|
|
|
|
|
|
|
|
|
if (failsafe.triggered != 0) { |
|
|
|
|
system_status = MAV_STATE_CRITICAL; |
|
|
|
@ -21,30 +20,16 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
@@ -21,30 +20,16 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
|
|
|
|
|
// only get useful information from the custom_mode, which maps to
|
|
|
|
|
// the APM flight mode and has a well defined meaning in the
|
|
|
|
|
// ArduPlane documentation
|
|
|
|
|
switch (control_mode) { |
|
|
|
|
case MANUAL: |
|
|
|
|
case LEARNING: |
|
|
|
|
case STEERING: |
|
|
|
|
base_mode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED; |
|
|
|
|
break; |
|
|
|
|
case AUTO: |
|
|
|
|
case RTL: |
|
|
|
|
case GUIDED: |
|
|
|
|
base_mode = MAV_MODE_FLAG_GUIDED_ENABLED; |
|
|
|
|
// note that MAV_MODE_FLAG_AUTO_ENABLED does not match what
|
|
|
|
|
// APM does in any mode, as that is defined as "system finds its own goal
|
|
|
|
|
// positions", which APM does not currently do
|
|
|
|
|
break; |
|
|
|
|
case INITIALISING: |
|
|
|
|
system_status = MAV_STATE_CALIBRATING; |
|
|
|
|
break; |
|
|
|
|
case HOLD: |
|
|
|
|
system_status = 0; |
|
|
|
|
break; |
|
|
|
|
if (control_mode->has_manual_input()) { |
|
|
|
|
base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(ENABLE_STICK_MIXING) && (ENABLE_STICK_MIXING == ENABLED) |
|
|
|
|
if (control_mode != INITIALISING) { |
|
|
|
|
if (control_mode->is_autopilot_mode()) { |
|
|
|
|
base_mode |= MAV_MODE_FLAG_GUIDED_ENABLED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if defined(ENABLE_STICK_MIXING) && (ENABLE_STICK_MIXING == ENABLED) // TODO ???? Remove !
|
|
|
|
|
if (control_mode->stick_mixing_enabled()) { |
|
|
|
|
// all modes except INITIALISING have some form of manual
|
|
|
|
|
// override if stick mixing is enabled
|
|
|
|
|
base_mode |= MAV_MODE_FLAG_MANUAL_INPUT_ENABLED; |
|
|
|
@ -54,9 +39,14 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
@@ -54,9 +39,14 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
|
|
|
|
|
#if HIL_MODE != HIL_MODE_DISABLED |
|
|
|
|
base_mode |= MAV_MODE_FLAG_HIL_ENABLED; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if (control_mode == &mode_initializing) { |
|
|
|
|
system_status = MAV_STATE_CALIBRATING; |
|
|
|
|
} |
|
|
|
|
if (control_mode == &mode_hold) { |
|
|
|
|
system_status = MAV_STATE_STANDBY; |
|
|
|
|
} |
|
|
|
|
// we are armed if we are not initialising
|
|
|
|
|
if (control_mode != INITIALISING && arming.is_armed()) { |
|
|
|
|
if (control_mode != &mode_initializing && arming.is_armed()) { |
|
|
|
|
base_mode |= MAV_MODE_FLAG_SAFETY_ARMED; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -65,7 +55,7 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
@@ -65,7 +55,7 @@ void Rover::send_heartbeat(mavlink_channel_t chan)
|
|
|
|
|
|
|
|
|
|
gcs().chan(chan-MAVLINK_COMM_0).send_heartbeat(MAV_TYPE_GROUND_ROVER, |
|
|
|
|
base_mode, |
|
|
|
|
custom_mode, |
|
|
|
|
control_mode->mode_number(), |
|
|
|
|
system_status); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -140,7 +130,7 @@ void Rover::send_nav_controller_output(mavlink_channel_t chan)
@@ -140,7 +130,7 @@ void Rover::send_nav_controller_output(mavlink_channel_t chan)
|
|
|
|
|
{ |
|
|
|
|
mavlink_msg_nav_controller_output_send( |
|
|
|
|
chan, |
|
|
|
|
lateral_acceleration, // use nav_roll to hold demanded Y accel
|
|
|
|
|
control_mode->lateral_acceleration, // use nav_roll to hold demanded Y accel
|
|
|
|
|
ahrs.groundspeed() * ins.get_gyro().z, // use nav_pitch to hold actual Y accel
|
|
|
|
|
nav_controller->nav_bearing_cd() * 0.01f, |
|
|
|
|
nav_controller->target_bearing_cd() * 0.01f, |
|
|
|
@ -343,7 +333,7 @@ bool GCS_MAVLINK_Rover::try_send_message(enum ap_message id)
@@ -343,7 +333,7 @@ bool GCS_MAVLINK_Rover::try_send_message(enum ap_message id)
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case MSG_NAV_CONTROLLER_OUTPUT: |
|
|
|
|
if (rover.control_mode != MANUAL) { |
|
|
|
|
if (rover.control_mode->is_autopilot_mode()) { |
|
|
|
|
CHECK_PAYLOAD_SIZE(NAV_CONTROLLER_OUTPUT); |
|
|
|
|
rover.send_nav_controller_output(chan); |
|
|
|
|
} |
|
|
|
@ -672,7 +662,7 @@ GCS_MAVLINK_Rover::data_stream_send(void)
@@ -672,7 +662,7 @@ GCS_MAVLINK_Rover::data_stream_send(void)
|
|
|
|
|
if (stream_trigger(STREAM_EXTRA1)) { |
|
|
|
|
send_message(MSG_ATTITUDE); |
|
|
|
|
send_message(MSG_SIMSTATE); |
|
|
|
|
if (rover.control_mode != MANUAL) { |
|
|
|
|
if (rover.control_mode->is_autopilot_mode()) { |
|
|
|
|
send_message(MSG_PID_TUNING); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -708,14 +698,11 @@ GCS_MAVLINK_Rover::data_stream_send(void)
@@ -708,14 +698,11 @@ GCS_MAVLINK_Rover::data_stream_send(void)
|
|
|
|
|
|
|
|
|
|
bool GCS_MAVLINK_Rover::handle_guided_request(AP_Mission::Mission_Command &cmd) |
|
|
|
|
{ |
|
|
|
|
if (rover.control_mode != GUIDED) { |
|
|
|
|
if (rover.control_mode != &rover.mode_guided) { |
|
|
|
|
// only accept position updates when in GUIDED mode
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// This method is only called when we are in Guided WP GUIDED mode
|
|
|
|
|
rover.guided_mode = Guided_WP; |
|
|
|
|
|
|
|
|
|
// make any new wp uploaded instant (in case we are already in Guided mode)
|
|
|
|
|
rover.set_guided_WP(cmd.content.location); |
|
|
|
|
return true; |
|
|
|
@ -796,7 +783,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -796,7 +783,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
switch (packet.command) { |
|
|
|
|
|
|
|
|
|
case MAV_CMD_NAV_RETURN_TO_LAUNCH: |
|
|
|
|
rover.set_mode(RTL); |
|
|
|
|
rover.set_mode(rover.mode_rtl); |
|
|
|
|
result = MAV_RESULT_ACCEPTED; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -863,7 +850,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -863,7 +850,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case MAV_CMD_MISSION_START: |
|
|
|
|
rover.set_mode(AUTO); |
|
|
|
|
rover.set_mode(rover.mode_auto); |
|
|
|
|
result = MAV_RESULT_ACCEPTED; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -920,19 +907,19 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -920,19 +907,19 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
switch (static_cast<uint16_t>(packet.param1)) { |
|
|
|
|
case MAV_MODE_MANUAL_ARMED: |
|
|
|
|
case MAV_MODE_MANUAL_DISARMED: |
|
|
|
|
rover.set_mode(MANUAL); |
|
|
|
|
rover.set_mode(rover.mode_manual); |
|
|
|
|
result = MAV_RESULT_ACCEPTED; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case MAV_MODE_AUTO_ARMED: |
|
|
|
|
case MAV_MODE_AUTO_DISARMED: |
|
|
|
|
rover.set_mode(AUTO); |
|
|
|
|
rover.set_mode(rover.mode_auto); |
|
|
|
|
result = MAV_RESULT_ACCEPTED; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case MAV_MODE_STABILIZE_DISARMED: |
|
|
|
|
case MAV_MODE_STABILIZE_ARMED: |
|
|
|
|
rover.set_mode(LEARNING); |
|
|
|
|
rover.set_mode(rover.mode_learning); |
|
|
|
|
result = MAV_RESULT_ACCEPTED; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -1014,11 +1001,11 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -1014,11 +1001,11 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
// param2 : Speed - normalized to 0 .. 1
|
|
|
|
|
|
|
|
|
|
// exit if vehicle is not in Guided mode
|
|
|
|
|
if (rover.control_mode != GUIDED) { |
|
|
|
|
if (rover.control_mode != &rover.mode_guided) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rover.guided_mode = Guided_Angle; |
|
|
|
|
rover.mode_guided.guided_mode = ModeGuided::Guided_Angle; |
|
|
|
|
rover.guided_control.msg_time_ms = AP_HAL::millis(); |
|
|
|
|
rover.guided_control.turn_angle = packet.param1; |
|
|
|
|
rover.guided_control.target_speed = constrain_float(packet.param2, 0.0f, 1.0f); |
|
|
|
@ -1132,7 +1119,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -1132,7 +1119,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
mavlink_msg_set_attitude_target_decode(msg, &packet); |
|
|
|
|
|
|
|
|
|
// exit if vehicle is not in Guided mode
|
|
|
|
|
if (rover.control_mode != GUIDED) { |
|
|
|
|
if (rover.control_mode != &rover.mode_guided) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
// record the time when the last message arrived
|
|
|
|
@ -1173,7 +1160,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -1173,7 +1160,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
mavlink_msg_set_position_target_local_ned_decode(msg, &packet); |
|
|
|
|
|
|
|
|
|
// exit if vehicle is not in Guided mode
|
|
|
|
|
if (rover.control_mode != GUIDED) { |
|
|
|
|
if (rover.control_mode != &rover.mode_guided) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1258,7 +1245,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
@@ -1258,7 +1245,7 @@ void GCS_MAVLINK_Rover::handleMessage(mavlink_message_t* msg)
|
|
|
|
|
mavlink_msg_set_position_target_global_int_decode(msg, &packet); |
|
|
|
|
|
|
|
|
|
// exit if vehicle is not in Guided mode
|
|
|
|
|
if (rover.control_mode != GUIDED) { |
|
|
|
|
if (rover.control_mode != &rover.mode_guided) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
// check for supported coordinate frames
|
|
|
|
|