0
点赞
收藏
分享

微信扫一扫

ROS系统 动作编程

什么是动作

  • 一种问答通信机制
  • 带有连续反馈
  • 可以在任务过程终止运行
  • 基于ROS的消息机制实现。

Action的接口:

  • goal:发布任务目标
  • cancel:请求取消任务
  • status:通知客户端当前的状态
  • feedback:周期反馈任务运行的监控数据
  • result:向客户端发送任务的执行结果,只发布一次。
    ROS系统 动作编程_回调函数

创建功能包

cd ~/catkin_ws/src

catkin_create_pkg learning_action std_msgs roscpp rospy

ROS系统 动作编程_客户端_02

定义 action 文件夹

cd ~/catkin_ws/src/learning_action

mkdir action

ROS系统 动作编程_客户端_03

创建 DoDishes.action 文件

cd ~/catkin_ws/src/learning_action/action

touch DoDishes.action

ROS系统 动作编程_服务器_04

DoDishes.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

  • 定义目标信息:uint32 dishwasher_id
  • 定义结果信息:uint32 total_dishes_cleaned
  • 定义周期反馈的信息:float32 percent_complete

在package.xml中添加功能包依赖

<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>

ROS系统 动作编程_客户端_05

在CMakeLists.txt添加编译选项

find_package(catkin REQUIRED COMPONENTS
  ......
  .....
  .....
  actionlib_msgs 
  actionlib
)

ROS系统 动作编程_客户端_06

add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES std_msgs actionlib_msgs)

ROS系统 动作编程_服务器_07

配置完成后,对工程目录进行编译

cd&nbsp;~/catkin_ws

catkin_make

如何实现一个动作服务器

  • 初始化ROS节点
  • 创建动作服务器实例
  • 启动服务器,等待动作请求
  • 在回调函数中完成动作服务功能的处理,并反馈进度信息
  • 动作完成,发送结束信息。

通过以下代码去调用生成的头文件

在 src 目录下创建 两个 cpp文件

cd ~/catkin_ws/src/learning_action/src

创建 DoDishes_server.cpp 文件

touch DoDishes_server.cpp

以下是 DoDishes_server.cpp 文件中的内容
代码功能:实现一个动作服务器

#include <ros/ros.h>
#include <actionlib/server/simple_action_server.h>
#include "learning_communication/DoDishesAction.h"

typedef&nbsp;actionlib::SimpleActionServer&lt;learning_communication::DoDishesAction&gt;&nbsp;Server;

// 收到action的goal后调用该回调函数
void&nbsp;execute(const&nbsp;learning_communication::DoDishesGoalConstPtr&amp;&nbsp;goal,&nbsp;Server*&nbsp;as)
{
&nbsp;&nbsp;&nbsp;&nbsp;ros::Rate&nbsp;r(1);
&nbsp;&nbsp;&nbsp;&nbsp;learning_communication::DoDishesFeedback&nbsp;feedback;

&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;Dishwasher&nbsp;%d&nbsp;is&nbsp;working.&quot;,&nbsp;goal-&gt;dishwasher_id);

&nbsp;&nbsp;&nbsp;&nbsp;// 假设洗盘子的进度,并且按照1hz的频率发布进度feedback
&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=1;&nbsp;i&lt;=10;&nbsp;i++)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feedback.percent_complete&nbsp;=&nbsp;i&nbsp;*&nbsp;10;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;as-&gt;publishFeedback(feedback);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.sleep();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;// 当action完成后,向客户端返回结果
&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;Dishwasher&nbsp;%d&nbsp;finish&nbsp;working.&quot;,&nbsp;goal-&gt;dishwasher_id);
&nbsp;&nbsp;&nbsp;&nbsp;as-&gt;setSucceeded();
}

int&nbsp;main(int&nbsp;argc,&nbsp;char**&nbsp;argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;ros::init(argc,&nbsp;argv,&nbsp;&quot;do_dishes_server&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;ros::NodeHandle&nbsp;n;

&nbsp;&nbsp;&nbsp;&nbsp;// 定义一个服务器
&nbsp;&nbsp;&nbsp;&nbsp;Server&nbsp;server(n,&nbsp;&quot;do_dishes&quot;,&nbsp;boost::bind(&amp;execute,&nbsp;_1,&nbsp;&amp;server),&nbsp;false);
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;// 服务器开始运行
&nbsp;&nbsp;&nbsp;&nbsp;server.start();

&nbsp;&nbsp;&nbsp;&nbsp;ros::spin();

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
}

如何实现一个动作客户端

  • 初始化ROS节点
  • 创建动作客户端实例
  • 连接动作服务端
  • 发送动作目标
  • 根据不同类型的服务端反馈处理回调函数

创建 DoDishes_client.cpp 文件

touch DoDishes_client.cpp

DoDishes_client.cpp 文件中的内容

代码功能:实现一个动作客户端

DoDishes_client.cpp

#include <actionlib/client/simple_action_client.h>
#include "learning_communication/DoDishesAction.h"

typedef&nbsp;actionlib::SimpleActionClient&lt;learning_communication::DoDishesAction&gt;&nbsp;Client;

// 当action完成后会调用该回调函数一次
void&nbsp;doneCb(const&nbsp;actionlib::SimpleClientGoalState&amp;&nbsp;state,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;learning_communication::DoDishesResultConstPtr&amp;&nbsp;result)
{
&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;Yay!&nbsp;The&nbsp;dishes&nbsp;are&nbsp;now&nbsp;clean&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;ros::shutdown();
}

// 当action激活后会调用该回调函数一次
void&nbsp;activeCb()
{
&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;Goal&nbsp;just&nbsp;went&nbsp;active&quot;);
}

// 收到feedback后调用该回调函数
void&nbsp;feedbackCb(const&nbsp;learning_communication::DoDishesFeedbackConstPtr&amp;&nbsp;feedback)
{
&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;&nbsp;percent_complete&nbsp;:&nbsp;%f&nbsp;&quot;,&nbsp;feedback-&gt;percent_complete);
}

int&nbsp;main(int&nbsp;argc,&nbsp;char**&nbsp;argv)
{
&nbsp;&nbsp;&nbsp;&nbsp;ros::init(argc,&nbsp;argv,&nbsp;&quot;do_dishes_client&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;// 定义一个客户端
&nbsp;&nbsp;&nbsp;&nbsp;Client&nbsp;client(&quot;do_dishes&quot;,&nbsp;true);

&nbsp;&nbsp;&nbsp;&nbsp;// 等待服务器端
&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;Waiting&nbsp;for&nbsp;action&nbsp;server&nbsp;to&nbsp;start.&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;client.waitForServer();
&nbsp;&nbsp;&nbsp;&nbsp;ROS_INFO(&quot;Action&nbsp;server&nbsp;started,&nbsp;sending&nbsp;goal.&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;// 创建一个action的goal
&nbsp;&nbsp;&nbsp;&nbsp;learning_communication::DoDishesGoal&nbsp;goal;
&nbsp;&nbsp;&nbsp;&nbsp;goal.dishwasher_id&nbsp;=&nbsp;1;

&nbsp;&nbsp;&nbsp;&nbsp;// 发送action的goal给服务器端,并且设置回调函数
&nbsp;&nbsp;&nbsp;&nbsp;client.sendGoal(goal,&nbsp;&nbsp;&amp;doneCb,&nbsp;&amp;activeCb,&nbsp;&amp;feedbackCb);

&nbsp;&nbsp;&nbsp;&nbsp;ros::spin();

&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;
}

在CMakeLists.txt文件中添加以下代码:

add_executable(DoDishes_client src/DoDishes_client.cpp)
target_link_libraries( DoDishes_client ${catkin_LIBRARIES})
add_dependencies(DoDishes_client ${${PROJECT_NAME}_EXPORTED_TARGETS})

add_executable(DoDishes_server src/DoDishes_server.cpp)
target_link_libraries( DoDishes_server ${catkin_LIBRARIES})
add_dependencies(DoDishes_server ${${PROJECT_NAME}_EXPORTED_TARGETS})

ROS系统 动作编程_客户端_08

编译工程项目

cd ~/catkin_ws

catkin_make

ROS系统 动作编程_回调函数_09

启动ROS Master

roscore

启动自定义的客户端

rosrun learning_action DoDishes_client

启动自定义的服务端

rosrun learning_action DoDishes_server

ROS系统 动作编程_回调函数_10

举报

相关推荐

0 条评论