mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-31 06:51:35 +08:00
commander: check for ack when calling 'commander takeoff'
This commit is contained in:
@@ -192,6 +192,24 @@ static bool send_vehicle_command(const uint32_t cmd, const float param1 = NAN, c
|
|||||||
return vcmd_pub.publish(vcmd);
|
return vcmd_pub.publish(vcmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool wait_for_vehicle_command_reply(const uint32_t cmd,
|
||||||
|
uORB::SubscriptionData<vehicle_command_ack_s> &vehicle_command_ack_sub)
|
||||||
|
{
|
||||||
|
hrt_abstime start = hrt_absolute_time();
|
||||||
|
|
||||||
|
while (hrt_absolute_time() - start < 100_ms) {
|
||||||
|
if (vehicle_command_ack_sub.update()) {
|
||||||
|
if (vehicle_command_ack_sub.get().command == cmd) {
|
||||||
|
return vehicle_command_ack_sub.get().result == vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
px4_usleep(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool broadcast_vehicle_command(const uint32_t cmd, const float param1 = NAN, const float param2 = NAN,
|
static bool broadcast_vehicle_command(const uint32_t cmd, const float param1 = NAN, const float param2 = NAN,
|
||||||
const float param3 = NAN, const float param4 = NAN, const double param5 = static_cast<double>(NAN),
|
const float param3 = NAN, const float param4 = NAN, const double param5 = static_cast<double>(NAN),
|
||||||
const double param6 = static_cast<double>(NAN), const float param7 = NAN)
|
const double param6 = static_cast<double>(NAN), const float param7 = NAN)
|
||||||
@@ -338,10 +356,14 @@ int Commander::custom_command(int argc, char *argv[])
|
|||||||
|
|
||||||
if (!strcmp(argv[0], "takeoff")) {
|
if (!strcmp(argv[0], "takeoff")) {
|
||||||
// switch to takeoff mode and arm
|
// switch to takeoff mode and arm
|
||||||
|
uORB::SubscriptionData<vehicle_command_ack_s> vehicle_command_ack_sub{ORB_ID(vehicle_command_ack)};
|
||||||
send_vehicle_command(vehicle_command_s::VEHICLE_CMD_NAV_TAKEOFF);
|
send_vehicle_command(vehicle_command_s::VEHICLE_CMD_NAV_TAKEOFF);
|
||||||
send_vehicle_command(vehicle_command_s::VEHICLE_CMD_COMPONENT_ARM_DISARM,
|
|
||||||
static_cast<float>(vehicle_command_s::ARMING_ACTION_ARM),
|
if (wait_for_vehicle_command_reply(vehicle_command_s::VEHICLE_CMD_NAV_TAKEOFF, vehicle_command_ack_sub)) {
|
||||||
0.f);
|
send_vehicle_command(vehicle_command_s::VEHICLE_CMD_COMPONENT_ARM_DISARM,
|
||||||
|
static_cast<float>(vehicle_command_s::ARMING_ACTION_ARM),
|
||||||
|
0.f);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1190,12 +1212,12 @@ Commander::handle_command(const vehicle_command_s &cmd)
|
|||||||
cmd_result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED;
|
cmd_result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
mavlink_log_critical(&_mavlink_log_pub, "Takeoff denied! Please disarm and retry\t");
|
mavlink_log_critical(&_mavlink_log_pub, "Takeoff denied!\t");
|
||||||
/* EVENT
|
/* EVENT
|
||||||
* @description Check for a valid position estimate
|
* @description Check for a valid position estimate
|
||||||
*/
|
*/
|
||||||
events::send(events::ID("commander_takeoff_denied"), {events::Log::Critical, events::LogInternal::Info},
|
events::send(events::ID("commander_takeoff_denied"), {events::Log::Critical, events::LogInternal::Info},
|
||||||
"Takeoff denied! Please disarm and retry");
|
"Takeoff denied!");
|
||||||
cmd_result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_TEMPORARILY_REJECTED;
|
cmd_result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_TEMPORARILY_REJECTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user