Skip to content

Commit 1345b35

Browse files
authored
Vehicle command for Prearm Safety button (#26079)
* added vehicle command and support to remotely activate/deactivate the safety system (#26078) * added print_status support for prearm safety status * updated safety button to map to MAV_CMD_DO_SET_SAFETY_SWITCH_STATE = '5300' * safety switch cmd: fixed incorrect catch-all and added commanded_state variable for easier reading
1 parent 8604604 commit 1345b35

File tree

4 files changed

+59
-0
lines changed

4 files changed

+59
-0
lines changed

msg/versioned/VehicleCommand.msg

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ uint16 VEHICLE_CMD_LOGGING_START = 2510 # Start streaming ULog data.
100100
uint16 VEHICLE_CMD_LOGGING_STOP = 2511 # Stop streaming ULog data.
101101
uint16 VEHICLE_CMD_CONTROL_HIGH_LATENCY = 2600 # Control starting/stopping transmitting data over the high latency link.
102102
uint16 VEHICLE_CMD_DO_VTOL_TRANSITION = 3000 # Command VTOL transition.
103+
uint16 VEHICLE_CMD_DO_SET_SAFETY_SWITCH_STATE = 5300 # Command safety on/off. |1 to activate safety, 0 to deactivate safety and allow control surface movements|Unused|Unused|Unused|Unused|Unused|Unused|
103104
uint16 VEHICLE_CMD_ARM_AUTHORIZATION_REQUEST = 3001 # Request arm authorization.
104105
uint16 VEHICLE_CMD_PAYLOAD_PREPARE_DEPLOY = 30001 # Prepare a payload deployment in the flight plan.
105106
uint16 VEHICLE_CMD_PAYLOAD_CONTROL_DEPLOY = 30002 # Control a pre-programmed payload deployment.
@@ -179,6 +180,10 @@ int8 ARMING_ACTION_ARM = 1
179180
uint8 GRIPPER_ACTION_RELEASE = 0
180181
uint8 GRIPPER_ACTION_GRAB = 1
181182

183+
# Used as param1 in DO_SET_SAFETY_SWITCH_STATE command.
184+
uint8 SAFETY_OFF = 0
185+
uint8 SAFETY_ON = 1
186+
182187
uint8 ORB_QUEUE_LENGTH = 8
183188

184189
float32 param1 # Parameter 1, as defined by MAVLink uint16 VEHICLE_CMD enum.

src/modules/commander/Commander.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,26 @@ int Commander::custom_command(int argc, char *argv[])
302302
return 0;
303303
}
304304

305+
if (!strcmp(argv[0], "safety")) {
306+
if (argc < 2) {
307+
PX4_ERR("missing argument");
308+
return 1;
309+
}
310+
311+
if (!strcmp(argv[1], "on")) {
312+
send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_SAFETY_SWITCH_STATE, vehicle_command_s::SAFETY_ON);
313+
314+
} else if (!strcmp(argv[1], "off")) {
315+
send_vehicle_command(vehicle_command_s::VEHICLE_CMD_DO_SET_SAFETY_SWITCH_STATE, vehicle_command_s::SAFETY_OFF);
316+
317+
} else {
318+
PX4_ERR("invlaid argument, use [on|off]");
319+
return 1;
320+
}
321+
322+
return 0;
323+
}
324+
305325
if (!strcmp(argv[0], "arm")) {
306326
float param2 = 0.f;
307327

@@ -495,6 +515,7 @@ int Commander::custom_command(int argc, char *argv[])
495515
int Commander::print_status()
496516
{
497517
PX4_INFO("%s", isArmed() ? "Armed" : "Disarmed");
518+
PX4_INFO("prearm safety: %s", _safety.isSafetyOff() ? "Off" : "On");
498519
PX4_INFO("navigation mode: %s", mode_util::nav_state_names[_vehicle_status.nav_state]);
499520
PX4_INFO("user intended navigation mode: %s", mode_util::nav_state_names[_vehicle_status.nav_state_user_intention]);
500521
PX4_INFO("in failsafe: %s", _failsafe.inFailsafe() ? "yes" : "no");
@@ -1508,6 +1529,29 @@ Commander::handle_command(const vehicle_command_s &cmd)
15081529
answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED);
15091530
break;
15101531

1532+
case vehicle_command_s::VEHICLE_CMD_DO_SET_SAFETY_SWITCH_STATE: {
1533+
// reject if armed, only allow pre or post flight for safety
1534+
if (isArmed()) {
1535+
answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_TEMPORARILY_REJECTED);
1536+
1537+
} else {
1538+
int commanded_state = (int)cmd.param1;
1539+
1540+
if (commanded_state == vehicle_command_s::SAFETY_OFF) {
1541+
_safety.deactivateSafety();
1542+
answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED);
1543+
1544+
} else if (commanded_state == vehicle_command_s::SAFETY_ON) {
1545+
_safety.activateSafety();
1546+
answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED);
1547+
1548+
} else {
1549+
answer_command(cmd, vehicle_command_ack_s::VEHICLE_CMD_RESULT_FAILED);
1550+
}
1551+
}
1552+
}
1553+
break;
1554+
15111555
case vehicle_command_s::VEHICLE_CMD_START_RX_PAIR:
15121556
case vehicle_command_s::VEHICLE_CMD_CUSTOM_0:
15131557
case vehicle_command_s::VEHICLE_CMD_CUSTOM_1:
@@ -3026,6 +3070,8 @@ The commander module contains the state machine for mode switching and failsafe
30263070
PRINT_MODULE_USAGE_ARG("mag|baro|accel|gyro|level|esc|airspeed", "Calibration type", false);
30273071
PRINT_MODULE_USAGE_ARG("quick", "Quick calibration [mag, accel (not recommended)]", false);
30283072
PRINT_MODULE_USAGE_COMMAND_DESCR("check", "Run preflight checks");
3073+
PRINT_MODULE_USAGE_COMMAND_DESCR("safety", "Change prearm safety state");
3074+
PRINT_MODULE_USAGE_ARG("on|off", "[on] to activate safety, [off] to deactivate safety and allow control surface movements", false);
30293075
PRINT_MODULE_USAGE_COMMAND("arm");
30303076
PRINT_MODULE_USAGE_PARAM_FLAG('f', "Force arming (do not run preflight checks)", true);
30313077
PRINT_MODULE_USAGE_COMMAND("disarm");

src/modules/commander/Safety.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,10 @@ void Safety::activateSafety()
7676
_safety_off = false;
7777
}
7878
}
79+
80+
void Safety::deactivateSafety()
81+
{
82+
if (!_safety_disabled) {
83+
_safety_off = true;
84+
}
85+
}

src/modules/commander/Safety.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class Safety
4949

5050
bool safetyButtonHandler();
5151
void activateSafety();
52+
void deactivateSafety();
5253
bool isButtonAvailable() const { return _button_available; }
5354
bool isSafetyOff() const { return _safety_off; }
5455
bool isSafetyDisabled() const { return _safety_disabled; }

0 commit comments

Comments
 (0)