ROS | 动作通信的编程实现

本文介绍如何在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)通信接口提供了五种消息定义,分别为goalcancelstatusfeedbackresult,而.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值