Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Ardupilot
GitHub Repository: Ardupilot/ardupilot
Path: blob/master/libraries/AP_DDS/AP_DDS_ExternalControl.cpp
9381 views
1
#include "AP_DDS_config.h"
2
3
#if AP_DDS_ENABLED
4
5
#include "AP_DDS_ExternalControl.h"
6
#include "AP_DDS_Frames.h"
7
#include <AP_AHRS/AP_AHRS.h>
8
9
#include <AP_ExternalControl/AP_ExternalControl.h>
10
11
bool AP_DDS_External_Control::handle_global_position_control(ardupilot_msgs_msg_GlobalPosition& cmd_pos)
12
{
13
auto *external_control = AP::externalcontrol();
14
if (external_control == nullptr) {
15
return false;
16
}
17
18
if (strcmp(cmd_pos.header.frame_id, MAP_FRAME) == 0) {
19
// Narrow the altitude
20
const int32_t alt_cm = static_cast<int32_t>(cmd_pos.altitude * 100);
21
22
Location::AltFrame alt_frame;
23
if (!convert_alt_frame(cmd_pos.coordinate_frame, alt_frame)) {
24
return false;
25
}
26
27
constexpr uint32_t MASK_POS_IGNORE =
28
GlobalPosition::IGNORE_LATITUDE |
29
GlobalPosition::IGNORE_LONGITUDE |
30
GlobalPosition::IGNORE_ALTITUDE;
31
32
if (!(cmd_pos.type_mask & MASK_POS_IGNORE)) {
33
Location loc(cmd_pos.latitude * 1E7, cmd_pos.longitude * 1E7, alt_cm, alt_frame);
34
if (!external_control->set_global_position(loc)) {
35
return false; // Don't try sending other commands if this fails
36
}
37
}
38
39
// TODO add velocity and accel handling
40
41
return true;
42
}
43
44
return false;
45
}
46
47
bool AP_DDS_External_Control::handle_velocity_control(geometry_msgs_msg_TwistStamped& cmd_vel)
48
{
49
auto *external_control = AP::externalcontrol();
50
if (external_control == nullptr) {
51
return false;
52
}
53
54
if (strcmp(cmd_vel.header.frame_id, BASE_LINK_FRAME_ID) == 0) {
55
// Convert commands from body frame (x-forward, y-left, z-up) to NED.
56
Vector3f linear_velocity;
57
Vector3f linear_velocity_base_link {
58
float(cmd_vel.twist.linear.x),
59
float(cmd_vel.twist.linear.y),
60
float(-cmd_vel.twist.linear.z) };
61
62
if (isnan(linear_velocity_base_link.y) && isnan(linear_velocity_base_link.z)) {
63
// Assume it's an airspeed command so ignore the angular data.
64
// While MAV_CMD_GUIDED_CHANGE_SPEED supports commands of ground speed and airspeed,
65
// ROS users likely care more about airspeed control for a low level velocity control interface like this.
66
return external_control->set_airspeed(linear_velocity_base_link.x);
67
}
68
69
const float yaw_rate = -cmd_vel.twist.angular.z;
70
71
auto &ahrs = AP::ahrs();
72
linear_velocity = ahrs.body_to_earth(linear_velocity_base_link);
73
return external_control->set_linear_velocity_and_yaw_rate(linear_velocity, yaw_rate);
74
}
75
76
else if (strcmp(cmd_vel.header.frame_id, MAP_FRAME) == 0) {
77
// Convert commands from ENU to NED frame
78
Vector3f linear_velocity {
79
float(cmd_vel.twist.linear.y),
80
float(cmd_vel.twist.linear.x),
81
float(-cmd_vel.twist.linear.z) };
82
const float yaw_rate = -cmd_vel.twist.angular.z;
83
return external_control->set_linear_velocity_and_yaw_rate(linear_velocity, yaw_rate);
84
}
85
86
return false;
87
}
88
89
bool AP_DDS_External_Control::arm(AP_Arming::Method method, bool do_arming_checks)
90
{
91
auto *external_control = AP::externalcontrol();
92
if (external_control == nullptr) {
93
return false;
94
}
95
96
return external_control->arm(method, do_arming_checks);
97
}
98
99
bool AP_DDS_External_Control::disarm(AP_Arming::Method method, bool do_disarm_checks)
100
{
101
auto *external_control = AP::externalcontrol();
102
if (external_control == nullptr) {
103
return false;
104
}
105
106
return external_control->disarm(method, do_disarm_checks);
107
}
108
109
bool AP_DDS_External_Control::convert_alt_frame(const uint8_t frame_in, Location::AltFrame& frame_out)
110
{
111
112
// Specified in ROS REP-147; only some are supported.
113
switch (frame_in) {
114
case 5: // FRAME_GLOBAL_INT
115
frame_out = Location::AltFrame::ABSOLUTE;
116
break;
117
case 6: // FRAME_GLOBAL_REL_ALT
118
frame_out = Location::AltFrame::ABOVE_HOME;
119
break;
120
case 11: // FRAME_GLOBAL_TERRAIN_ALT
121
frame_out = Location::AltFrame::ABOVE_TERRAIN;
122
break;
123
default:
124
return false;
125
}
126
return true;
127
}
128
129
130
#endif // AP_DDS_ENABLED
131