练习ROS动作编程

news2025/9/21 14:11:40

ROS学习记录:动作编程

引言:

​ 通过本实验,我们将联系我们学过的动作编程,客户端发送一个运动目标,模拟小乌龟运动到目标位置的过程,包含服务端和客户端的代码实现,并且带有实时的位置反馈。

希望你在本次学习过后,能够有一定的收获!!!

推荐歌曲—失忆(正式版)-吕口口

​ 冲啊!!!! ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶ ٩(͡๏̯͡๏)۶

文章目录

  • ROS学习记录:动作编程
  • 一、创建工作区间
      • **1.创建功能包**
      • **2.编译功能包**
  • 二、动作编程
      • 1.定义action文件
      • 2.创建cpp文件
      • 3.修改package.xml文件
      • 4.修改 CMakeLists.txt
      • 5.编译程序

一、创建工作区间

1.创建功能包

mkdir -p ~/catkin_ws/src
cd catkin_ws/src/
catkin_create_pkg learning_communication std_msgs rospy roscpp

2.编译功能包

cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash

二、动作编程

1.定义action文件

gedit TurtleMove.action
# Define the goal 
float64 turtle_target_x  
# Specify Turtle's target position 
float64 turtle_target_y 
float64 turtle_target_theta 
---
# Define the result 
float64 turtle_final_x 
float64 turtle_final_y 
float64 turtle_final_theta 
--- 
# Define a feedback message 
float64 present_turtle_x 
float64 present_turtle_y 
float64 present_turtle_theta

在这里插入图片描述

2.创建cpp文件

在learning_communication的src文件夹下,创建TurtleMove_server.cpp文件和TurtleMove_client.cpp文件

gedit TurtleMove_server.cpp
gedit TurtleMove_client.cpp

TurtleMove_server.cpp文件

  /*      此程序通过通过动作编程实现由client发布一个目标位置    然后控制Turtle运动到目标位置的过程  */ 
#include <ros/ros.h> #include <actionlib/server/simple_action_server.h> 
#include "learn_action/TurtleMoveAction.h" 
#include <turtlesim/Pose.h>  
#include <turtlesim/Spawn.h> 
#include <geometry_msgs/Twist.h>   
typedef actionlib::SimpleActionServer<learn_action::TurtleMoveAction> Server;   
struct Myturtle 
{     
     float x;     
     float y;     
     float theta; 
 }turtle_original_pose,turtle_target_pose;   
 ros::Publisher turtle_vel;  
 void posecallback(const turtlesim::PoseConstPtr& msg)  
 {    
 	ROS_INFO("Turtle1_position:(%f,%f,%f)",msg->x,msg->y,msg->theta);   
 	turtle_original_pose.x=msg->x;    
 	turtle_original_pose.y=msg->y;   
 	turtle_original_pose.theta=msg->theta;  
 }   
 // 收到action的goal后调用该回调函数 
 void execute(const learn_action::TurtleMoveGoalConstPtr& goal, Server* as) 
 {     
 	learn_action::TurtleMoveFeedback feedback;       
 	ROS_INFO("TurtleMove is working.");     
 	turtle_target_pose.x=goal->turtle_target_x;     
 	turtle_target_pose.y=goal->turtle_target_y;      
 	turtle_target_pose.theta=goal->turtle_target_theta;          
 	geometry_msgs::Twist vel_msgs;     
 	float break_flag;          
 	while(1)     
 	{           
 		ros::Rate r(10);                  
 		vel_msgs.angular.z = 4.0 * (atan2(turtle_target_pose.y-turtle_original_pose.y,                                    turtle_target_pose.x-turtle_original_pose.x)-turtle_original_pose.theta);         
 		vel_msgs.linear.x = 0.5 * sqrt(pow(turtle_target_pose.x-turtle_original_pose.x, 2) +                                       pow(turtle_target_pose.y-turtle_original_pose.y, 2));          
 		break_flag=sqrt(pow(turtle_target_pose.x-turtle_original_pose.x, 2) +                                         pow(turtle_target_pose.y-turtle_original_pose.y, 2));         
 		turtle_vel.publish(vel_msgs);
 		           
 		feedback.present_turtle_x=turtle_original_pose.x;         
 		feedback.present_turtle_y=turtle_original_pose.y;         
 		feedback.present_turtle_theta=turtle_original_pose.theta;         
 		as->publishFeedback(feedback);         
 		ROS_INFO("break_flag=%f",break_flag);         if(break_flag<0.1) break;         r.sleep();     }         // 当action完成后,向客户端返回结果         ROS_INFO("TurtleMove is finished.");         
 		as->setSucceeded();
}   
int main(int argc, char** argv) 
{     
	ros::init(argc, argv, "TurtleMove_server");     
	ros::NodeHandle n,turtle_node;     
	ros::Subscriber sub =turtle_node.subscribe("turtle1/pose",10,&posecallback);//订阅小乌龟的位置信息     
	turtle_vel = turtle_node.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",10);//发布控制小乌龟运动的速度     
	// 定义一个服务器         
	Server server(n, "TurtleMove", boost::bind(&execute, _1, &server), false);        
	 // 服务器开始运行         
	 server.start();         
	 ROS_INFO("server has started.");     
	 ros::spin();       
	 return 0;
} 

TurtleMove_client.cpp文件

#include <actionlib/client/simple_action_client.h> 
#include "learn_action/TurtleMoveAction.h" 
#include <turtlesim/Pose.h>  
#include <turtlesim/Spawn.h> 
#include <geometry_msgs/Twist.h>   
typedef actionlib::SimpleActionClient<learn_action::TurtleMoveAction> Client;   
struct Myturtle 
{     
	float x;     
	float y;   
	float theta; 
}turtle_present_pose;   
// 当action完成后会调用该回调函数一次 
void doneCb(const actionlib::SimpleClientGoalState& state,         const learn_action::TurtleMoveResultConstPtr& result) 
{     
	ROS_INFO("Yay! The TurtleMove is finished!");     
	ros::shutdown(); 
}   
// 当action激活后会调用该回调函数一次 
void activeCb() 
{     
	ROS_INFO("Goal just went active"); 
}   
// 收到feedback后调用该回调函数 
void feedbackCb(const learn_action::TurtleMoveFeedbackConstPtr& feedback) 
{     
	ROS_INFO(" present_pose : %f  %f  %f", feedback->present_turtle_x,                    feedback->present_turtle_y,feedback->present_turtle_theta); 
}   
int main(int argc, char** argv) 
{     
	ros::init(argc, argv, "TurtleMove_client");       
	// 定义一个客户端     
	Client client("TurtleMove", true);       
	// 等待服务器端     
	ROS_INFO("Waiting for action server to start.");     
	client.waitForServer();     
	ROS_INFO("Action server started, sending goal.");      
	 // 创建一个action的goal     
	 learn_action::TurtleMoveGoal goal;    
	 goal.turtle_target_x = 1;     
	 goal.turtle_target_y = 1;     
	 goal.turtle_target_theta = 0;       
	 // 发送action的goal给服务器端,并且设置回调函数     
	 client.sendGoal(goal,  &doneCb, &activeCb, &feedbackCb);       
	 ros::spin();      
	 return 0; 
} 

在这里插入图片描述

在这里插入图片描述

3.修改package.xml文件

<build_depend>message_generation</build_depend>  
<build_depend>actionlib</build_depend>  
<build_depend>actionlib_msgs</build_depend>
<exec_depend>message_runtime</exec_depend>  
<exec_depend>actionlib</exec_depend>  
<exec_depend>actionlib_msgs</exec_depend> 

在这里插入图片描述

4.修改 CMakeLists.txt

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

文件最后添加

add_executable(TurtleMove_client src/TurtleMove_client.cpp)
target_link_libraries(TurtleMove_client ${catkin_LIBRARIES})
add_dependencies(TurtleMove_client ${PROJECT_NAME}_gencpp)  

add_executable(TurtleMove_server src/TurtleMove_server.cpp)
target_link_libraries(TurtleMove_server ${catkin_LIBRARIES})
add_dependencies(TurtleMove_server ${PROJECT_NAME}_gencpp) 

在这里插入图片描述

5.编译程序

cd ~/catkin_ws
catkin_make

编译成功

在这里插入图片描述

6.运行程序

程序代码

roscore

rosrun turtlesim turtlesim_node

source ./devel/setup.bash
rosrun learning_communication TurtleMove_server

source ./devel/setup.bash
rosrun learning_communication TurtleMove_client

结果图

在这里插入图片描述

最后感谢大佬友情链接:

  • https://blog.csdn.net/weixin_45137708/article/details/105351970

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1503365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html--心花怒放

代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Canvas 绘制一个❤</title><link rel"shortcut icon" href"../../assets/images/icon/favicon.ico" type"ima…

Edge好用的插件

目录 浏览器下载插件 插件推荐 AdGuard 广告拦截器 功能介绍 Global Speed: 视频速度控制 功能介绍 iTab新标签页(免费ChatGPT) 功能介绍 篡改猴&#xff08;强大的浏览器插件&#xff09; 功能介绍 浏览器下载插件 点击浏览器右上角的三个点&#xff0c;选择扩展 …

LeetCode 173.二叉搜索树迭代器

实现一个二叉搜索树迭代器类BSTIterator &#xff0c;表示一个按中序遍历二叉搜索树&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 类的一个对象。BST 的根节点 root 会作为构造函数的一部分给出。指针应初始化为一个不存在…

C# 视频转图片

在 C# 中将视频转换为图像可以使用 FFmpeg 库。下面是一个示例代码来完成这个任务&#xff1a; using System; using System.Diagnostics;class Program {static void Main(string[] args){string inputFile "input_video.mp4"; // 输入的视频文件路径string outpu…

App前端开发跨平台框架比较:React Native、Flutter、Xamarin等

引言 移动应用开发领域的跨平台框架正在不断演进&#xff0c;为开发者提供更多选择。在本文中&#xff0c;我们将比较几个流行的跨平台框架&#xff1a;React Native、Flutter和Xamarin等。讨论它们的优缺点、适用场景以及开发体验。 第一部分 React Native: 优缺点、适用场景…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

理解JavaScript中的WeakSet和WeakMap

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Python】科研代码学习:五 Data Collator,Datasets

【Python】科研代码学习&#xff1a;五 Data Collator&#xff0c;Datasets Data CollatorDefault data collatorDefaultDataCollatorDataCollatorWithPaddingPadding 其他 Data Collator Datasetsload_dataset其他一些基本操作 Data Collator HF官网API&#xff1a;Data Coll…

网易再战腾讯,《永劫无间》宣发捡大漏

《王者荣耀》代言人唯爱《永劫无间》&#xff1f; 最近时代少年团成员严浩翔疑似打赏《永劫无间》女主播一事&#xff0c;在饭圈和游戏圈引起了轩然大波&#xff0c;“男偶像打赏女主播”和“《王者荣耀》代言人爱玩《永劫无间》”&#xff0c;一时不知道哪个行为更炸裂。 虽…

力扣hot100题解(python版63-68题)

63、搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输…

Android Studio下载gradle超时问题解决

方法一 1. 配置根目录的setting.gradle.kts文件 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urluri ("https://maven.aliyun.com/repos…

结构体内存对齐详解

目录 结构体对齐&#xff1a; 为什么要进行内存对齐&#xff1f; 关于结构体的详解文章&#xff1a;C语言结构体详解_结构体变量和结构体类型举例-CSDN博客 结构体对齐&#xff1a; 存储的时候和当前存储的成员类型字节大小和默认对齐数比较&#xff0c;取小值 存在该对齐数的…

Windows11安装FFmpeg最新版本

打开终端: 输入 winget install ffmpeg 然后输入 Y 回车后出现如下图: 正在下载FFmpeg 6.1 安装成功 测试

cocos creator 3.7.2使用shader实现图片扫光特效

简介 功能&#xff1a;图片实现扫光效果 引擎&#xff1a;cocos Creator 3.7.2 开发语言&#xff1a;ts 完整版链接 链接https://lengmo714.top/284d90f4.html 效果图 shader代码 // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{techniques:- pas…

vue 下载的插件从哪里上传?npm发布插件详细记录

文章参考&#xff1a; 参考文章一&#xff1a; 封装vue插件并发布到npm详细步骤_vue-cli 封装插件-CSDN博客 参考文章二&#xff1a; npm发布vue插件步骤、组件、package、adduser、publish、getElementsByClassName、important、export、default、target、dest_export default…

【开源】SpringBoot框架开发免税店商城管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统展示四、核心代码4.1 查询免税种类4.2 查询物品档案4.3 新增顾客4.4 新增消费记录4.5 审核免税 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的免税店商城管理系…

day-18 轮转数组

时间复杂度为O&#xff08;n&#xff09; code: class Solution {public void rotate(int[] nums, int k) {int nnums.length;kk%n;int arr[]new int[n];for(int i0;i<n;i){arr[(ik)%n]nums[i];}for(int i0;i<n;i){nums[i]arr[i];}} }参考答案 进行三次翻转 空间复杂度O…

让开源浏览器Chromium正常显示中文

什么是 Chromium &#xff1f; Chromium 是一个开源浏览器项目&#xff0c;旨在为所有用户构建一种更安全、更快、更稳定的网络体验方式。 和老苏之前介绍的 Firefox 的作用是一样的 文章传送门&#xff1a;给群晖安装firefox浏览器 因为是基于 vnc 的应用&#xff0c;感觉资源…

管理交换机

文章目录 本地管理交换机物理交换机如何本地管理ensp上的虚拟交换机如何本地管理认证模式的三种方式 远程管理交换机配置通过Telnet登录设备配置通过STelnet登录设备 --推荐的方式检查配置结果使用Cloud管理多个交换机时 华为官网配置信息 本地管理交换机 当交换机首次使用时&…

强化学习工具箱(Matlab)

1、Get Started 1.1、MDP环境下训练强化学习智能体 MDP环境如下图 每个圆圈代表一个状态每个状态都有上或下的选择智能体从状态 1 开始智能体接收的奖励值为图中状态转移的值训练目标是最大化累计奖励 &#xff08;1&#xff09;创建 MDP 环境 创建一个具有 8 个状态和 2 …