ros2_parser.cpp
Go to the documentation of this file.
1 #include "ros2_parser.h"
2 
3 #include <set>
4 
5 #include <rosidl_typesupport_introspection_c/message_introspection.h>
6 #include <rosidl_typesupport_introspection_cpp/message_introspection.hpp>
7 #include <rosidl_typesupport_introspection_cpp/field_types.hpp>
8 
9 #include <rosidl_typesupport_cpp/identifier.hpp>
10 #include <rosidl_typesupport_introspection_cpp/identifier.hpp>
11 #include <PlotJuggler/fmt/core.h>
12 
13 
14 bool TypeHasHeader(const rosidl_message_type_support_t* type_support)
15 {
16  auto members = static_cast<const rosidl_typesupport_introspection_cpp::MessageMembers *>(type_support->data);
17 
18  if (members->member_count_ >= 1 && members->members_)
19  {
20  const rosidl_typesupport_introspection_cpp::MessageMember& first_field = members->members_[0];
21  if (first_field.members_ == nullptr)
22  {
23  return false;
24  }
25  const auto* header_members = static_cast<const rosidl_typesupport_introspection_cpp::MessageMembers*>(first_field.members_->data);
26  if (strcmp(header_members->message_name_, "Header") == 0 && strcmp(header_members->message_namespace_, "std_msgs::"
27  "msg") == 0)
28  {
29  return true;
30  }
31  }
32  return false;
33 }
34 
35 std::string CreateSchema(const std::string& base_type)
36 {
37  std::string schema;
38  using TypeSupport = rosidl_message_type_support_t;
39  using namespace rosidl_typesupport_introspection_cpp;
40 
41  std::set<std::string> secondary_types_pending;
42  std::set<std::string> secondary_types_done;
43 
44  auto addTypeToSchema = [&](const std::string& type_name, bool add_header)
45  {
46  auto introspection_library = rosbag2_cpp::get_typesupport_library(type_name, "rosidl_typesupport_introspection_cpp");
47  auto introspection_support = rosbag2_cpp::get_typesupport_handle(type_name, "rosidl_typesupport_introspection_cpp",
48  introspection_library);
49 
50  if(add_header)
51  {
52  schema += fmt::format("=====================================\nMSG: {}\n", type_name);
53  }
54  const auto* members = static_cast<const MessageMembers*>(introspection_support->data);
55  for (size_t i = 0; i < members->member_count_; i++)
56  {
57  const MessageMember& member = members->members_[i];
58 
59  switch(member.type_id_)
60  {
61  case ROS_TYPE_FLOAT32: schema += "float32"; break;
62  case ROS_TYPE_FLOAT64: schema += "float64"; break;
63  case ROS_TYPE_UINT8:
64  case ROS_TYPE_BYTE:
65  case ROS_TYPE_CHAR: schema += "uint8"; break;
66  case ROS_TYPE_BOOLEAN: schema += "bool"; break;
67  case ROS_TYPE_INT8: schema += "int8"; break;
68  case ROS_TYPE_UINT16: schema += "uint16"; break;
69  case ROS_TYPE_INT16: schema += "int16"; break;
70  case ROS_TYPE_UINT32: schema += "uint32"; break;
71  case ROS_TYPE_INT32: schema += "int32"; break;
72  case ROS_TYPE_UINT64: schema += "uint64"; break;
73  case ROS_TYPE_INT64: schema += "int64"; break;
74  case ROS_TYPE_STRING: schema += "string"; break;
75  case ROS_TYPE_MESSAGE: {
76  auto type_info = reinterpret_cast<const MessageMembers*>(member.members_->data);
77  std::string package = type_info->message_namespace_;
78  package = package.substr(0, package.size() - 5); // remove "::msg"
79  const std::string field_type = fmt::format("{}/{}", package, type_info->message_name_);
80  schema += field_type;
81  if(secondary_types_done.count(field_type) == 0)
82  {
83  secondary_types_pending.insert(field_type);
84  }
85  } break;
86  }
87 
88  if (member.is_array_)
89  {
90  if(member.array_size_ > 0) {
91  schema += fmt::format("[{}]", member.array_size_);
92  }
93  else {
94  schema +="[]";
95  }
96  }
97  schema += fmt::format(" {}\n", member.name_);
98  }
99  };
100 
101  addTypeToSchema(base_type, false);
102 
103  while(!secondary_types_pending.empty())
104  {
105  auto it = secondary_types_pending.begin();
106  std::string other_type = *it;
107  secondary_types_done.insert(other_type);
108  addTypeToSchema(other_type, true);
109  secondary_types_pending.erase(it);
110  }
111  return schema;
112 }
113 
114 
115 TopicInfo CreateTopicInfo(const std::string& topic_name, const std::string& type_name)
116 {
117  TopicInfo info;
118  info.topic_name = topic_name;
119  info.type = type_name;
120 
121  info.introspection_library = rosbag2_cpp::get_typesupport_library(type_name, "rosidl_typesupport_introspection_cpp");
122  info.introspection_support = rosbag2_cpp::get_typesupport_handle(type_name, "rosidl_typesupport_introspection_cpp", info.introspection_library);
123 
124  auto identifier = rosidl_typesupport_cpp::typesupport_identifier;
125  info.support_library = rosbag2_cpp::get_typesupport_library(type_name, identifier);
126  info.type_support = rosbag2_cpp::get_typesupport_handle(type_name, identifier, info.support_library);
127 
129  return info;
130 }
131 
132 std::shared_ptr<PJ::MessageParser> CreateParserROS2(const PJ::ParserFactories& factories,
133  const std::string& topic_name,
134  const std::string& type_name,
136 {
137  return factories.at("ros2msg")->createParser(topic_name, type_name, CreateSchema(type_name), data);
138 }
TopicInfo::support_library
std::shared_ptr< rcpputils::SharedLibrary > support_library
Definition: ros2_parser.h:22
TopicInfo::topic_name
std::string topic_name
Definition: ros2_parser.h:15
CreateTopicInfo
TopicInfo CreateTopicInfo(const std::string &topic_name, const std::string &type_name)
Definition: ros2_parser.cpp:115
data
TypeHasHeader
bool TypeHasHeader(const rosidl_message_type_support_t *type_support)
Definition: ros2_parser.cpp:14
factories
auto factories(Functions &&... functions)
i
size_t & i
type_name
std::string type_name(lua_State *L, type t)
core.h
CreateSchema
std::string CreateSchema(const std::string &base_type)
Definition: ros2_parser.cpp:35
package
string package
TopicInfo::has_header_stamp
bool has_header_stamp
Definition: ros2_parser.h:17
it
iterator it
ros2_parser.h
TopicInfo::introspection_support
const rosidl_message_type_support_t * introspection_support
Definition: ros2_parser.h:20
meta_function::type_info
@ type_info
CreateParserROS2
std::shared_ptr< PJ::MessageParser > CreateParserROS2(const PJ::ParserFactories &factories, const std::string &topic_name, const std::string &type_name, PJ::PlotDataMapRef &data)
Definition: ros2_parser.cpp:132
TopicInfo::introspection_library
std::shared_ptr< rcpputils::SharedLibrary > introspection_library
Definition: ros2_parser.h:19
PJ::ParserFactories
std::map< QString, std::shared_ptr< ParserFactoryPlugin > > ParserFactories
field_type
def field_type(f)
TopicInfo::type
std::string type
Definition: ros2_parser.h:16
PJ::PlotDataMapRef
TopicInfo
Definition: ros2_parser.h:12
TopicInfo::type_support
const rosidl_message_type_support_t * type_support
Definition: ros2_parser.h:23


plotjuggler_ros
Author(s): Davide Faconti
autogenerated on Wed Feb 21 2024 03:22:56