【ROS2】创建自定义接口
ROS 系列学习教程(总目录)
ROS2 系列学习教程(总目录)
目录
- 一、创建功能包
- 二、创建接口定义文件
- 2.1 创建 Message 接口 (msg/)
- 2.2 创建 Service 接口 (srv/)
- 2.3 创建 Action 接口 (action/)
- 三、修改包配置文件
- 3.1 修改 package.xml
- 3.2 修改 CMakeLists.txt
- 四、构建接口包
- 五、验证接口
ROS2通讯接口包括三种类型的接口:Message
Service
Action
。
一、创建功能包
cd ros2_learning/code/src
# 语法:ros2 pkg create <package_name> --build-type ament_cmake
ros2 pkg create hello_world_interface --build-type ament_cmake
二、创建接口定义文件
进入包目录创建相应的文件夹和文件:
cd hello_world_interface
# msg srv action不是每个都必须,至少有其中一个
mkdir msg srv action
注意:默认情况下,接口文件命名必须遵循大驼峰命名法(帕斯卡命名法),接口协议字段必须遵循(小)蛇形命名,否则会编译失败。(后面会详述原因)
2.1 创建 Message 接口 (msg/)
示例:msg/RobotStatus.msg
在目录msg下创建文件 RobotStatus.msg,内容如下:
# 机器人状态信息
std_msgs/Header header
string robot_name
uint8 battery_level # 电池电量百分比
bool is_connected # 连接状态
float32 temperature # 温度摄氏度
geometry_msgs/Pose2D current_pose # 使用现有的geometry_msgs,单位:m,deg
示例:msg/MotorCommand.msg
(更简单)
在目录msg下创建文件 MotorCommand.msg,内容如下:
# 电机控制命令
float32 left_speed # 左轮速度 m/s
float32 right_speed # 右轮速度 m/s
uint8 priority # 命令优先级
2.2 创建 Service 接口 (srv/)
示例:srv/CalculatePath.srv
在目录srv下创建文件 CalculatePath.srv,内容如下:
# 请求:起点和终点位置
geometry_msgs/Point start
geometry_msgs/Point goal
---
# 响应:路径点和执行状态
geometry_msgs/Point[] path_points
bool success
string message # 状态信息
示例:srv/SetLED.srv
(简单示例)
在目录srv下创建文件 SetLED.srv,内容如下:
# 请求:设置LED状态
uint8 led_id # LED编号
bool led_on # 开关状态
---
# 响应:执行结果
bool success
2.3 创建 Action 接口 (action/)
示例:action/NavigateToGoal.action
在目录action下创建文件 NavigateToGoal.action,内容如下:
# 目标:导航到指定位置
geometry_msgs/PoseStamped target_pose
float32 max_velocity # 最大速度
---
# 结果:导航完成后的状态
geometry_msgs/PoseStamped final_pose
uint32 execution_time # 执行时间(秒)
bool success
string status_message
---
# 反馈:导航过程中的实时信息
geometry_msgs/PoseStamped current_pose
float32 distance_to_goal # 距离目标距离
uint8 percent_complete # 完成百分比
三、修改包配置文件
3.1 修改 package.xml
添加必要的依赖项:
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>hello_world_interface</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="1055311345@qq.com">Your Name</maintainer><license>TODO: License declaration</license><!-- 构建依赖 --><buildtool_depend>ament_cmake</buildtool_depend><!-- 必须添加 --><!-- 接口生成依赖 --><build_depend>rosidl_default_generators</build_depend><!-- 运行时依赖 --><exec_depend>rosidl_default_runtime</exec_depend><!-- 消息依赖(根据你使用的类型) --><depend>std_msgs</depend><depend>geometry_msgs</depend><depend>action_msgs</depend><!-- 必须的组 membership --><member_of_group>rosidl_interface_packages</member_of_group>
</package>
3.2 修改 CMakeLists.txt
配置接口生成:
cmake_minimum_required(VERSION 3.12)
project(hello_world_interface)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# 查找依赖
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(std_msgs REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(action_msgs REQUIRED)# 设置接口文件
set(msg_files"msg/RobotStatus.msg""msg/MotorCommand.msg"
)set(srv_files"srv/CalculatePath.srv""srv/SetLED.srv"
)set(action_files"action/NavigateToGoal.action"
)# 生成接口
rosidl_generate_interfaces(${PROJECT_NAME}${msg_files}${srv_files}${action_files}DEPENDENCIESstd_msgsgeometry_msgsaction_msgs
)# 安装接口文件
install(DIRECTORY msg srv actionDESTINATION share/${PROJECT_NAME}
)# 导出依赖
ament_export_dependencies(rosidl_default_runtime)
ament_export_dependencies(std_msgs)
ament_export_dependencies(geometry_msgs)
ament_export_dependencies(action_msgs)# 生成包配置
ament_package()
四、构建接口包
cd ~/ros2_learning/code
colcon build --packages-select hello_world_interface
五、验证接口
构建成功后,验证接口是否可用:
# Source 工作空间
source install/setup.bash# 查看所有自定义接口
ros2 interface list | grep hello_world_interface# 查看具体的接口定义
ros2 interface show hello_world_interface/msg/RobotStatus
ros2 interface show hello_world_interface/srv/CalculatePath
ros2 interface show hello_world_interface/action/NavigateToGoal# 查看接口原型
ros2 interface proto hello_world_interface/msg/RobotStatus
欢迎大家加QQ群,一起讨论学习:894013891