geofence.cpp
Go to the documentation of this file.
1 
9 /*
10  * Copyright 2021 Charlie Burge.
11  *
12  * This file is part of the mavros package and subject to the license terms
13  * in the top-level LICENSE file of the mavros repository.
14  * https://github.com/mavlink/mavros/tree/master/LICENSE.md
15  */
16 
18 
19 namespace mavros {
20 namespace std_plugins {
25 public:
27  MissionBase("GF"),
28  gf_nh("~geofence")
29  { }
30 
31  void initialize(UAS &uas_) override
32  {
33  PluginBase::initialize(uas_);
34  MissionBase::initialize_with_nodehandle(&gf_nh);
35 
37  wp_type = plugin::WP_TYPE::FENCE;
38 
39  gf_nh.param("pull_after_gcs", do_pull_after_gcs, true);
40  gf_nh.param("use_mission_item_int", use_mission_item_int, false);
41 
42  gf_list_pub = gf_nh.advertise<mavros_msgs::WaypointList>("waypoints", 2, true);
46 
49  }
50 
52  return {
59  };
60  }
61 
62 private:
64 
69 
70  /* -*- mid-level helpers -*- */
71 
72  // Acts when capabilities of the fcu are changed
73  void capabilities_cb(UAS::MAV_CAP capabilities) override {
74  lock_guard lock(mutex);
75  if (m_uas->has_capability(UAS::MAV_CAP::MISSION_INT)) {
76  use_mission_item_int = true;
78  ROS_INFO_NAMED(log_ns, "%s: Using MISSION_ITEM_INT", log_ns.c_str());
79  } else {
80  use_mission_item_int = false;
82  ROS_WARN_NAMED(log_ns, "%s: Falling back to MISSION_ITEM", log_ns.c_str());
83  }
84  }
85 
86  // Act on first heartbeat from FCU
87  void connection_cb(bool connected) override
88  {
89  lock_guard lock(mutex);
90  if (connected) {
92 
93  if (gf_nh.hasParam("enable_partial_push")) {
94  gf_nh.getParam("enable_partial_push", enable_partial_push);
95  }
96  else {
98  }
99  }
100  else {
102  }
103  }
104 
106  void publish_waypoints() override
107  {
108  auto wpl = boost::make_shared<mavros_msgs::WaypointList>();
109  unique_lock lock(mutex);
110 
111  wpl->current_seq = wp_cur_active;
112  wpl->waypoints.clear();
113  wpl->waypoints.reserve(waypoints.size());
114  for (auto &it : waypoints) {
115  wpl->waypoints.push_back(it);
116  }
117 
118  lock.unlock();
119  gf_list_pub.publish(wpl);
120  }
121 
122  /* -*- ROS callbacks -*- */
123 
124  bool pull_cb(mavros_msgs::WaypointPull::Request &req,
125  mavros_msgs::WaypointPull::Response &res)
126  {
127  unique_lock lock(mutex);
128 
129  if (wp_state != WP::IDLE)
130  // Wrong initial state, other operation in progress?
131  return false;
132 
134  wp_count = 0;
136 
137  lock.unlock();
139  res.success = wait_fetch_all();
140  lock.lock();
141 
142  res.wp_received = waypoints.size();
143  go_idle(); // not nessessary, but prevents from blocking
144  return true;
145  }
146 
147  bool push_cb(mavros_msgs::WaypointPush::Request &req,
148  mavros_msgs::WaypointPush::Response &res)
149  {
150  unique_lock lock(mutex);
151 
152  if (wp_state != WP::IDLE)
153  // Wrong initial state, other operation in progress?
154  return false;
155 
156  if (req.start_index) {
157  // Partial Waypoint update
158 
159  if (!enable_partial_push) {
160  ROS_WARN_NAMED(log_ns, "%s: Partial Push not enabled. (Only supported on APM)", log_ns.c_str());
161  res.success = false;
162  res.wp_transfered = 0;
163  return true;
164  }
165 
166  if (waypoints.size() < req.start_index + req.waypoints.size()) {
167  ROS_WARN_NAMED(log_ns, "%s: Partial push out of range rejected.", log_ns.c_str());
168  res.success = false;
169  res.wp_transfered = 0;
170  return true;
171  }
172 
175 
176  uint16_t seq = req.start_index;
177  for (auto &it : req.waypoints) {
178  send_waypoints[seq] = it;
179  seq++;
180  }
181 
182  wp_count = req.waypoints.size();
183  wp_start_id = req.start_index;
184  wp_end_id = req.start_index + wp_count;
185  wp_cur_id = req.start_index;
187 
188  lock.unlock();
190  res.success = wait_push_all();
191  lock.lock();
192 
193  res.wp_transfered = wp_cur_id - wp_start_id + 1;
194  }
195  else {
196  // Full waypoint update
198 
199  send_waypoints.clear();
200  send_waypoints.reserve(req.waypoints.size());
201  send_waypoints = req.waypoints;
202 
203  wp_count = send_waypoints.size();
205  wp_cur_id = 0;
207 
208  lock.unlock();
210  res.success = wait_push_all();
211  lock.lock();
212 
213  res.wp_transfered = wp_cur_id + 1;
214  }
215 
216  go_idle(); // same as in pull_cb
217  return true;
218  }
219 
220  bool clear_cb(mavros_msgs::WaypointClear::Request &req,
221  mavros_msgs::WaypointClear::Response &res)
222  {
223  unique_lock lock(mutex);
224 
225  if (wp_state != WP::IDLE)
226  return false;
227 
230 
231  lock.unlock();
233  res.success = wait_push_all();
234 
235  lock.lock();
236  go_idle(); // same as in pull_cb
237  return true;
238  }
239 };
240 } // namespace std_plugins
241 } // namespace mavros
242 
mavros::plugin::MissionBase::handle_mission_count
void handle_mission_count(const mavlink::mavlink_message_t *msg, mavlink::common::msg::MISSION_COUNT &mcnt)
handle MISSION_COUNT mavlink msg Handles a mission count from FCU in a Waypoint Pull Triggers a pull ...
Definition: mission_protocol_base.cpp:183
mavros::plugin::PluginBase::m_uas
UAS * m_uas
Definition: mavros_plugin.h:74
mavros::plugin::MissionBase::handle_mission_request
void handle_mission_request(const mavlink::mavlink_message_t *msg, mavlink::common::msg::MISSION_REQUEST &mreq)
handle MISSION_REQUEST mavlink msg handles and acts on misison request from FCU
Definition: mission_protocol_base.cpp:113
mavros::UAS::has_capability
bool has_capability(T capability)
Function to check if the flight controller has a capability.
Definition: mavros_uas.h:324
mavros::plugin::MissionBase::wp_cur_id
size_t wp_cur_id
Definition: mission_protocol_base.h:292
mavros::plugin::PluginBase::Subscriptions
std::vector< HandlerInfo > Subscriptions
Subscriptions vector.
Definition: mavros_plugin.h:47
ros::Publisher
mavros::plugin::MissionBase::handle_mission_item_int
void handle_mission_item_int(const mavlink::mavlink_message_t *msg, WP_ITEM_INT &wpi)
handle MISSION_ITEM_INT mavlink msg handles and stores mission items when pulling waypoints
Definition: mission_protocol_base.cpp:22
mavros::std_plugins::GeofencePlugin::push_srv
ros::ServiceServer push_srv
Definition: geofence.cpp:67
mavros::std_plugins::GeofencePlugin::clear_srv
ros::ServiceServer clear_srv
Definition: geofence.cpp:68
mavros::plugin::MissionBase::use_mission_item_int
bool use_mission_item_int
Definition: mission_protocol_base.h:309
mavros::std_plugins::GeofencePlugin
Geofence manipulation plugin.
Definition: geofence.cpp:24
mavros::UAS::MAV_CAP
mavlink::common::MAV_PROTOCOL_CAPABILITY MAV_CAP
Definition: mavros_uas.h:74
ros::NodeHandle::getParam
bool getParam(const std::string &key, bool &b) const
mavros::plugin::MissionBase::mission_write_partial_list
void mission_write_partial_list(uint16_t start_index, uint16_t end_index)
Definition: mission_protocol_base.h:566
mavros::std_plugins::GeofencePlugin::clear_cb
bool clear_cb(mavros_msgs::WaypointClear::Request &req, mavros_msgs::WaypointClear::Response &res)
Definition: geofence.cpp:220
mavros::UAS
UAS for plugins.
Definition: mavros_uas.h:67
mavros::plugin::MissionBase::log_ns
std::string log_ns
Definition: mission_protocol_base.h:267
ros::Timer::stop
void stop()
ros::NodeHandle::advertiseService
ServiceServer advertiseService(AdvertiseServiceOptions &ops)
mavros::UAS::is_ardupilotmega
bool is_ardupilotmega()
Check that FCU is APM.
Definition: mavros_uas.h:410
mavros::plugin::MissionBase::mission_request_list
void mission_request_list()
Definition: mission_protocol_base.h:543
mission_protocol_base.h
Mission base plugin.
mavros::std_plugins::GeofencePlugin::gf_nh
ros::NodeHandle gf_nh
Definition: geofence.cpp:63
mavros::plugin::MissionBase::mutex
std::recursive_mutex mutex
Definition: mission_protocol_base.h:269
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
mavros::std_plugins::GeofencePlugin::initialize
void initialize(UAS &uas_) override
Plugin initializer.
Definition: geofence.cpp:31
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
mavros::plugin::MissionBase::schedule_timer
ros::Timer schedule_timer
Definition: mission_protocol_base.h:303
ros::ServiceServer
mavros::std_plugins::GeofencePlugin::get_subscriptions
Subscriptions get_subscriptions() override
Return vector of MAVLink message subscriptions (handlers)
Definition: geofence.cpp:51
mavros::plugin::MissionBase::wp_state
WP wp_state
Definition: mission_protocol_base.h:286
mavros::plugin::MissionBase::BOOTUP_TIME_DT
const ros::Duration BOOTUP_TIME_DT
Definition: mission_protocol_base.h:319
PLUGINLIB_EXPORT_CLASS
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
ROS_INFO_NAMED
#define ROS_INFO_NAMED(name,...)
mavros::std_plugins::GeofencePlugin::push_cb
bool push_cb(mavros_msgs::WaypointPush::Request &req, mavros_msgs::WaypointPush::Response &res)
Definition: geofence.cpp:147
mavros::plugin::MissionBase::wp_count
size_t wp_count
Definition: mission_protocol_base.h:289
mavros::plugin::MissionBase::mission_count
void mission_count(uint16_t cnt)
Definition: mission_protocol_base.h:554
mavros::plugin::MissionBase::unique_lock
std::unique_lock< std::recursive_mutex > unique_lock
Definition: mission_protocol_base.h:264
mavros::std_plugins::GeofencePlugin::capabilities_cb
void capabilities_cb(UAS::MAV_CAP capabilities) override
Definition: geofence.cpp:73
mavros::plugin::MissionBase::schedule_pull
void schedule_pull(const ros::Duration &dt)
Definition: mission_protocol_base.h:442
ros::NodeHandle::hasParam
bool hasParam(const std::string &key) const
mavros::plugin::MissionBase::MissionBase
MissionBase(std::string _name)
Definition: mission_protocol_base.h:234
mavros::plugin::MissionBase::enable_partial_push
bool enable_partial_push
Definition: mission_protocol_base.h:305
mavros::plugin::MissionBase::go_idle
void go_idle(void)
Definition: mission_protocol_base.h:422
mavros::std_plugins::GeofencePlugin::connection_cb
void connection_cb(bool connected) override
Definition: geofence.cpp:87
mavros::plugin::MissionBase::WP::RXLIST
@ RXLIST
mavros::plugin::MissionBase::wp_end_id
size_t wp_end_id
Definition: mission_protocol_base.h:291
mavros::std_plugins::GeofencePlugin::gf_list_pub
ros::Publisher gf_list_pub
Definition: geofence.cpp:65
mavros::plugin::MissionBase::wp_cur_active
size_t wp_cur_active
Definition: mission_protocol_base.h:293
mavros::plugin::MissionBase::restart_timeout_timer
void restart_timeout_timer(void)
Definition: mission_protocol_base.h:429
mavros::plugin::MissionBase
Mission base plugin.
Definition: mission_protocol_base.h:232
mavros::plugin::MissionBase::wp_start_id
size_t wp_start_id
Definition: mission_protocol_base.h:290
mavros
Definition: frame_tf.h:34
mavros::plugin::MissionBase::send_waypoints
std::vector< mavros_msgs::Waypoint > send_waypoints
Definition: mission_protocol_base.h:272
mavros::std_plugins::GeofencePlugin::pull_cb
bool pull_cb(mavros_msgs::WaypointPull::Request &req, mavros_msgs::WaypointPull::Response &res)
Definition: geofence.cpp:124
mavros::std_plugins::GeofencePlugin::pull_srv
ros::ServiceServer pull_srv
Definition: geofence.cpp:66
mavros::plugin::MissionBase::wp_type
WP_TYPE wp_type
Definition: mission_protocol_base.h:288
mavros::plugin::PluginBase
MAVROS Plugin base class.
Definition: mavros_plugin.h:36
mavros::plugin::PluginBase::enable_capabilities_cb
void enable_capabilities_cb()
Definition: mavros_plugin.h:145
mavros::std_plugins::GeofencePlugin::publish_waypoints
void publish_waypoints() override
publish the updated waypoint list after operation
Definition: geofence.cpp:106
mavros::plugin::MissionBase::waypoints
std::vector< mavros_msgs::Waypoint > waypoints
Definition: mission_protocol_base.h:271
class_list_macros.hpp
ROS_WARN_NAMED
#define ROS_WARN_NAMED(name,...)
mavros::plugin::MissionBase::lock_guard
std::lock_guard< std::recursive_mutex > lock_guard
Definition: mission_protocol_base.h:265
mavros::plugin::MissionBase::WP::IDLE
@ IDLE
ros::NodeHandle::param
T param(const std::string &param_name, const T &default_val) const
mavros::std_plugins::GeofencePlugin::GeofencePlugin
GeofencePlugin()
Definition: geofence.cpp:26
mavros::plugin::MissionBase::do_pull_after_gcs
bool do_pull_after_gcs
Definition: mission_protocol_base.h:304
mavros::plugin::MissionBase::handle_mission_item
void handle_mission_item(const mavlink::mavlink_message_t *msg, WP_ITEM &wpi)
handle MISSION_ITEM mavlink msg handles and stores mission items when pulling waypoints
Definition: mission_protocol_base.cpp:62
mavros::plugin::MissionBase::mission_item_int_support_confirmed
bool mission_item_int_support_confirmed
Definition: mission_protocol_base.h:310
mavros::plugin::PluginBase::enable_connection_cb
void enable_connection_cb()
Definition: mavros_plugin.h:131
mavros::plugin::MissionBase::WP::TXPARTIAL
@ TXPARTIAL
mavros::plugin::MissionBase::wait_push_all
bool wait_push_all()
wait until a waypoint push is complete. Push happens asynchronously, this function blocks until it is...
Definition: mission_protocol_base.h:476
mavros::plugin::MissionBase::wait_fetch_all
bool wait_fetch_all()
wait until a waypoint pull is complete. Pull happens asynchronously, this function blocks until it is...
Definition: mission_protocol_base.h:464
mavros::plugin::PluginBase::make_handler
HandlerInfo make_handler(const mavlink::msgid_t id, void(_C::*fn)(const mavlink::mavlink_message_t *msg, const mavconn::Framing framing))
Definition: mavros_plugin.h:87
mavros::plugin::MissionBase::mission_clear_all
void mission_clear_all()
Definition: mission_protocol_base.h:580
mavros::plugin::MissionBase::WP::TXLIST
@ TXLIST
mavros::plugin::MissionBase::handle_mission_ack
void handle_mission_ack(const mavlink::mavlink_message_t *msg, mavlink::common::msg::MISSION_ACK &mack)
handle MISSION_ACK mavlink msg Handles a MISSION_ACK which marks the end of a push,...
Definition: mission_protocol_base.cpp:230
ros::NodeHandle
mavros::plugin::MissionBase::WP::CLEAR
@ CLEAR
mavros::plugin::MissionBase::handle_mission_request_int
void handle_mission_request_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::MISSION_REQUEST_INT &mreq)
handle MISSION_REQUEST_INT mavlink msg handles and acts on misison request from FCU
Definition: mission_protocol_base.cpp:147


mavros
Author(s): Vladimir Ermakov
autogenerated on Tue May 6 2025 02:34:03