这里写目录标题
介绍
service 是一种请求+反馈的通信机制。消息的传输只涉及两个 node:发送请求的一方称为 client,提供服务的一方叫做 server。在通过 service 形式进行通讯时,client 首先向 server 请求服务, 收到消息之后 server 运行事先设置好的服务功能,并返回消息给 client。service 通讯一般用在事件触发情景中,例如满足某个条件就令 node 开启某项功能,并希望确认功能确实顺利开启。(这段摘抄的别人的)
动作与话题和服务不同,在异步、双向,以及请求和响应之间需要很长的时间的情况,以及需要中途结果值等需要更复杂的编程的情况中显的格外有用。
生成功能包
这个功能包依赖于message_generation、std_msgs、actionlib_msgs、actionlib和roscpp功能包,因此将这些作为了依赖选项。
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_action message_generation std_msgs actionlib_msgs actionlib roscpp
修改功能包配置文件(package.xml)
包括修改功能包配置文件(package.xml)的大部分过程与上述话题和服务中描述的
过程非常相似。除了本节的例子中的细节之外,我只会提到源代码并跳过细节。
$ roscd ros_tutorials_action
$ gedit package.xml
修改构建配置文件(CMakeLists.txt)
与上面介绍的ros_tutorials_topic和ros_tutorials_service节点的构建配置文件不同的是,如果这些节点的构建过程中生成了msg和srv文件,那么ros_tutorials_action功能包会生成动作文件(*.action)。此外,还添加了一个新的动作服务器节点和一个动作客户端节点作为使用它的示例节点。另外,由于我们使用了一个ROS之外的名为Boost的库,所以多了一个单独的依赖项选项
$ gedit CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(ros_tutorials_action)
ROS机器人编程
find_package(catkin REQUIRED COMPONENTS
message_generation
std_msgs
actionlib_msgs
actionlib
roscpp
)
find_package(Boost REQUIRED COMPONENTS system)
add_action_files(FILES Fibonacci.action)
generate_messages(DEPENDENCIES actionlib_msgs std_msgs)
catkin_package(
LIBRARIES ros_tutorials_action
CATKIN_DEPENDS std_msgs actionlib_msgs actionlib roscpp
DEPENDS Boost
)
include_directories(${
catkin_INCLUDE_DIRS} ${
Boost_INCLUDE_DIRS})
add_executable(action_server src/action_server.cpp)
add_dependencies(action_server ${
${
PROJECT_NAME}_EXPORTED_TARGETS} ${
catkin_EXPORTED_TARGETS})
target_link_libraries(action_server ${
catkin_LIBRARIES})
add_executable(action_client src/action_client.cpp)
add_dependencies(action_client ${
${
PROJECT_NAME}_EXPORTED_TARGETS} ${
catkin_EXPORTED_TARGETS})
target_link_libraries(action_client ${
catkin_LIBRARIES})
创建动作文件
$ roscd ros_tutorials_action → 移动到功能包目录
$ mkdir action → 在功能包中创建一个名为action的动作目录
$ cd action → 移至创建的action目录
$ gedit Fibonacci.action → 创建Fibonacci.action文件并修改内容
在动作文件中,三个连字符(—)用作分隔符,第一个是goal消息,第二个是result消息,第三个是feedback消息。goal消息和result消息之间的关系与上述srv文件相同,但主要区别在于feedback消息用于指定进程执行过程中的中间值传输。
#goal definition
int32 order
---
#result definition
int32[] sequence
--