converters.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020-2023 RaccoonLab.
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, version 3.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Author: Dmitry Ponomarev <ponomarevda96@gmail.com>
17  */
18 
19 #ifndef SRC_UAVCAN_COMMUNICATOR_CONVERTERS_HPP_
20 #define SRC_UAVCAN_COMMUNICATOR_CONVERTERS_HPP_
21 
22 #include <ros/ros.h>
23 #include <sensor_msgs/Imu.h>
24 #include <sensor_msgs/NavSatFix.h>
25 #include <sensor_msgs/Joy.h>
26 #include <sensor_msgs/MagneticField.h>
27 #include <sensor_msgs/BatteryState.h>
28 #include <std_msgs/Bool.h>
29 #include <std_msgs/UInt8.h>
30 #include <std_msgs/Float32.h>
31 #include <geometry_msgs/Twist.h>
32 #include <mavros_msgs/BatteryStatus.h>
33 #include <mavros_msgs/ESCTelemetryItem.h>
34 #include <mavros_msgs/ESCStatusItem.h>
35 
36 #include <iostream>
37 #include <memory>
38 #include <string>
39 
40 #include <uavcan/uavcan.hpp>
41 #include <uavcan/equipment/ahrs/MagneticFieldStrength.hpp>
42 #include <uavcan/equipment/ahrs/RawIMU.hpp>
43 #include <uavcan/equipment/ahrs/Solution.hpp>
44 #include <uavcan/equipment/air_data/RawAirData.hpp>
45 #include <uavcan/equipment/air_data/StaticPressure.hpp>
46 #include <uavcan/equipment/air_data/StaticTemperature.hpp>
47 #include <uavcan/equipment/esc/RawCommand.hpp>
48 #include <uavcan/equipment/esc/Status.hpp>
49 #include <uavcan/equipment/gnss/Fix.hpp>
50 #include <uavcan/equipment/ice/FuelTankStatus.hpp>
51 #include <uavcan/equipment/ice/reciprocating/Status.hpp>
52 #include <uavcan/equipment/power/CircuitStatus.hpp>
53 #include <uavcan/equipment/power/BatteryInfo.hpp>
54 
55 constexpr unsigned NodeMemoryPoolSize = 16384;
57 
58 
59 class Converter {};
60 
61 template<typename IN_UAVCAN, typename OUT_ROS>
63 protected:
64  typedef OUT_ROS OUT_ROS_MSG;
65  typedef IN_UAVCAN IN_UAVCAN_MSG;
68  OUT_ROS_MSG ros_msg_;
69 
70  virtual void uavcan_callback(const uavcan::ReceivedDataStructure<IN_UAVCAN_MSG>& uavcan_msg) = 0;
71  UavcanToRosConverter(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic) :
72  uavcan_sub_(uavcan_node) {
73  ros_pub_ = ros_node.advertise<OUT_ROS_MSG>(ros_topic, 5);
74  uavcan_sub_.start(std::bind(&UavcanToRosConverter::uavcan_callback, this, std::placeholders::_1));
75  }
76 };
77 
78 template<typename IN_ROS, typename OUT_UAVCAN>
80 public:
81  typedef OUT_UAVCAN OUT_UAVCAN_MSG;
82  OUT_UAVCAN_MSG out_uavcan_msg_;
83  bool enabled{true};
84 protected:
85  typedef IN_ROS IN_ROS_MSG;
86  typedef typename IN_ROS::Ptr IN_ROS_MSG_PTR;
87 
90  std::string _name;
91 
92  virtual void ros_callback(IN_ROS_MSG_PTR in_ros_msg) = 0;
93  RosToUavcanConverter(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic, std::string name):
94  uavcan_pub_(uavcan_node), _name(name) {
95  ros_sub_ = ros_node.subscribe(ros_topic, 1, &RosToUavcanConverter::ros_callback, this);
96  }
97 
98  void broadcast() {
99  if (enabled == false) {
100  return;
101  }
102  int pub_res = uavcan_pub_.broadcast(out_uavcan_msg_);
103  if (pub_res < 0) {
104  std::cerr << _name << " publication failure: " << pub_res << std::endl;
105  }
106  }
107 };
108 
109 
111  uavcan::equipment::esc::RawCommand,
112  sensor_msgs::Joy> {
113  void uavcan_callback(const uavcan::ReceivedDataStructure<IN_UAVCAN_MSG>& uavcan_msg) override;
114 public:
115  ActuatorsUavcanToRos(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
116  UavcanToRosConverter(ros_node, uavcan_node, ros_topic) { }
117 };
118 
120  uavcan::equipment::ahrs::Solution,
121  sensor_msgs::Imu> {
122  void uavcan_callback(const uavcan::ReceivedDataStructure<IN_UAVCAN_MSG>& uavcan_msg) override;
123 public:
124  AhrsSolutionUavcanToRos(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
125  UavcanToRosConverter(ros_node, uavcan_node, ros_topic) { }
126 };
127 
128 
130  uavcan::equipment::esc::RawCommand,
131  std_msgs::Bool> {
132  void uavcan_callback(const uavcan::ReceivedDataStructure<IN_UAVCAN_MSG>& uavcan_msg) override;
133 
134 public:
135  ArmUavcanToRos(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
136  UavcanToRosConverter(ros_node, uavcan_node, ros_topic) {}
137 };
138 
139 
141  uavcan::equipment::esc::Status,
142  mavros_msgs::ESCTelemetryItem> {
143  void uavcan_callback(const uavcan::ReceivedDataStructure<IN_UAVCAN_MSG>& uavcan_msg) override;
144 
145 public:
146  EscStatusUavcanToRos(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
147  UavcanToRosConverter(ros_node, uavcan_node, ros_topic) {}
148 };
149 
150 
152  uavcan::equipment::power::CircuitStatus,
153  mavros_msgs::BatteryStatus> {
154  void uavcan_callback(const uavcan::ReceivedDataStructure<IN_UAVCAN_MSG>& uavcan_msg) override;
155 
156 public:
157  CircuitStatusUavcanToRos(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
158  UavcanToRosConverter(ros_node, uavcan_node, ros_topic) {}
159 };
160 
161 
163  std_msgs::Float32,
164  uavcan::equipment::air_data::StaticPressure> {
165  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
166 public:
167  BaroStaticPressureRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
168  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
169 };
170 
171 
173  std_msgs::Float32,
174  uavcan::equipment::air_data::StaticTemperature> {
175  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
176 public:
177  BaroStaticTemperatureRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
178  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
179 };
180 
181 
183  std_msgs::Float32,
184  uavcan::equipment::air_data::RawAirData> {
185  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
188 public:
189  DiffPressureRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
190  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__),
191  _pressure(ros_node, uavcan_node, "/uav/static_pressure"),
192  _temperature(ros_node, uavcan_node, "/uav/static_temperature") {
193  _pressure.enabled = false;
194  _temperature.enabled = false;
195  }
196 };
197 
198 
200  sensor_msgs::NavSatFix,
201  uavcan::equipment::gnss::Fix> {
202  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
203  void ros_velocity_callback(geometry_msgs::Twist::Ptr in_ros_msg);
205 public:
206  GpsRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
207  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {
208  ros_velocity_sub_ = ros_node.subscribe("/uav/velocity", 1, &GpsRosToUavcan::ros_velocity_callback, this);
209  out_uavcan_msg_.sats_used = 10.0;
210  out_uavcan_msg_.status = 3;
211  out_uavcan_msg_.pdop = 1.0;
212  }
213 };
214 
215 
217  sensor_msgs::Imu,
218  uavcan::equipment::ahrs::RawIMU> {
219  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
220 public:
221  ImuRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
222  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
223 };
224 
225 
227  sensor_msgs::MagneticField,
228  uavcan::equipment::ahrs::MagneticFieldStrength> {
229  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
230 public:
231  MagnetometerRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
232  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
233 };
234 
236  mavros_msgs::ESCTelemetryItem,
237  uavcan::equipment::esc::Status> {
238  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
239 
240 public:
241  EscStatusRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
242  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
243 };
244 
246  mavros_msgs::ESCStatusItem,
247  uavcan::equipment::ice::reciprocating::Status> {
248  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
249  void ros_status_callback(std_msgs::UInt8 in_ros_msg);
251 public:
252  IceReciprocatingStatusRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
253  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {
254  ros_status_sub_ = ros_node.subscribe("/uav/ice_status", 1, &IceReciprocatingStatusRosToUavcan::ros_status_callback, this);
255  }
256 };
257 
259  std_msgs::UInt8,
260  uavcan::equipment::ice::FuelTankStatus> {
261  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
262 
263 public:
264  IceFuelTankStatusRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
265  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
266 };
267 
269  sensor_msgs::BatteryState,
270  uavcan::equipment::power::BatteryInfo> {
271  void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override;
272 
273 public:
274  BatteryInfoRosToUavcan(ros::NodeHandle& ros_node, UavcanNode& uavcan_node, const char* ros_topic):
275  RosToUavcanConverter(ros_node, uavcan_node, ros_topic, __FUNCTION__) {}
276 };
277 
278 
279 std::unique_ptr<Converter> instantiate_converter(std::string converter_name,
280  ros::NodeHandle& ros_node,
281  UavcanNode& uavcan_node,
282  const char* ros_topic);
283 
284 #endif // SRC_UAVCAN_COMMUNICATOR_CONVERTERS_HPP_
MagnetometerRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:231
OUT_UAVCAN_MSG out_uavcan_msg_
Definition: converters.hpp:82
GpsRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:206
BaroStaticPressureRosToUavcan _pressure
Definition: converters.hpp:186
IN_ROS::Ptr IN_ROS_MSG_PTR
Definition: converters.hpp:86
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
OUT_UAVCAN OUT_UAVCAN_MSG
Definition: converters.hpp:81
BaroStaticPressureRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:167
DiffPressureRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:189
CircuitStatusUavcanToRos(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:157
IceFuelTankStatusRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:264
BaroStaticTemperatureRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:177
uavcan::Subscriber< IN_UAVCAN_MSG > uavcan_sub_
Definition: converters.hpp:67
constexpr unsigned NodeMemoryPoolSize
Definition: converters.hpp:55
virtual void uavcan_callback(const uavcan::ReceivedDataStructure< IN_UAVCAN_MSG > &uavcan_msg)=0
UavcanToRosConverter(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:71
EscStatusRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:241
uavcan::Publisher< OUT_UAVCAN_MSG > uavcan_pub_
Definition: converters.hpp:88
ros::Publisher ros_pub_
Definition: converters.hpp:66
ArmUavcanToRos(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:135
EscStatusUavcanToRos(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:146
RosToUavcanConverter(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic, std::string name)
Definition: converters.hpp:93
virtual void ros_callback(IN_ROS_MSG_PTR in_ros_msg)=0
ActuatorsUavcanToRos(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:115
uavcan::Node< NodeMemoryPoolSize > UavcanNode
Definition: converters.hpp:56
IN_UAVCAN IN_UAVCAN_MSG
Definition: converters.hpp:65
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
AhrsSolutionUavcanToRos(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:124
ros::Subscriber ros_velocity_sub_
Definition: converters.hpp:204
OUT_ROS_MSG ros_msg_
Definition: converters.hpp:68
int start(const Callback &callback)
Definition: subscriber.hpp:83
BatteryInfoRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:274
BaroStaticTemperatureRosToUavcan _temperature
Definition: converters.hpp:187
void ros_velocity_callback(geometry_msgs::Twist::Ptr in_ros_msg)
Definition: converters.cpp:119
ros::Subscriber ros_sub_
Definition: converters.hpp:89
std::unique_ptr< Converter > instantiate_converter(std::string converter_name, ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.cpp:194
ImuRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:221
IceReciprocatingStatusRosToUavcan(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:252
void ros_status_callback(std_msgs::UInt8 in_ros_msg)
Definition: converters.cpp:162
int broadcast(const DataType &message)
Definition: publisher.hpp:52


uavcan_communicator
Author(s):
autogenerated on Wed Jan 11 2023 03:59:39