ROS 中 Action + server + topic 控制turtle定点

这篇博客介绍了如何在ROS中使用Action、Server和Topic来控制turtlebot实现定点控制。内容涵盖了所需的头文件、消息类型、依赖文件、服务端和客户端的代码结构,以及配置文件如CMakeLists.txt、package.xml等的重要性。
摘要由CSDN通过智能技术生成

ROS 中 Action + server + topic 控制turtle定点

#include头文件

  • 确定要用的消息类型(头文件):
    客户端:actionlib/client/simple_action_client.h 、actionlib/client/terminal_state.h 、sstream
    服务端:geometry_msgs/Twist.h 、actionlib/server/simple_action_server.h 、dynamic_reconfigure/server.h 、sstream

  • 确定要用到的文件(依赖)类型(头文件):srv、cfg 、yaml 、action

    • 客户端:action:<包名/action文件名Action.h>
    • 服务端:
      srv: <包名/srv文件名Srv.h>
      cfg:<包名/cfg文件名Config.h>
      action:<包名/action文件名Action.h>
  • .确定要用到的消息对象(服务端、客户端)所在的包(头文件):

    • 相对客户端:
      仅作为action的客户端,头文件包含相应的消息类头文件即可
    • 相对服务端:
      作为反馈:创建并发布feedback 和 result 消息,
      <包名/cfg文件名Config.h>
      作为客户端: 向serverSrv 请求(call) request
      <包名/srv文件名Srv.h>

思路图片

哈哈,上代码!!!

Action: 服务端
server_crt_pkg_node代码(感觉好LOW的).

#include "ros/ros.h"
#include <geometry_msgs/Twist.h>
#include "server_ctr_pkg/myTestSrv.h"
#include <turtlesim/Pose.h>
#include <dynamic_reconfigure/server.h>
#include <server_ctr_pkg/TutorialsConfig.h>
#include <actionlib/server/simple_action_server.h>
#include <server_ctr_pkg/TargetgoAction.h>
#include "turtlesim_control/turtlesimPidSrv.h"
#include <iostream> 
#include <unistd.h>
#include <cmath>
#include <math.h>

using namespace std;
class PoseControl
{
   
public:
    PoseControl(std::string name):as_(n,name,boost::bind(&PoseControl::execureCB,this,_1),false),action_name_(name)
	{
   
		PidClient = n.serviceClient<turtlesim_control::turtlesimPidSrv>("turtlesimpid_client");
		as_.start(); 
	}
public:
	//控制乌龟向当前点行走
	void execureCB(const server_ctr_pkg::TargetgoGoalConstPtr &goal)
	{
   
		bool success =true;
		//能被2整除说明是成对的X,Y
		float cur_pointX,cur_pointY;
		if((goal->target_list_point.size()%2) == 0)
		{
   
			for (int i = 0; i < goal->target_list_point.size(); i=i+2)       
			{
   
				cur_pointX = goal->target_list_point[i];
				cur_pointY = goal->target_list_point[i+1];
				if (as_.isPreemptRequested() || !ros::ok())
				{
   
					ROS_INFO("%s:Preempted", action_name_.c_str());
					as_.setPreempted();
					success = false;
					break;
				}
				ROS_INFO("The %d point cur point X: %f, Y: %f",i/2,cur_pointX,cur_pointY);

			   //向客户端反馈走到哪个点了
				feedback_.feedback_cur_point.clear();
				feedback_.feedback_cur_point.push_back(cur_pointX);
				feedback_.feedback_cur_point.push_back(cur_pointY);
				as_.publishFeedback(feedback_); //最新的反馈

				//开始向当前点走
				turtlesim_control::turtlesimPidSrv mysrv;
				mysrv.request.x=cur_pointX;
				mysrv.request.y=cur_pointY;
				mysrv.request.th = 0<
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值