TraveSim Adapters  0.1
Protobuf adapters for TraveSim project
vision_sender.cpp
Go to the documentation of this file.
1 /**
2  * @file vision_sender.cpp
3  *
4  * @author Lucas Haug <lucas.haug@thunderatz.org>
5  *
6  * @brief Vision data sender with UDP and protobuf
7  *
8  * @date 04/2021
9  *
10  * @copyright MIT License - Copyright (c) 2021 ThundeRatz
11  */
12 
13 #include <ros/console.h>
15 
16 /*****************************************
17  * Class Methods Bodies Definitions
18  *****************************************/
19 
20 namespace travesim {
21 namespace proto {
22 VisionSender::VisionSender(const std::string multicast_address, const short multicast_port) {
23  this->multicast_sender =
24  std::unique_ptr<udp::MulticastSender>(new udp::MulticastSender(multicast_address, multicast_port));
25 }
26 
27 bool VisionSender::send(FieldState* p_field_state) {
28  fira_message::sim_to_ref::Environment env_data = this->field_state_to_env_pb_msg(p_field_state);
29 
30  std::string buffer;
31  env_data.SerializeToString(&buffer);
32 
33  if (this->multicast_sender->send(buffer.c_str(), buffer.length()) == 0) {
34  ROS_WARN_STREAM("Error sending vision protobuff message");
35 
36  return false;
37  }
38 
39  return true;
40 }
41 
42 void VisionSender::set_multicast_endpoint(const std::string multicast_address, const short multicast_port) {
43  this->multicast_sender->set_receiver_endpoint(multicast_address, multicast_port);
44 }
45 
46 fira_message::sim_to_ref::Environment VisionSender::field_state_to_env_pb_msg(FieldState* p_field_state) {
47  fira_message::sim_to_ref::Environment env_data;
48  fira_message::Frame* frame = env_data.mutable_frame();
49 
50  // Set step
51  env_data.set_step(p_field_state->time_step);
52 
53  // Set ball data
54  fira_message::Ball* frame_ball = frame->mutable_ball();
55 
56  frame_ball->set_x(p_field_state->ball.position.x);
57  frame_ball->set_y(p_field_state->ball.position.y);
58  frame_ball->set_vx(p_field_state->ball.velocity.x);
59  frame_ball->set_vy(p_field_state->ball.velocity.y);
60 
61  // Set yellow team
62  for (int i = 0; i < p_field_state->robots_per_team; i++) {
63  fira_message::Robot* robot = frame->add_robots_yellow();
64 
65  robot->set_robot_id(i);
66 
67  robot->set_x(p_field_state->yellow_team[i].position.x);
68  robot->set_y(p_field_state->yellow_team[i].position.y);
69  robot->set_orientation(p_field_state->yellow_team[i].angular_position);
70 
71  robot->set_vx(p_field_state->yellow_team[i].velocity.x);
72  robot->set_vy(p_field_state->yellow_team[i].velocity.y);
73  robot->set_vorientation(p_field_state->yellow_team[i].angular_velocity);
74  }
75 
76  // Set blue team
77  for (int i = 0; i < p_field_state->robots_per_team; i++) {
78  fira_message::Robot* robot = frame->add_robots_blue();
79 
80  robot->set_robot_id(i);
81 
82  robot->set_x(p_field_state->blue_team[i].position.x);
83  robot->set_y(p_field_state->blue_team[i].position.y);
84  robot->set_orientation(p_field_state->blue_team[i].angular_position);
85 
86  robot->set_vx(p_field_state->blue_team[i].velocity.x);
87  robot->set_vy(p_field_state->blue_team[i].velocity.y);
88  robot->set_vorientation(p_field_state->blue_team[i].angular_velocity);
89  }
90 
91  // Set field dimensions
92  fira_message::Field* field = env_data.mutable_field();
93 
94  field->set_width(FIELD_WIDTH_M);
95  field->set_length(FIELD_LENGTH_M);
96  field->set_goal_width(GOAL_WIDTH_M);
97  field->set_goal_depth(GOAL_DEPTH_M);
98 
99  return env_data;
100 }
101 } // namespace proto
102 } // namespace travesim
EntityState ball
Field entities.
Definition: field_state.hpp:48
Data structure to hold the field state.
Definition: field_state.hpp:25
std::vector< EntityState > yellow_team
Definition: field_state.hpp:50
Vector2D velocity
Velocity in m/s.
void set_multicast_endpoint(const std::string multicast_address, const short multicast_port)
Set the multicast endpoint.
double x
Public attributes.
#define FIELD_LENGTH_M
Definition: data_common.hpp:28
#define GOAL_DEPTH_M
Definition: data_common.hpp:30
#define GOAL_WIDTH_M
Definition: data_common.hpp:29
Vision data sender with UDP and protobuf.
Vector2D position
Position in meters.
VisionSender(const std::string multicast_address, const short multicast_port)
Construct a new Vision Sender object.
static fira_message::sim_to_ref::Environment field_state_to_env_pb_msg(FieldState *p_field_state)
Convert a FieldState object to a Environment protobuf message object.
Sender class using UDP in multicast mode.
std::vector< EntityState > blue_team
Definition: field_state.hpp:51
bool send(FieldState *p_field_state)
Send vision data with UDP and protobuf.
std::unique_ptr< udp::MulticastSender > multicast_sender
#define FIELD_WIDTH_M
Field and goal constants.
Definition: data_common.hpp:27