ROS | 动作通信的编程实现
1. 创建功能包
在ROS工作空间ROS_ws的src文件夹目录下创建一个功能包,命名为action_task。

2. 节点编程与动作消息定义
2.1 案例说明
客户端发送一个运动目标,模拟机器人运动到目标位置的过程,包含服务端和客户端的代码实现,要求带有实时位置反馈。

2.2 动作消息的定义
在功能包目录下创建一个新的文件夹,命名为action,并在此文件夹中创建一个空文件Motion.action。

在Motion.action文件中输入以下代码,定义动作消息内容。
//定义机器人运动终点坐标endx,endy
uint32 endx
uint32 endy
---
//定义机器人动作完成标志位
uint32 Flag_Finished
---
//定义机器人当前位置坐标coordinate_x,coordinate_y
uint32 coordinate_x
uint32 coordinate_y
说明:
- 动作(Action)通信接口提供了五种消息定义,分别为goal、cancel、status、feedback和result,而.action文件用来定义其中三种消息,按顺序分别为goal、result和feedback,与.srv文件中的服务消息定义方式一样,使用“—”作为分隔符。
Motion.action文件经过编译后生成MotionAction.h、MotionActionFeedback.h和MotionGoal.h等多个头文件,文件位置在ROS_ws工作空间下的devel/include/action_task文件夹内,如下图。

相关资料:http://wiki.ros.org/actionlib#Tutorials
2.3 创建.cpp文件
在功能包下面的action文件夹目录下创建一个空文件robotclient.cpp。
2.4 动作客户端编程
打开上面所创建的文件robotclient.cpp,输入以下代码。
#include <ros/ros.h>
#include <actionlib/client/simple_action_client.h>
#include "action_task/MotionAction.h"
typedef actionlib::SimpleActionClient<action_task::MotionAction> Client;
//当动作完成后,调用该回调函数一次
void doneCb(const actionlib::SimpleClientGoalState& state,
const action_task::MotionResultConstPtr& result)
{
ROS_INFO("The robot has arrived at the destination.");
ros::shutdown();
}
//当动作被激活,调用该函数一次
void activeCb()
{
ROS_INFO("Goal just went active");
}
//接收到feedback后,调用该回调函数
void feedbackCb(const action_task::MotionFeedbackConstPtr& feedback)
{
ROS_INFO(" The place of robot : (%d , %d) ", feedback->coordinate_x, feedback->coordinate_y);
}
int main(int argc, char** argv)
{
//初始化ROS节点
ros::init(argc, argv, "robot_client");
//创建一个action客户端
Client client("robot_motion", true);
//等待action服务器响应
ROS_INFO("Waiting for action server to start.");
client.waitForServer();
ROS_INFO("Action server started, sending goal.");
//创建一个action目标
action_task::MotionGoal goal;
goal.endx = 5;
goal.endy = 4;
//发送action目标给服务器,并设置回调函数
client.sendGoal(goal, &doneCb, &act

本文介绍如何在ROS中实现动作通信,包括创建功能包、定义动作消息、编程客户端和服务端等步骤,并提供完整的代码示例。
最低0.47元/天 解锁文章
7012

被折叠的 条评论
为什么被折叠?



