多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 4.4 Action ## 4.4.1 简介 Actionlib是ROS中一个很重要的库,类似service通信机制,actionlib也是一种请求响应机制的通信方式,actionlib主要弥补了service通信的一个不足,就是当机器人执行一个长时间的任务时,假如利用service通信方式,那么publisher会很长时间接受不到反馈的reply,致使通信受阻。当service通信不能很好的完成任务时候,actionlib则可以比较适合实现长时间的通信过程,actionlib通信过程可以随时被查看过程进度,也可以终止请求,这样的一个特性,使得它在一些特别的机制中拥有很高的效率。 ## 4.4.2 通信原理 > Action的工作原理是client-server模式,也是一个双向的通信模式。通信双方在ROS Action Protocol下通过消息进行数据的交流通信。client和server为用户提供一个简单的API来请求目标(在客户端)或通过函数调用和回调来执行目标(在服务器端)。 工作模式的结构示意图如下: ![](https://img.kancloud.cn/e9/d7/e9d76507ebb6d7f35ff22128e8dae2d1_1010x353.png) 通信双方在ROS Action Protocal下进行交流通信是通过接口来实现,如下图: ![](https://img.kancloud.cn/91/f4/91f4748207c3a75df31db84654d1270b_415x170.png) 我们可以看到,客户端会向服务器发送目标指令和取消动作指令,而服务器则可以给客户端发送实时的状态信息,结果信息,反馈信息等等,从而完成了service没法做到的部分. ## 4.4.3 Action 规范 利用动作库进行请求响应,动作的内容格式应包含三个部分,目标、反馈、结果。 * 目标 机器人执行一个动作,应该有明确的移动目标信息,包括一些参数的设定,方向、角度、速度等等。从而使机器人完成动作任务。 * 反馈 在动作进行的过程中,应该有实时的状态信息反馈给服务器的实施者,告诉实施者动作完成的状态,可以使实施者作出准确的判断去修正命令。 * 结果 当运动完成时,动作服务器把本次运动的结果数据发送给客户端,使客户端得到本次动作的全部信息,例如可能包含机器人的运动时长,最终姿势等等。 ## 4.4.4 Action规范文件格式 Action规范文件的后缀名是.action,它的内容格式如下: # Define the goal uint32 dishwasher_id # Specify which dishwasher we want to use --- # Define the result uint32 total_dishes_cleaned --- # Define a feedback message float32 percent_complete ## 4.4.5 Action实例详解 Actionlib是一个用来实现action的一个功能包集。我们在demo中设置一个场景,执行一个搬运的action,搬运过程中客户端会不断的发回反馈信息,最终完成整个搬运过程. 本小节的演示源码在课程的演示代码包里,[此处为链接](https://github.com/sychaichangkun/ROS-Academy-for-Beginners). 首先写handling.action文件,类比如上的格式.包括三个部分,目标,结果,反馈.如下: # Define the goal uint32 handling_id --- # Define the result uint32 Handling_completed --- # Define a feedback message float32 percent_complete 写完之后修改文件夹里CmakeLists.txt如下内容: 1. find_package(catkin REQUIRED genmsg actionlib_msgs actionlib) 2. add_action_files(DIRECTORY action FILES DoDishes.action) generate_messages(DEPENDENCIES actionlib_msgs) 3. add_action_files(DIRECTORY action FILES Handling.action) 4. generate_messages( DEPENDENCIES actionlib_msgs) 修改package.xml,添加所需要的依赖如下: 1. `<build_depend>actionlib </build_depend> ` 2. `<build_depend>actionlib_msgs</build_depend>` 3. `<run_depend>actionlib</run_depend> ` 4. `<run_depend>actionlib_msgs</run_depend>` 然后回到工作空间 `catkin_ws`进行编译. 本例中设置的的action,定义了一个搬运的例子,首先写客户端,实现功能发送action请求,包括进行目标活动,或者目标活动.之后写服务器,实验返回客户端活动当前状态信息,结果信息,和反馈信息.从而实现action.本例测试结果截图如下: ![](https://img.kancloud.cn/96/64/9664064787b06a97c45d9d08c0253b7a_765x95.png) ![](https://img.kancloud.cn/dd/6c/dd6cd1049d180c71c85d05e4a2412002_653x58.png) ![](https://img.kancloud.cn/25/c8/25c8ac446a32717fc045b2d30a51e107_797x314.png) ![](https://img.kancloud.cn/6e/25/6e257427da4b6d57fb6f32aedf3c82a5_613x60.png) ## 小结 至此,ROS通信架构的四种通信方式就介绍结束,我们可以对比学习这四种通信方式,去思考每一种通信的优缺点和适用条件,在正确的地方用正确的通信方式,这样整个ROS的通信会更加高效,机器人也将更加的灵活和智能。机器人学会了通信,也就相当于有了“灵魂”。