ROS2:自定义接口文件(无废话)

一、ROS2接口文件定义

 ROS2中接口文件的格式根据通信的类型可以分为三种:

  • 话题通信:.msg文件
    常用格式为:[消息类型] 消息名称
	#话题通信接口格式
	#[消息类型] 消息名称
	int64 num
	int64 sum
	.
	.
	.
  • 服务通信:.srv文件
    常用格式为:
    [请求消息类型] 请求消息名称
    (三个短横杠隔开)
    [响应消息类型] 响应消息名称
	#服务通信接口格式
	#请求
	int64 num
	.
	.
	---
	#响应
	int64 sum
	.
	.
  • 动作通信:.action文件
    常用格式为:
    [请求消息类型] 请求消息名称
    (三个短横杠隔开)
    [响应消息类型] 响应消息名称
    (三个短横杠隔开)
    [反馈消息类型] 反馈消息名称
	#动作通信接口格式 
	#请求
	int64 num
	.
	.
	---
	#响应
	int64 sum
	.
	.
	---
	#反馈
	float feedback
	.
	.

消息变量的类型

  1. 数字型:intXX,floatXX等
  2. 时间类型:time,duration
  3. 字符串类型:string
  4. 变长数组与定长数组
    定长数组例如:int64[100]、float[100]等,变长数组例如 int[]、float[<=100]等
  5. 其它的msg文件(嵌套)
    特别谈一下嵌套,嵌套类型的定义语法为 完整包名/消息类型名的格式(package_name/TypeName)例如:geometry_msgs/Pose current_pose,并且需要在package.xml中包含所依赖的包

字段名必须小写字母开头,并且禁止双下划线与下划线结尾

二、创建接口文件步骤

  1. 工作空间/src下创建功能包(包名全小写):
ros2 pkg create [package_name] --build-type ament_cmake --dependencies [nested_package_name]
  1. 在功能包目录下创建文件夹:(msg\srv\action),并编写相应的接口文件(.msg\.srv\.action接口文件首字母必须大写且不包含下划线
  2. 在package.xml中添加 3 依赖:
<buildtool_depend>rosidl_default_generators</buildtool_depend> <!-- 构建依赖 --> 
<exec_depend>rosidl_default_runtime</exec_depend>              <!-- 运行时依赖 --> 
<member_of_group>rosidl_interface_packages</member_of_group>   <!-- 功能包依赖 --> 
  1. 在CmakeList中添加2编译规则:
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "[msg/srv/action]/xxx.msg/.srv/.action" #自定义
)
  1. 返回工作空间目录下,并执行编译:
colcon build --packages-select [package_name]

三、验证是否创建成功,以及自定义接口文件的使用

  1. 使用命令行工具查看接口:
. install/setup.bash 
ros2 interface show [package_name]/[msg/srv/action]/[interface_name]

如果能成功输出,则说明自定义接口文件成功!

  1. 如何在cpp程序中调用?
  • 首先,需要在package.xml中添加依赖: <depend>[interface_pkgname]</depend>
  • 其次,在CmakeList中加入find_package([interface_pkgname] REQUIRED),并在ament_target_dependencies()中加入interface_pkgname
    以上两步确保编译时能加入接口文件,并且在构建pkg时可以通过参数自动实现依赖添加(–dependencies interface_pkgname)
  • 在程序中引用时,需要包含头文件interface_pkgname/[msg/srv/action]/xxx.hpp
  • 使用时通过命名空间:using interface_pkgname::[msg/srv/action]::xxx引入接口类型。
### STM32CubeMX FreeRTOS CAN Queue Read Example #### 配置项目环境 为了实现基于FreeRTOS的CAN消息队列读取,在STM32CubeMX环境中需完成以下设置: - 使用STM32CubeMX创建新工程并选择目标MCU型号。 - 启用CAN外设支持,并通过RTE(Run-Time Environment)配置其参数,如波特率等。 - 添加对FreeRTOS的支持,这会自动引入必要的库文件和初始化代码。 #### 初始化FreeRTOS与CAN模块 确保已正确设置了`FreeRTOSConfig.h`中的各项参数以适应应用需求[^1]。对于CAN通信部分,则要依据具体硬件平台调整相应的初始化函数调用,通常位于`main.c`或其他由开发者指定的位置。 ```c // main.c or other designated file #include "cmsis_os.h" #include "can.h" osThreadId canReceiveTaskHandle; osMessageQueueId canMsgQueue; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_CAN1_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_CAN1_Init(); osKernelInitialize(); // Initialize CMSIS-OS V2 RTX Kernel // Create the message queue capable of holding up to 10 messages. canMsgQueue = osMessageQueueNew(10, sizeof(CAN_RxHeaderTypeDef), NULL); // Start thread as specified. canReceiveTaskHandle = osThreadNew(can_receive_task, NULL, NULL); osKernelStart(); } ``` #### 创建接收任务处理程序 定义一个专门的任务用于监听来自CAN总线的数据包并通过预先建立的消息队列传递给其他组件进一步解析或响应。 ```c #define MSG_QUEUE_TIMEOUT (10) void can_receive_task(void *argument) { uint8_t rxData[8]; CAN_RxHeaderTypeDef RxHeader; while (true) { if(HAL_CAN_GetRxMessage(&hcan1,&RxHeader,rxData)==HAL_OK){ // Put received data into a queue for processing by another task. osMessageQueuePut(canMsgQueue, &RxHeader, 0, MSG_QUEUE_TIMEOUT); /* Process Data Here */ } osDelay(1); // Short delay between checks } } ``` 上述代码片段展示了如何利用FreeRTOS提供的APIs构建一个多线程应用程序框架下的CAN报文接收机制。每当接收到新的数据帧时即刻将其存入共享资源——消息队列之中等待后续操作;与此同时保持较低优先级循环执行以便让渡CPU时间片给更高紧迫性的作业单元[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值