自定义msg/srv/action

自定义msg/srv/action

ROS提供了三种节点间的通信机制:消息机制、服务机制、动作机制,其通信数据对应三种类型:msg、srv、action;同时ROS也提供了一些标准的msg/srv/action。具体可通过指令rosmsg/rossrv list查看。
ROS也提供了自定义msg/srv/action的接口,便于用户根据实际需求进行设计msg/srv/action以满足系统需求。

自定义msg

ros中支持用户自定义ros消息(msg),用于自定义的进程间传递数据信息。自定义消息的文件名为后缀.msg的文件。下面是自定义的一个机器人状态的消息RobotState.msg。

uint8 MANUAL_MODE=0    #模式枚举定义
uint8 BUILDING_MAP=1
uint8 NAV_MODE=2
uint8 NAV_INITIAL=3
uint8 DOCKING_MODE=4
uint16 NORMAL=0     #硬件状态枚举定义
uint16 LASER_ERROR=1
uint16 PWD_ERROR=32
uint16 IMU_ERROR=4
uint16 MOTOR_ERROR=16
uint16 ULTRASONIC_ERROR=8
uint8 mode_state   #控制模式状态
uint16 hardware_state  #硬件状态

自定义srv

ros中支持用户自定义ros服务(srv),用于自定义的进程间请求数据。自定义服务的文件名为后缀.srv的文件。下面是自定义的一个机器人状态的消息RobotStateService.srv。

#request
uint8 READ=255  #设置或读取状态枚举定义
uint8 MANUAL_MODE=0
uint8 BUILDING_MAP=1
uint8 NAV_MODE=2
uint8 NAV_INITIALED=3
uint8 DOCKING_MODE=4
uint8 state   #请求状态或写入状态
---
#response   
uint8 MANUAL_MODE=0  #模式枚举定义
uint8 BUILDING_MAP=1
uint8 NAV_MODE=2
uint8 NAV_INITIAL=3
uint8 DOCKING_MODE=4
uint16 NORMAL=0    #硬件状态枚举定义
uint16 LASER_ERROR=1
uint16 PWD_ERROR=32
uint16 IMU_ERROR=4
uint16 MOTOR_ERROR=16
uint16 ULTRASONIC_ERROR=8
uint8 mode_state   #控制模式状态
uint16 hardware_state #硬件状态

自定义action

ros中支持用户自定义ros动作(action),用于自定义的进程间请求某种动作并能够实时获得反馈。自定义动作的文件名为后缀.action的文件。下面是自定义的一个机器人自动回充的动作AutoDocking.action。

#goal
geometry_msgs/PoseStamped dock_pose #充电桩位置
bool use_move_base #是否使用move_base
---
#result
bool is_docked   #是否docked
---
#feedback
geometry_msgs/PoseStamped dock_pose #检测到的充电桩的位置
geometry_msgs/Twist command #机器人的速度指令

自定义msg/srv/action编译与使用

将上述自定义的消息、服务、动作加入到第二节中功能包tuorial中,在功能包中创建三个文件夹:msg、srv、action,然后分别将RobotState.msg、RobotStateService.srv、AutoDocking.action放入对应的文件夹。
添加完成后,修改CMakeLists.txt,修改内容如下:

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  geometry_msgs  #add new line
  message_generation #add new line
  actionlib  #add for action
  actionlib_msgs #add for action
)
## Generate messages in the 'msg' folder
add_message_files(
  FILES
  RobotState.msg
)
## Generate services in the 'srv' folder
add_service_files(
  FILES
  RobotStateService.srv
)
## Generate actions in the 'action' folder
add_action_files(
  FILES
  AutoDocking.action
)
## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
  geometry_msgs
  actionlib_msgs
)

由于在AutoDocking.action中引用到了geometry_msgs,故需要在CMakeLists.txt文件中添加对geometry_msgs的依赖,同时需要在package.xml中添加对geometry_msgs的依赖,在package.xml添加如下内容:

<build_depend>geometry_msgs</build_depend>
<build_depend>message_generation</build_depend>
<build_depend>actionlib</build_depend>
<build_export_depend>geometry_msgs</build_export_depend>
<build_export_depend>actionlib</build_export_depend>
<exec_depend>geometry_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
<exec_depend>actionlib</exec_depend>

修改完成后,运行编译指令编译即可:

$ cd ~/ros_ws/
$ catkin_make

编译结束后,可以通过rosmsg/rossrv show查看定义。

$ cd ~/ros_ws/
$ source devel/setup.bash   #加入环境变量
$ rosmsg show tutorial/RobotState

$ cd ~/ros_ws/
$ source devel/setup.bash   #加入环境变量
$ rossrv show tutorial/RobotStateService