如何自定义数据类型
在microros中,我们可以看到,官方给我们提供了很多数据类型。
如果我们在实际使用的时候,这些类型无法满足我们的传输要求怎么办呢?
官方也提供了自定义数据类型的办法。
参考:
https://github.com/micro-ROS/micro_ros_msgs
在这个库中给我们定义了三种demo 类型
我们也可以参考官方提供的interface增加我们的自定义数据类型
https://github.com/ros2/common_interfaces.git
假设我要增加这么一个结构体在传感器目录:
typedef struct sensor_msgs__msg__CustomerTestType
{
bool test_bool;
uint8_t test_uint8_array[32];
uint16_t test_uint16;
uint32_t test_uint32;
float test_float32;
double test_float64;
} sensor_msgs__msg__CustomerTestType;
通过以下两个步骤就可以实现:
step 1.创建CustomerTestType.msg
- 注意两点:
- .msg 文件名必须满足驼峰式命名结构,不可以使用_*、等特殊符号
- 定义在.msg文件内的基础类型参考std_msg的base type
step 2.将CustomerTestType.msg加入CMAKE中编译
step 3: 将自定义msg加入rosidl_generate_interfaces生成数据结构
- cmake 中引用rosidl_generate_interfaces函数
- package中加入到生成队列中
上面方法,我们直接将自定义的数据类型放在官方的sensor_msgs下面,只要实现step1/2就可以。
最后运行ros2编译
ros2 run micro_ros_setup build_firmware.sh $(pwd)/my_custom_toolchain.cmake $(pwd)/my_custom_colcon.meta
我们在编译好的interface中找到我们的自定义类型
和我们想要的完全一致
我们在后期项目引用的时候,只要包含我们的头文件即可:
1.包含头文件
#include <std_msgs/msg/customer_test_type.h>
2,定义自定义变量
sensor_msgs__msg__CustomerTestType msg;
3.初始化topic
rclc_publisher_init_default(&publisher,&node,ROSIDL_GET_MSG_TYPE_SUPPORT(sensor_msgs, msg, CustomerTestType),"testtopic"));
4.sender送数据
sensor_msgs__msg__CustomerTestType * Data = &msg;
Data->data.data = &testdata;
Data->data.size = sizeof(sensor_msgs__msg__CustomerTestType);
RCSOFTCHECK(rcl_publish(&publisher, Data, NULL));
5.接收数据
void subscription_callback(const void * msgin)
{
const sensor_msgs__msg__CustomerTestType * msg = (const sensor_msgs__msg__CustomerTestType *)msgin;
}