关键词:
actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的话,service机制就不能满足了,但是actionlib可满足用户这种需求。例如,控制机器人运动到地图中某一目标位置,这个过程可能复杂而漫长,执行过程中还可能强制中断或反馈信息,这时actionlib就能大展伸手了。
actionlib使用client-server工作模式,ActionClient 和ActionServer通过"ROS Action Protocol"进行通信,"ROS Action Protocol"以ROS消息方式进行传输。此外ActionClient 和ActionServer给用户提供了一些简单的接口,用户使用这些接口可以完成goal请求(client-side)和goal执行(server-side)。
ActionClient 和ActionServer之间使用action protocol通信,action protocol就是预定义的一组ROS message,这些message被放到ROS topic上在 ActionClient 和ActionServer之间进行传实现二者的沟通。
ROS Messages:
-
goal - Used to send new goals to servers. 代表一个任务,可以被ActionClient发送到ActionServer。比如在MoveBase中,它的类型是PoseStamped,包含了机器人运动目标位置的信息。
-
cancel - Used to send cancel requests to servers
-
status - Used to notify clients on the current state of every goal in the system
-
feedback - Used to send clients periodic auxiliary information for a goal. 服务端定期告知Client当前Goal执行过程中的情况。在Move Base案例中,它表示机器人当前姿态。
-
result - Used to send clients one-time auxiliary information upon completion of a goal
ROS系统在action文件(文件名后缀为.action)中定义了上述goal、result、feedback等消息。The .action file has the goal definition, followed by the result definition, followed by the feedback definition, with each section separated by 3 hyphens (---).
下面是一个示意的例子,在./action/DoDishes.action文件中对洗碗这一任务进行定义:goal为使用某一洗碗机洗碗,result为总共洗好的碗数目,feedback为洗碗进度。
# 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
下面在catkin_ws/src目录下创建一个测试package:
catkin_create_pkg actionlib_test roscpp std_msgs actionlib actionlib_msgs message_generation rospy
在package的CMakeLists.txt文件中加入下面这几行:
#find_package(catkin REQUIRED genmsg actionlib_msgs actionlib) add_action_files(DIRECTORY action FILES DoDishes.action) generate_messages(DEPENDENCIES actionlib_msgs)
注意如果使用catkin_create_pkg创建包时没有添加actionlib相关的依赖项,要将上面CMakeLists中第一行的注释去掉,另外还要在package.xml文件中加入下面几行。因为我们在创建包时就添加好了相关依赖,所以这一步骤可以省略。
<build_depend>actionlib</build_depend> <build_depend>actionlib_msgs</build_depend> <run_depend>actionlib</run_depend> <run_depend>actionlib_msgs</run_depend>
使用catkin_make编译即可查看生成的消息文件,这些消息之后将会用于ActionClient 和 ActionServer间的通信。
另外可以看到,在devel/include/actionlib_test/中生成了相关的头文件:
C++ SimpleActionClient
client示例代码client.cpp如下,它会等待Server连接,发送Goal,获取状态。SimpleActionClient完整的API可以参考C++ SimpleActionClient
#include <actionlib_test/DoDishesAction.h> #include <actionlib/client/simple_action_client.h> typedef actionlib::SimpleActionClient<actionlib_test::DoDishesAction> Client; int main(int argc, char** argv) { ros::init(argc, argv, "do_dishes_client"); Client client("do_dishes", true); // true -> don't need ros::spin() client.waitForServer(); // Waits for the ActionServer to connect to this client actionlib_test::DoDishesGoal goal; // Fill in goal here client.sendGoal(goal); // Sends a goal to the ActionServer client.waitForResult(ros::Duration(5.0)); // Blocks until this goal finishes if (client.getState() == actionlib::SimpleClientGoalState::SUCCEEDED) printf("Yay! The dishes are now clean\n"); printf("Current State: %s\n", client.getState().toString().c_str()); return 0; }
C++ SimpleActionServer
服务端代码server.cpp如下,SimpleActionServert完整的API可以参考 C++ SimpleActionServer
#include <actionlib_test/DoDishesAction.h> #include <actionlib/server/simple_action_server.h> typedef actionlib::SimpleActionServer<actionlib_test::DoDishesAction> Server; void execute(const actionlib_test::DoDishesGoalConstPtr& goal, Server* as) { // Do lots of awesome groundbreaking robot stuff here as->setSucceeded(); } int main(int argc, char** argv) { ros::init(argc, argv, "do_dishes_server"); ros::NodeHandle n; Server server(n, "do_dishes", boost::bind(&execute, _1, &server), false); server.start(); ros::spin(); return 0; }
在CMakeLists文件中加入下面这几行:
add_executable(client src/client.cpp) add_executable(server src/server.cpp) target_link_libraries( client ${catkin_LIBRARIES}) target_link_libraries( server ${catkin_LIBRARIES})
使用catkin_make进行编译完成后输入指令rosrun actionlib_test server 运行server,通过rostopic list查看系统中的话题如下:
使用rqt_graph命令可以查看节点和消息的关系,可以看出server端会接收goal和cancel消息,并发出status、result、feedback消息:
接着输入指令rosrun actionlib_test client 运行client,结果如下图所示:
Python SimpleActionClient
除了C++也可以使用Python实现同样的功能,client.py如下(API可以参考Python SimpleActionClient):
#! /usr/bin/env python import roslib roslib.load_manifest('actionlib_test') import rospy import actionlib from actionlib_test.msg import DoDishesAction, DoDishesGoal if __name__ == '__main__': rospy.init_node('do_dishes_client') client = actionlib.SimpleActionClient('do_dishes', DoDishesAction) client.wait_for_server() goal = DoDishesGoal() # Fill in the goal here client.send_goal(goal) client.wait_for_result(rospy.Duration.from_sec(5.0))
Python SimpleActionServer
server.py程序如下(API可参考Python SimpleActionServer):
#! /usr/bin/env python import roslib roslib.load_manifest('actionlib_test') import rospy import actionlib from actionlib_test.msg import DoDishesAction class DoDishesServer: def __init__(self): self.server = actionlib.SimpleActionServer('do_dishes', DoDishesAction, self.execute, False) self.server.start() def execute(self, goal): # Do lots of awesome groundbreaking robot stuff here self.server.set_succeeded() if __name__ == '__main__': rospy.init_node('do_dishes_server') server = DoDishesServer() rospy.spin()
注意在运行程序前先用chmod +x命令给Python文件添加可执行权限:
运行client.py和server.py,注意client.py运行就会返回:
参考:
rosactionlib学习
actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的话,service机制就不能满足了... 查看详情
《机器学习实战》-机器学习基础(代码片段)
目录机器学习基础什么是机器学习机器学习应用场景海量数据机器学习的重要性机器学习的基本术语监督学习和非监督学习监督学习:supervisedlearning非监督学习:unsupervisedlearning机器学习工具介绍Python非PythonNumPy函数库基础测试Nu... 查看详情
怎么快速入门深度学习
深度学习是一门综合的研究方向,目前大多数研究生都在研究这个,包括我在内,我研究的是图像识别领域,包括图像分类、目标识别、对象定位、风格迁移等等。说回来,那到底要如何去学习深度学习,首先深度学习属于机器... 查看详情
监督学习与无监督学习
监督学习与无监督学习的区别_机器学习最近发现很多人还是不能真正分清机器学习的学习方法,我以个人的愚见结合书本简单说一下这个机器学习中,可以根据学习任务的不同,分为监督学习(SupervisedLearning),无监督学习(Unsupervis... 查看详情
机器学习系列1-学习资料和学习路线
该系列是学习机器学习的系列博客,主要用于记录和分享学习机器学习(和深度学习)过程中的各种知识和问题,希望能够将自己学习到的知识、方法论转化为文字,分享给更多有志于从事机器学习相关工作或学习的同学。学习... 查看详情
监督学习,(ii)无监督学习,(iii)强化学习
】监督学习,(ii)无监督学习,(iii)强化学习【英文标题】:SupervisedLearning,(ii)UnsupervisedLearning,(iii)ReinforcementLearn【发布时间】:2013-03-2420:38:03【问题描述】:我是机器学习的新手。在阅读有关监督学习、无监督学习、强化学... 查看详情
监督学习非监督学习半监督学习
在机器学习(Machinelearning)领域,主要有三类不同的学习方法:监督学习(Supervisedlearning)、非监督学习(Unsupervisedlearning)、半监督学习(Semi-supervisedlearning),监督学习:通过已有的一部分输入数据与输出数据之间的对应关系,生成一个... 查看详情
机器学习中的有监督学习,无监督学习,半监督学习
在机器学习(Machinelearning)领域。主要有三类不同的学习方法:监督学习(Supervisedlearning)、非监督学习(Unsupervisedlearning)、半监督学习(Semi-supervisedlearning),监督学习:通过已有的一部分输入数据与输出数据之间的相应关系。生成一个... 查看详情
强化学习、深度学习和深度强化学习有啥区别?
】强化学习、深度学习和深度强化学习有啥区别?【英文标题】:What\'sthedifferencebetweenreinforcementlearning,deeplearning,anddeepreinforcementlearning?强化学习、深度学习和深度强化学习有什么区别?【发布时间】:2018-11-0515:46:20【问题描述... 查看详情
机器学习算法--集成学习
1.个体和集成 集成学习通过构建并结合多个“个体学习器”来完成学习任务。个体学习器通常由一个现有的学习算法从训练数据产生,若集成中只包含同种类型的个体学习器,称为同质集成;若包含不同类型的... 查看详情
强化学习⚠️手把手带你走进强化学习1⚠️强化学习简介
【强化学习】⚠️手把手带你走进强化学习1⚠️强化学习简介概述机器学习的分类为什么要学强化学习强化学习的组成概述从今天开始我们会开启一个新的篇章,带领大家来一起学习(卷进)强化学习(ReinforcementLearning).强化学习基... 查看详情
强化学习⚠️手把手带你走进强化学习1⚠️强化学习简介
【强化学习】⚠️手把手带你走进强化学习1⚠️强化学习简介概述机器学习的分类为什么要学强化学习强化学习的组成概述从今天开始我们会开启一个新的篇章,带领大家来一起学习(卷进)强化学习(ReinforcementLearning).强化学习基... 查看详情
机器学习入门
目录1机器学习概述2机器学习过程2.1机器学习与人类学习3机器学习的分类3.1无监督学习3.2监督学习3.3深度学习3.4强化学习4机器学习应用1机器学习... 查看详情
机器学习之集成学习
集成学习(ensemblelearning)通过构建并结合多个学习期来完成学习任务,同质学习器和异质学习器。弱学习器:泛化性能略优于随机猜测的学习器集成学习通过过个学习器进行结合,可以获得比单一学习器显著优越的泛化性能集... 查看详情
机器学习:机器学习算法分类
文章目录机器学习算法分类一、监督学习1、回归问题2、分类问题二、无监督学习三、半监督学习四、强化学习机器学习算法分类根据数据集组成不同,可以把机器学习算法分为:监督学习无监督学习半监督学习强化学习... 查看详情
监督学习,无监督学习和半监督学习
概念:监督学习、无监督学习与半监督学习监督学习:supervisedlearning 无监督学习:unsupervisedlearning 半监督学习:semi-supervisedlearning2、概念监督学习:用一部分已知分类、有标记的样本来训练机器后,让它用学到的特征,... 查看详情
深度学习是啥
参考技术A深度学习,是一个专业概念。美国国家研究理事会概括出深度学习的本质,即个体能够将其在一个情境中所学运用于新情境的过程。深度学习所对应的素养划分为三个领域:认知领域、人际领域和自我领域。深度学习... 查看详情
opencv学习-深度学习相关概念汇总
过拟合:过拟合和欠拟合的形象解释迁移学习:迁移学习概述监督学习、无监督学习:【机器学习笔记】有监督学习和无监督学习人工智能、机器学习与深度学习的区别:深度学习和机器学习的区别;AI、机器... 查看详情