converters.cpp
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 #include "converters.hpp"
20 
21 
23  if (uavcan_msg.cmd.size() > 0 && uavcan_msg.cmd.size() <= 20) {
24  sensor_msgs::Joy ros_msg;
25  ros_msg.header.stamp = ros::Time::now();
26  for (auto cmd : uavcan_msg.cmd) {
27  if (cmd >= 0) {
28  ros_msg.axes.push_back(cmd / 8091.0);
29  } else {
30  ros_msg.axes.push_back(cmd / 8092.0);
31  }
32  }
33  ros_pub_.publish(ros_msg);
34  }
35 }
36 
37 
39  ros_msg_.header.stamp = ros::Time::now();
40 
41  ros_msg_.orientation.x = uavcan_msg.orientation_xyzw[0];
42  ros_msg_.orientation.y = uavcan_msg.orientation_xyzw[1];
43  ros_msg_.orientation.z = uavcan_msg.orientation_xyzw[2];
44  ros_msg_.orientation.w = uavcan_msg.orientation_xyzw[3];
45 
46  ros_msg_.angular_velocity.x = uavcan_msg.angular_velocity[0];
47  ros_msg_.angular_velocity.y = uavcan_msg.angular_velocity[1];
48  ros_msg_.angular_velocity.z = uavcan_msg.angular_velocity[2];
49 
50  ros_msg_.linear_acceleration.x = uavcan_msg.linear_acceleration[0];
51  ros_msg_.linear_acceleration.y = uavcan_msg.linear_acceleration[1];
52  ros_msg_.linear_acceleration.z = uavcan_msg.linear_acceleration[2];
53 
55 }
56 
57 
59  ros_msg_.data = false;
60  if (uavcan_msg.cmd.size() != 0) {
61  for (auto raw_cmd : uavcan_msg.cmd) {
62  if (raw_cmd != -1) {
63  ros_msg_.data = true;
64  }
65  }
66  }
68 }
69 
70 
72  ros_msg_.header.frame_id = std::to_string(uavcan_msg.circuit_id);
73  ros_msg_.voltage = uavcan_msg.voltage;
74  ros_msg_.current = uavcan_msg.current;
76 }
77 
78 
80  ros_msg_.temperature = uavcan_msg.temperature;
81  ros_msg_.voltage = uavcan_msg.voltage;
82  ros_msg_.current = uavcan_msg.current;
83  ros_msg_.totalcurrent = 0;
84  ros_msg_.rpm = uavcan_msg.rpm;
85  ros_msg_.count = uavcan_msg.esc_index;
87 }
88 
89 
90 void BaroStaticPressureRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
91  out_uavcan_msg_.static_pressure = in_ros_msg->data;
92  out_uavcan_msg_.static_pressure_variance = 1;
93  broadcast();
94 }
95 
96 
97 void BaroStaticTemperatureRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
98  out_uavcan_msg_.static_temperature = in_ros_msg->data;
99  out_uavcan_msg_.static_temperature_variance = 1;
100  broadcast();
101 }
102 
103 
104 void DiffPressureRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
105  out_uavcan_msg_.static_air_temperature = _temperature.out_uavcan_msg_.static_temperature;
106  out_uavcan_msg_.static_pressure = _pressure.out_uavcan_msg_.static_pressure;
107  out_uavcan_msg_.differential_pressure = in_ros_msg->data;
108  broadcast();
109 }
110 
111 
112 void GpsRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
113  out_uavcan_msg_.latitude_deg_1e8 = in_ros_msg->latitude * 1e8;
114  out_uavcan_msg_.longitude_deg_1e8 = in_ros_msg->longitude * 1e8;
115  out_uavcan_msg_.height_msl_mm = in_ros_msg->altitude * 1e3;
116  broadcast();
117 }
118 
119 void GpsRosToUavcan::ros_velocity_callback(geometry_msgs::Twist::Ptr in_ros_msg) {
120  out_uavcan_msg_.ned_velocity[0] = in_ros_msg->linear.x;
121  out_uavcan_msg_.ned_velocity[1] = in_ros_msg->linear.y;
122  out_uavcan_msg_.ned_velocity[2] = in_ros_msg->linear.z;
123 }
124 
125 
126 void ImuRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
127  out_uavcan_msg_.rate_gyro_latest[0] = in_ros_msg->angular_velocity.x;
128  out_uavcan_msg_.rate_gyro_latest[1] = in_ros_msg->angular_velocity.y;
129  out_uavcan_msg_.rate_gyro_latest[2] = in_ros_msg->angular_velocity.z;
130 
131  out_uavcan_msg_.accelerometer_latest[0] = in_ros_msg->linear_acceleration.x;
132  out_uavcan_msg_.accelerometer_latest[1] = in_ros_msg->linear_acceleration.y;
133  out_uavcan_msg_.accelerometer_latest[2] = in_ros_msg->linear_acceleration.z;
134 
135  broadcast();
136 }
137 
138 
139 void MagnetometerRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
140  out_uavcan_msg_.magnetic_field_ga[0] = in_ros_msg->magnetic_field.x;
141  out_uavcan_msg_.magnetic_field_ga[1] = in_ros_msg->magnetic_field.y;
142  out_uavcan_msg_.magnetic_field_ga[2] = in_ros_msg->magnetic_field.z;
143  broadcast();
144 }
145 
146 void EscStatusRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
147  out_uavcan_msg_.error_count = 0;
148  out_uavcan_msg_.voltage = in_ros_msg->voltage;
149  out_uavcan_msg_.current = in_ros_msg->current;
150  out_uavcan_msg_.temperature = in_ros_msg->temperature;
151  out_uavcan_msg_.rpm = in_ros_msg->rpm;
152  out_uavcan_msg_.power_rating_pct = 0;
153  out_uavcan_msg_.esc_index = in_ros_msg->count;
154  broadcast();
155 }
156 
157 void IceReciprocatingStatusRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
158  out_uavcan_msg_.engine_speed_rpm = in_ros_msg->rpm;
159  broadcast();
160 }
161 
163  out_uavcan_msg_.state = in_ros_msg.data;
164 }
165 
166 
167 void IceFuelTankStatusRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
168  out_uavcan_msg_.available_fuel_volume_percent = in_ros_msg->data;
169  broadcast();
170 }
171 
172 void BatteryInfoRosToUavcan::ros_callback(IN_ROS_MSG_PTR in_ros_msg) {
174  out_uavcan_msg_.voltage = in_ros_msg->voltage;
175  out_uavcan_msg_.current = in_ros_msg->current;
176  out_uavcan_msg_.full_charge_capacity_wh = in_ros_msg->design_capacity;
177  out_uavcan_msg_.state_of_charge_pct = in_ros_msg->percentage * 100;
178  out_uavcan_msg_.status_flags = 1;
179  out_uavcan_msg_.model_instance_id = 1;
180  out_uavcan_msg_.temperature = 300;
181 
183  out_uavcan_msg_.remaining_capacity_wh = in_ros_msg->capacity;
184  out_uavcan_msg_.average_power_10sec = 0;
185  out_uavcan_msg_.hours_to_full_charge = 0;
186  out_uavcan_msg_.state_of_health_pct = 127;
187  out_uavcan_msg_.state_of_charge_pct_stdev = 0;
188  out_uavcan_msg_.battery_id = 0;
189  out_uavcan_msg_.model_name = "simulated_battery";
190 
191  broadcast();
192 }
193 
194 std::unique_ptr<Converter> instantiate_converter(std::string converter_name,
195  ros::NodeHandle& ros_node,
196  UavcanNode& uavcan_node,
197  const char* ros_topic) {
198  std::unique_ptr<Converter> converter(nullptr);
199  if (converter_name.compare("ActuatorsUavcanToRos") == 0) {
200  converter = std::unique_ptr<Converter>(new ActuatorsUavcanToRos(ros_node, uavcan_node, ros_topic));
201  } else if (converter_name.compare("AhrsSolutionUavcanToRos") == 0) {
202  converter = std::unique_ptr<Converter>(new AhrsSolutionUavcanToRos(ros_node, uavcan_node, ros_topic));
203  } else if (converter_name.compare("ArmUavcanToRos") == 0) {
204  converter = std::unique_ptr<Converter>(new ArmUavcanToRos(ros_node, uavcan_node, ros_topic));
205  } else if (converter_name.compare("CircuitStatusUavcanToRos") == 0) {
206  converter = std::unique_ptr<Converter>(new CircuitStatusUavcanToRos(ros_node, uavcan_node, ros_topic));
207  } else if (converter_name.compare("EscStatusUavcanToRos") == 0) {
208  converter = std::unique_ptr<Converter>(new EscStatusUavcanToRos(ros_node, uavcan_node, ros_topic));
209  } else if (converter_name.compare("BaroStaticPressureRosToUavcan") == 0) {
210  converter = std::unique_ptr<Converter>(new BaroStaticPressureRosToUavcan(ros_node, uavcan_node, ros_topic));
211  } else if (converter_name.compare("BaroStaticTemperatureRosToUavcan") == 0) {
212  converter = std::unique_ptr<Converter>(new BaroStaticTemperatureRosToUavcan(ros_node, uavcan_node, ros_topic));
213  } else if (converter_name.compare("DiffPressureRosToUavcan") == 0) {
214  converter = std::unique_ptr<Converter>(new DiffPressureRosToUavcan(ros_node, uavcan_node, ros_topic));
215  } else if (converter_name.compare("GpsRosToUavcan") == 0) {
216  converter = std::unique_ptr<Converter>(new GpsRosToUavcan(ros_node, uavcan_node, ros_topic));
217  } else if (converter_name.compare("ImuRosToUavcan") == 0) {
218  converter = std::unique_ptr<Converter>(new ImuRosToUavcan(ros_node, uavcan_node, ros_topic));
219  } else if (converter_name.compare("MagnetometerRosToUavcan") == 0) {
220  converter = std::unique_ptr<Converter>(new MagnetometerRosToUavcan(ros_node, uavcan_node, ros_topic));
221  } else if (converter_name.compare("EscStatusRosToUavcan") == 0) {
222  converter = std::unique_ptr<Converter>(new EscStatusRosToUavcan(ros_node, uavcan_node, ros_topic));
223  } else if (converter_name.compare("IceReciprocatingStatusRosToUavcan") == 0) {
224  converter = std::unique_ptr<Converter>(new IceReciprocatingStatusRosToUavcan(ros_node, uavcan_node, ros_topic));
225  } else if (converter_name.compare("IceFuelTankStatusRosToUavcan") == 0) {
226  converter = std::unique_ptr<Converter>(new IceFuelTankStatusRosToUavcan(ros_node, uavcan_node, ros_topic));
227  } else if (converter_name.compare("BatteryInfoRosToUavcan") == 0) {
228  converter = std::unique_ptr<Converter>(new BatteryInfoRosToUavcan(ros_node, uavcan_node, ros_topic));
229  } else {
230  std::cout << "ERROR: instantiate_converter, wrong converter name" << std::endl;
231  }
232 
233  return converter;
234 }
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:112
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
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:157
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:126
void uavcan_callback(const uavcan::ReceivedDataStructure< IN_UAVCAN_MSG > &uavcan_msg) override
Definition: converters.cpp:58
void uavcan_callback(const uavcan::ReceivedDataStructure< IN_UAVCAN_MSG > &uavcan_msg) override
Definition: converters.cpp:38
void publish(const boost::shared_ptr< M > &message) const
void uavcan_callback(const uavcan::ReceivedDataStructure< IN_UAVCAN_MSG > &uavcan_msg) override
Definition: converters.cpp:71
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:139
ActuatorsUavcanToRos(ros::NodeHandle &ros_node, UavcanNode &uavcan_node, const char *ros_topic)
Definition: converters.hpp:115
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:90
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:146
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:104
void uavcan_callback(const uavcan::ReceivedDataStructure< IN_UAVCAN_MSG > &uavcan_msg) override
Definition: converters.cpp:22
void uavcan_callback(const uavcan::ReceivedDataStructure< IN_UAVCAN_MSG > &uavcan_msg) override
Definition: converters.cpp:79
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:97
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:167
void ros_velocity_callback(geometry_msgs::Twist::Ptr in_ros_msg)
Definition: converters.cpp:119
static Time now()
void ros_callback(IN_ROS_MSG_PTR in_ros_msg) override
Definition: converters.cpp:172
void ros_status_callback(std_msgs::UInt8 in_ros_msg)
Definition: converters.cpp:162


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