自省类型对应的文件

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 allocator = nullptr);

该函数会调用到 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 allocator)

然后再走到 create_publisher.hpp中

2 pub_->publish(msg_);

3 rclcpp::create_publisher_factory<MessageT, AllocatorT, PublisherT>(allocator),
publisher_options,
use_intra_process_comms);

posted on 2018-02-11 11:07  reedlau  阅读(436)  评论(0编辑  收藏  举报

导航