自省类型对应的文件
float32.h
float32__struct.h
float32__functions.h
float32__type_support.h
float32__struct.h
typedef struct std_msgs__msg__Float32
{
float data;
} std_msgs__msg__Float32;
typedef struct std_msgs__msg__Float32__Array
{
std_msgs__msg__Float32 * data;
size_t size;
size_t capacity;
} std_msgs__msg__Float32__Array;
float32__functions.h
bool std_msgs__msg__Float32__init(std_msgs__msg__Float32 * msg);
void std_msgs__msg__Float32__fini(std_msgs__msg__Float32 * msg);
std_msgs__msg__Float32 *std_msgs__msg__Float32__create();
void std_msgs__msg__Float32__destroy(std_msgs__msg__Float32 * msg);
bool std_msgs__msg__Float32__Array__init(std_msgs__msg__Float32__Array * array, size_t size);
void std_msgs__msg__Float32__Array__fini(std_msgs__msg__Float32__Array * array);
std_msgs__msg__Float32__Array * std_msgs__msg__Float32__Array__create(size_t size);
void std_msgs__msg__Float32__Array__destroy(std_msgs__msg__Float32__Array * array);
float32__type_support.h
const rosidl_message_type_support_t * ROSIDL_TYPESUPPORT_INTERFACE__MESSAGE_SYMBOL_NAME(rosidl_typesupport_c, std_msgs, msg, Float32)();
经过宏展开后会变成
const rosidl_message_type_support_t *rosidl_typesupport_c__get_message_type_support_handle__std_msgs__msg__Float32();
float32__rosidl_typesupport_introspection_c.h
在该message相关的目录中还会包含一个内省头文件
const rosidl_message_type_support_t *rosidl_typesupport_introspection_c__get_message_type_support_handle__std_msgs__msg__Float32();
函数所在位置
libstd_msgs__rosidl_typesupport_c.so |
---|
rosidl_typesupport_c__get_message_type_support_handle__std_msgs__msg__Float32 |
libstd_msgs__rosidl_typesupport_introspection_c.so |
---|
rosidl_typesupport_introspection_c__get_message_type_support_handle__std_msgs__msg__Float32 |
libstd_msgs__rosidl_generator_c.so |
---|
std_msgs__msg__Float32__init |
std_msgs__msg__Float32__fini |
std_msgs__msg__Float32__create |
std_msgs__msg__Float32__destroy |
动态库的依赖关系
typesupport_c <- typesupport_introspecton_c <- generator_c
|
<--------------------------------------------------------------|
rosidl_message_type_support 类型的定义
typedef struct rosidl_message_type_support_t
{
const char * typesupport_identifier;
const void * data;
rosidl_message_typesupport_handle_function func;
}
publish 的调用层次关系
1 pub_ = create_publisher<std_msgs::msg::String>("chatter");
msg_ = std::make_shared<std_msgs::msg::String>();
msg_->data="ABC";
其中create_publisher 来自于rclcpp/node.hpp中,是利用template定义的函数。
template<
typename MessageT, typename Alloc = std::allocator
typename PublisherT = ::rclcpp::Publisher<MessageT, Alloc> >
std::shared_ptr
create_publisher(
const std::string & topic_name,
const rmw_qos_profile_t & qos_profile = rmw_qos_profile_default,
std::shared_ptr
该函数会调用到 rclcpp/node_impl.hpp中的
template<typename MessageT, typename Alloc, typename PublisherT>
std::shared_ptr
Node::create_publisher(
const std::string & topic_name, const rmw_qos_profile_t & qos_profile,
std::shared_ptr
然后再走到 create_publisher.hpp中
2 pub_->publish(msg_);
3 rclcpp::create_publisher_factory<MessageT, AllocatorT, PublisherT>(allocator),
publisher_options,
use_intra_process_comms);