什么是接口
这里的接口不是编程语言中的函数接口。而是应该理解为在ros2中进行数据通信的接口;这些接口在ros2中使用时必须有统一的标准,就像USB接口一样有着统一的通信协议。所以这里的接口更好的理解是:ros2数据通信的统一接口。
我们创建话题的时候,需要指定话题的类型,创建服务的时候也需要指定客户端和服务端服务的类型,不管是话题还是服务,这些类型都是结构体。
而这些通信的对象,不管是发起端还是接收端,都要指定数据通信的接口类型,而且只有发起端和接收端的接口类型一致,才能进行正常的数据通信。
接口的作用
指定数据通信两端使用的统一协议(统一数据格式--本质上就是统一结构体类型)。
通信的两端接口的类型不一样,但是接口中的数据一样,能通信吗?
1,如果是可以通信的,那么当一端有两个service所有接收的数据都一样,但是接口类型不一样时,当接收到同一个client请求时,应该由哪个service处理?
经过实际项目测试,通信的两端必须接口的类型(包括命名空间)必须一致,否则无法通信;
eg:
/robot_driver/srv/connect_robot和/example/srv/connect_robot两个接口,即使数据一模一样,也是无法通信的。
ros2的四种通信方式和3中接口
ros2原生的接口
查看ros2中所有接口
ros2 interface list
包括ros2原生的,以及后续添加的。
查看某个接口的定义
ros2 interface show 接口的完整路径(功能包/目录/接口名)
接口文件定义
msg,srv,action文件中都可以定义哪些类型的变量?
1,9个基础数据类型;
2,自定义类型;
定义数组类型
静态数组
只需要在类型的后面加上[ ]就是定义数组;
float64 j[12]
构建之后生成的数组是std::array类型。
// field types and members
using _j_type =
std::array<double, 12>;
_j_type j;
动态数组
不指定数组的大小就是定义动态数组;
int32[] var
生成:
using _var_type =
std::vector<int32_t, typename std::allocator_traits<ContainerAllocator>::template rebind_alloc<int32_t>>;
_var_type var;
限定大小的数组
int32[<=100] data
构建生成的类型:
// field types and members
using _data_type =
rosidl_runtime_cpp::BoundedVector<int32_t, 100, typename std::allocator_traits<ContainerAllocator>::template rebind_alloc<int32_t>>;
_data_type data;
BoundedVector---有界vector;
使用的时候单个数值传递给指定下标的数组元素即可;
当然,也可以定义这种长类型的变量,赋值:
rosidl_runtime_cpp::BoundedVector<int32_t, 100, typename std::allocator_traits<ContainerAllocator>::template rebind_alloc<int32_t>>
多维数组
ros2并不支持定义二维以上的数组,只能通过定义对象,对象中包含数组,再定义对象数组的方式实现多维数组。
int
注意,在接口定义文件中,没有"int"类型,只有int32,int64,int16等这种"int+数字"的格式;
float和double
float32---float
float64--double
int32[<=100] data
float32 float_32_var
float64 float_64_var
float32[3] float_32_array
float64[3] float_64_array
float32[] float_32_vector
float64[] float_64_vector
默认值
int32 size 12
int32 capacity 100