Corentin Chauvin-Hameau – 2019-2020
Coverage Path Planning for an underwater robot surveying a marine farm
farm_nodelet.cpp
Go to the documentation of this file.
1 /**
2  * @file
3  *
4  * \brief Definition of nodelet for managing the farm simulation
5  * \author Corentin Chauvin-Hameau
6  * \date 2019
7  */
8 
9 #include "farm_nodelet.hpp"
10 #include "rviz_visualisation.hpp"
11 #include "farm_common.hpp"
12 #include "mf_farm_simulator/FarmSimulatorConfig.h"
13 #include "mf_farm_simulator/Algae.h"
14 #include <dynamic_reconfigure/server.h>
15 #include <visualization_msgs/MarkerArray.h>
16 #include <visualization_msgs/Marker.h>
17 #include <geometry_msgs/Point.h>
18 #include <geometry_msgs/Point32.h>
19 #include <std_msgs/ColorRGBA.h>
20 #include <pluginlib/class_list_macros.h>
21 #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
22 #include <geometry_msgs/Point.h>
23 #include <iostream>
24 #include <cmath>
25 #include <csignal>
26 
27 
28 using namespace std;
29 
30 
31 PLUGINLIB_EXPORT_CLASS(mfcpp::FarmNodelet, nodelet::Nodelet)
32 
33 namespace mfcpp {
34 
35 /*
36  * Definition of static varibles
37  */
38 sig_atomic_t volatile FarmNodelet::b_sigint_ = 0;
39 ros::Timer FarmNodelet::init_timer_ = ros::Timer();
40 ros::Timer FarmNodelet::main_timer_ = ros::Timer();
41 
42 /*
43  * Definition of member functions
44  */
45 FarmNodelet::FarmNodelet() {}
46 FarmNodelet::~FarmNodelet() {}
47 
48 void FarmNodelet::onInit()
49 {
50  nh_ = getNodeHandle();
51  private_nh_ = getPrivateNodeHandle();
52 
53  // Catch SIGINT (Ctrl+C) stop signal
54  struct sigaction sigIntHandler;
55  sigIntHandler.sa_handler = FarmNodelet::sigint_handler;
56  sigemptyset(&sigIntHandler.sa_mask);
57  sigIntHandler.sa_flags = 0;
58  sigaction(SIGINT, &sigIntHandler, NULL);
59 
60  // Dynamic reconfigure
61  reconfigure_initialised_ = false;
62  dynamic_reconfigure::Server<mf_farm_simulator::FarmSimulatorConfig>::CallbackType cb;
63  cb = boost::bind(&FarmNodelet::reconfigure_cb, this, _1, _2);
64  reconf_srv_.setCallback(cb);
65 
66  // ROS parameters
67  private_nh_.param<float>("main_loop_freq", main_loop_freq_, 1.0);
68  private_nh_.param<int>("random_seed", random_seed_, 0);
69  private_nh_.param<int>("nbr_lines", nbr_lines_, 1);
70  private_nh_.param<float>("offset_lines", offset_lines_, 1.0);
71  private_nh_.param<float>("length_lines", length_lines_, 100.0);
72  private_nh_.param<float>("thickness_ropes", thickness_ropes_, 0.1);
73  private_nh_.param<float>("depth_lines", depth_lines_, 1.0);
74  private_nh_.param<float>("depth_water", depth_water_, 5.0);
75  private_nh_.param<float>("anchors_diameter", anchors_diameter_, 0.5);
76  private_nh_.param<float>("anchors_height", anchors_height_, 0.5);
77  private_nh_.param<int>("nbr_buoys", nbr_buoys_, 2);
78  private_nh_.param<float>("buoys_diameter", buoys_diameter_, 0.6);
79 
80  private_nh_.param<bool>("randomise_lines", randomise_lines_, false);
81  private_nh_.param<float>("alga_miss_rate", alga_miss_rate_, 0.0);
82  private_nh_.param<float>("phi_lines", phi_lines_, 0.0);
83  private_nh_.param<float>("theta_lines", theta_lines_, 0.0);
84  private_nh_.param<float>("bnd_phi_lines", bnd_phi_lines_, 0.3);
85  private_nh_.param<float>("bnd_theta_lines", bnd_theta_lines_, 0.3);
86  private_nh_.param<float>("bnd_gamma_lines", bnd_gamma_lines_, 0.3);
87 
88  private_nh_.param<bool>("randomise_algae", randomise_algae_, false);
89  private_nh_.param<int>("nbr_algae", nbr_algae_, 1);
90  private_nh_.param<float>("width_algae", width_algae_, 0.2);
91  private_nh_.param<float>("length_algae", length_algae_, 1.0);
92  private_nh_.param<float>("thickness_algae", thickness_algae_, 0.01);
93  private_nh_.param<float>("psi_algae", psi_algae_, 0.0);
94  private_nh_.param<float>("std_width_algae", std_width_algae_, 0.05);
95  private_nh_.param<float>("std_length_algae", std_length_algae_, 0.2);
96  private_nh_.param<float>("std_psi_algae", std_psi_algae_, 0.1);
97 
98  private_nh_.param<bool>("disp_disease", disp_disease_, false);
99  private_nh_.param<float>("disease_ratio", disease_ratio_, 0.5);
100  private_nh_.param<int>("height_disease_heatmap", height_disease_heatmap_, 30);
101  private_nh_.param<int>("width_disease_heatmap", width_disease_heatmap_, 10);
102  private_nh_.param<int>("height_grid_heatmap", height_grid_heatmap_, 6);
103  private_nh_.param<int>("width_grid_heatmap", width_grid_heatmap_, 2);
104 
105  // Other variables
106  init_done_ = false;
107 
108  if (random_seed_ == 0)
109  random_generator_ = mt19937(random_device_());
110  else {
111  srand(random_seed_);
112  random_generator_ = mt19937(random_seed_);
113  }
114 
115  // ROS publishers
116  algae_pub_ = private_nh_.advertise<mf_farm_simulator::Algae>("algae", 0);
117  rviz_pub_ = nh_.advertise<visualization_msgs::MarkerArray>("farm_markers", 0);
118 
119  // Create algae lines
120  init_timer_ = private_nh_.createTimer(
121  ros::Duration(0), &FarmNodelet::init_cb, this, true
122  );
123 
124 
125  // Main loop
126  main_timer_ = private_nh_.createTimer(
127  ros::Duration(1/main_loop_freq_), &FarmNodelet::main_cb, this
128  );
129 }
130 
131 
132 void FarmNodelet::main_cb(const ros::TimerEvent &timer_event)
133 {
134  if (!ros::ok() || ros::isShuttingDown() || b_sigint_)
135  return;
136 
137  if (init_done_) {
138  pub_rviz_markers(1/main_loop_freq_);
139  pub_algae();
140  }
141 }
142 
143 
144 void FarmNodelet::sigint_handler(int s) {
145  b_sigint_ = 1;
146  init_timer_.stop();
147  main_timer_.stop();
148 
149  raise(SIGTERM);
150 }
151 
152 
153 void FarmNodelet::reconfigure_cb(mf_farm_simulator::FarmSimulatorConfig &config,
154  uint32_t level)
155 {
156  if (reconfigure_initialised_) {
157  randomise_lines_ = config.randomise_lines;
158  phi_lines_ = config.phi_lines;
159  theta_lines_ = config.theta_lines;
160  bnd_phi_lines_ = config.bnd_phi_lines;
161  bnd_theta_lines_ = config.bnd_theta_lines;
162  bnd_gamma_lines_ = config.bnd_gamma_lines;
163  disp_disease_ = config.disp_disease;
164 
165  init_algae_lines();
166  } else
167  reconfigure_initialised_ = true;
168 }
169 
170 
171 void FarmNodelet::init_cb(const ros::TimerEvent &timer_event)
172 {
173  init_algae_lines();
174  init_done_ = true;
175 }
176 
177 
178 void FarmNodelet::init_algae_lines()
179 {
180  algae_lines_.resize(0);
181  algae_lines_.reserve(nbr_lines_);
182 
183  for (unsigned int i = 0; i < nbr_lines_; i++) {
184  AlgaeLine line;
185 
186  init_anchors(line, i);
187  line.nbr_buoys = nbr_buoys_;
188  line.buoys_diameter = buoys_diameter_;
189  init_ropes(line);
190  init_algae(line);
191 
192  algae_lines_.emplace_back(line);
193  }
194 }
195 
196 
197 } // namespace mfcpp
Definition: common.hpp:23
float buoys_diameter
Diameter of a buoy.
Definition: farm_common.hpp:68
Declaration of common structures and functions for farm simulator.
Declaration of common Rviz display functions.
Declaration of nodelet for managing the farm simulation.
unsigned int nbr_buoys
Number of buoys on the floating rope.
Definition: farm_common.hpp:67
Line on which algae grow.
Definition: farm_common.hpp:58
Nodelet class for farm simulation.