ROS:古月居第一次作业(话题与服务编程、动作编程、TF编程)

一.话题与服务编程

话题与服务编程:通过代码新生一只海龟,放置在(5,5)点,命名为“turtle2”;通过代码订阅turtle2的实时位置并打印在终端;控制turtle2实现旋转运动;

demo_turtle.launch

<launch>
<!--海龟仿真器--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><!--键盘控制--><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
</launch>

demo_turtle.cpp

#include <ros/ros.h>
#include <turtlesim/Spawn.h>//创建turtle2
#include <turtlesim/Pose.h>//订阅turtle的位姿信息
#include <geometry_msgs/Twist.h>//发布速度信息ros::Publisher pub;//回调函数打印turtle2的position
void poseCallback(const turtlesim::PoseConstPtr &msg){ROS_INFO("turtle2: X=[%.2f], Y=[%.5f]",msg->x,msg->y);
}int main(int argc,char** argv){ros::init(argc,argv,"create_turtle2");ros::NodeHandle node;//通过服务调用,产生第二只乌龟turtle2ros::service::waitForService("spawn");ros::ServiceClient add_turtle=node.serviceClient<turtlesim::Spawn>("spawn");turtlesim::Spawn srv;srv.request.x=5;//初始化机器人位置srv.request.y=5;srv.request.name="turtle2";add_turtle.call(srv);ROS_INFO("turtle2 already!");//订阅乌龟位姿信息ros::Subscriber sub=node.subscribe("/turtle2/pose",10,&poseCallback);ROS_INFO("publish vel_cmd!");//发布速度信息pub=node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel",10);ros::Rate r(10.0);while(ros::ok()){//发布速度信息geometry_msgs::Twist twist;twist.angular.z=0.5;twist.linear.x=0.5;pub.publish(twist);ros::spinOnce();r.sleep();}return 0;
}

CMakeList.txt

add_executable(demo_turtle src/demo_turtle.cpp)
target_link_libraries(demo_turtle ${catkin_LIBRARIES})

运行:

roslaunch demo_tf demo_turtle.launch
rosrun demo_tf demo_turtle

结果:

二.动作编程

动作编程:客户端发送一个运动目标,模拟机器人运动到目标位置的过程,包含服务端和客户端的代码实现,要求带有实时位置反馈。

demo_Client_move.cpp

#include <ros/ros.h>
#include <actionlib/client/simple_action_client.h>
#include "demo_tf/moveAction.h"typedef actionlib::SimpleActionClient<demo_tf::moveAction> Client;//当action完成后会调用该回调函数一次
void doneCb(const actionlib::SimpleClientGoalState& state,const demo_tf::moveResultConstPtr& result){ROS_INFO("Yay! start moving!");ros::shutdown();
}
//当action激活后会调用该回调函数一次
void activeCb(){ROS_INFO("Goal just went active");
}
//收到feedback后调用该回调函数
void feedbackCb(const demo_tf::moveFeedbackConstPtr& feedback){ROS_INFO("percent_complete: X=[%f], Y=[%f], theta=[%f]",feedback->present_turtle_x,feedback->present_turtle_y,feedback->present_turtle_theta);
}
int main(int argc,char** argv){ros::init(argc, argv, "Client");//定义一个客户端Client client("move_client",true);//等待服务器端ROS_INFO("waitint for action server to start.");client.waitForServer();ROS_INFO("action server started, sending goal");//创建一个action的goaldemo_tf::moveGoal goal;goal.turtle_target_x=6.5;goal.turtle_target_y=0;goal.turtle_target_theta=0;//发送action的goal给服务器,并且设置回调函数client.sendGoal(goal,&doneCb,&activeCb,&feedbackCb);ros::spin();return 0;
}

demo_Service_move.cpp

#include <ros/ros.h>
#include <actionlib/server/simple_action_server.h>
#include "demo_tf/moveAction.h"
#include <turtlesim/Pose.h>
#include <geometry_msgs/Twist.h>typedef actionlib::SimpleActionServer<demo_tf::moveAction> Server;
//创建发布者
ros::Publisher pub;
//记录机器人位置
struct pos{float x;float y;float theta;
}origin_pos,target_pos;
//订阅小乌龟pose
void poseCallBack(const turtlesim::PoseConstPtr& msg){//打印每一次turtle的位姿ROS_INFO("Turtle origin position: [%f], [%f], [%f]",msg->x,msg->y,msg->theta);origin_pos.x=msg->x;origin_pos.y=msg->y;origin_pos.theta=msg->theta;
}
//收到action的goal后调用该回调函数
void execute(const demo_tf::moveGoalConstPtr& goal,Server* as){ros::Rate r(10);demo_tf::moveFeedback feedback;ROS_INFO("Turtle goal position: X=[%f], Y=[%f], theta=[%f]",goal->turtle_target_x,goal->turtle_target_y,goal->turtle_target_theta);target_pos.x=goal->turtle_target_x;target_pos.y=goal->turtle_target_y;target_pos.theta=goal->turtle_target_theta;geometry_msgs::Twist vel_msgs;while(ros::ok()){//发布速度指令vel_msgs.linear.x = 0.1; vel_msgs.angular.z = 0.; pub.publish(vel_msgs);//发布反馈信息(当前机器人位置)feedback.present_turtle_x=origin_pos.x;feedback.present_turtle_y=origin_pos.y;feedback.present_turtle_theta=origin_pos.theta;as->publishFeedback(feedback);//判断是否到达目标点if(target_pos.x<=origin_pos.x&&target_pos.y<=origin_pos.y&&target_pos.theta<=origin_pos.theta){//发布速度指令vel_msgs.linear.x = 0.; vel_msgs.angular.z = 0.; pub.publish(vel_msgs);break;} elser.sleep();}as->setSucceeded();
}
int main(int argc,char** argv){ros::init(argc,argv,"Server");ros::NodeHandle n,node_server;//订阅小乌龟的位置信息ros::Subscriber sub=node_server.subscribe("turtle1/pose",10,&poseCallBack);//申请发布速度pub=node_server.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",10);//定义一个服务器 "move_client"为客户端名称(要注意对应)Server server(n,"move_client",boost::bind(&execute,_1,&server),false);ROS_INFO("waiting_Server");//服务器开始运行server.start();ROS_INFO("start_Server");ros::spin();return 0;
}

debug.launch 

<launch><!--海龟仿真器--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><!--Server--><node pkg="demo_tf" type="demo_Service_move" name="Server" output="screen"/>
</launch>

CMakeList.txt

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

运行:

roslaunch demo_tf demo_turtle.launch
rosrun demo_tf demo_Client_move

三.TF编程

广播并监听机器人你的坐标变换,已知激光雷达和机器人底盘的坐标关系,求解激光雷达数据在底盘坐标系下的坐标值。

tf_broadcaster.cpp

/*发布tf变换
*/
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>int main(int argc,char** argv){ros::init(argc,argv,"tf_nroadcaster");ros::NodeHandle node;static tf::TransformBroadcaster br;while(ros::ok()){//初始化tf数据,设定变换矩阵,也就是激光雷达在底盘坐标系下转换//laser_word*word_base=laser_base=transformtf::Transform transform;transform.setOrigin(tf::Vector3(0.1,0.1,0.2));transform.setRotation(tf::Quaternion(0,0,0,2));//广播base_link和base_laser坐标系之间的tf数据br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"base_link","base_laser"));}return 0;
}

tf_listener.cpp

/*
*/
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/PointStamped.h>int main(int argc, char *argv[])
{ros::init(argc, argv, "tf_listener");ros::NodeHandle n;//创建监听者tf::TransformListener listener;ros::Rate rate(10.0);while (ros::ok()){geometry_msgs::PointStamped laser_point;laser_point.header.frame_id="base_laser";laser_point.header.stamp=ros::Time();laser_point.point.x=0.3;laser_point.point.y=0.0;laser_point.point.z=0.0;try{listener.waitForTransform("base_link","base_laser",ros::Time(0),ros::Duration(3.0));geometry_msgs::PointStamped base_point;listener.transformPoint("base_link",laser_point,base_point);ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.2f, %.2f, %.2f) at time %.2f",laser_point.point.x, laser_point.point.y, laser_point.point.z,base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());}catch(tf::TransformException& ex){ROS_ERROR("Received an exception trying to transform a point from \"base_laser\" to \"base_link\": %s", ex.what());}rate.sleep();}return 0;
}

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgstf
)add_executable(tf_broadcaster src/tf_broadcaster.cpp)
target_link_libraries(tf_broadcaster ${catkin_LIBRARIES})add_executable(tf_listener src/tf_listener.cpp)
target_link_libraries(tf_listener ${catkin_LIBRARIES})

运行:

roscorerosrun demo_tf tf_listenerrosrun demo_tf tf_broadcaster

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

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

相关文章

RobotFramework+Eclispe环境安装篇

环境安装是学习任何一个新东西的第一步&#xff0c;这一步没走舒坦&#xff0c;那后面就没有心情走下去了。 引用名句&#xff1a;工欲善其事必先利其器&#xff01;&#xff01; Robotframework&#xff1a;一款 自动化测试框架。 Eclipse&#xff1a;一款编辑工具。可以编…

控制算法工程师的主要职责描述(合集)

控制算法工程师的主要职责描述1 职责 1、负责公司MW级机组的控制策略参数整定&#xff0c;编写外部控制器 2、通过控制算法的优化实现风电机组轻量化设计 3、负责公司先进的风电机组智能控制算法的控制&#xff0c;风电机组的前馈控制&#xff0c;风电机组载荷在线预估&#xf…

消息中间件之ActiveMq安装

文章目录 前言安装下载地址安装 使用控制台调整配置文件 前言 2023年年中了&#xff0c;又遇到了老朋友activeMq&#xff0c;上次接触activeMq还是在15年的时候&#xff0c;系统中用到了这个消息中间件。 阔别8年之久&#xff0c;竟然又用到了这个老家伙&#xff01; 安装 要…

Python数据攻略-DataFrame的数据操作

大家好&#xff0c;我是Mr数据杨&#xff0c;今天我们就来谈谈Python中的数据访问和修改。 首先&#xff0c;你们一定都听过《三国演义》吧&#xff0c;里面的人物和事情其实就像我们Python中的数据。比如曹操就像我们的数据元素&#xff0c;他的性格特点、军事才能等就像我们…

第16章:InnoDB数据存储结构

一、数据库的存储结构&#xff1a;页 1.磁盘与内存的交互基本单位:页 InnoDB将表中数据划分多个页来存储&#xff0c;InnoDB中页的大小默认是16KB 在数据库中&#xff0c;不论读一行&#xff0c;还是读多行&#xff0c;都是将这些行所在的页从磁盘加载到内存。数据库管理存储…

3dmax入门 | 学3d建模必备软件技能基础教学

3dmax入门❗️学3d建模必备软件技能基础认知|||学3d建模基本都是从3dmax入手开始学习的 这篇笔记就来教零基础小白小伙伴们来认识3dmax 3ds max界面组成有以下几部分: 1、标题栏&#xff1a;主要记录版本信息 2、菜单栏&#xff1a;涵盖了几乎软件所有命令 3、工具栏&#xff…

报表生成器FastReport .Net教程:“Text“对象、文本编辑

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。 FastReport.NET官方版…

【Web服务应用】Tomcat部署

Tomcat部署 一、Tomcat简介二、tomcat组件2.1核心组件2.2Tomcat功能组件2.3Tomcat 请求过程 三、部署Tomcat服务3.1Tomcat虚拟主机配置 四、Tomcat多实例部署 一、Tomcat简介 一款 java 开发的开源的 Web 应用服务程序。 可以作为Web应用服务器&#xff0c;处理静态的Web页面&…

【计算机组成】Cache与CPU的直接映射、全相联映射与组相联映射

一.Cache与CPU需要映射的原因 CPU准备访问内存时&#xff0c;会先问问cache存储器有没有已经提前准备好了数据&#xff0c;如果没有则再找内存要&#xff1a; 如果Cache刚好命中&#xff0c;则直接从Cache中读取数据&#xff1a; 如果Cache没有命中&#xff08;Cache失效&#…

计算机中丢失VCRUNTIME140_1怎么办,vcruntime140_1.dll的三个修复方法

vcruntime140_1.dll是一个Windows系统文件&#xff0c;它是Microsoft Visual C Redistributable for Visual Studio 2019软件包的一部分&#xff0c;用于运行使用Visual C开发的应用程序。在我们打开软件或者游戏的时候&#xff0c;提示计算机中丢失VCRUNTIME140_1怎么办&#…

w ndows10玩游戏蓝屏,Windows 10 电脑玩穿越火线蓝屏原因及解决方法

Windows 10 蓝屏是非常常见的&#xff0c;可是面对不同原因出现的蓝屏您又知道如何去处理吗&#xff1f;今天我们就来通过解决穿越火线蓝屏顺便一起看看都是因为什么原因导致的 Windows 10 系统蓝屏吧。 1、显卡驱动导致的蓝屏&#xff0c;由于在 Windows 10 系统中有很多不稳定…

如何下载安装穿越派V3.14版本?

1、启动服务 1.1 在首页或huluer.com任何页面,点击 (数据方舟)。 1.2 点击 启动服务 按钮。 2、安装部署云化环境 (注:一定要到需要部署的个人电脑或服务器上下载并安装。) 2.1 点击确定,下载iChainPi.exe安装程序。(下载及解答 下方点击软件下载也是一样的。)

cf四大服务器位置,CF:从最初的42个服务器到现在的四大战区,穿越火线还能火多久?...

原标题&#xff1a;CF&#xff1a;从最初的42个服务器到现在的四大战区&#xff0c;穿越火线还能火多久&#xff1f; 穿越火线于近日进行了一波重大的更新&#xff0c;最引人注目的就是“跨区作战”了&#xff0c;也就是我们所说的合区&#xff0c;从2017年开始&#xff0c;穿越…

cf游戏进不去计算机,cf更新之后进不去 穿越火线进不去解决方法

很多穿越玩家在游戏更新后会发现游戏在安全检查过后就没了动静&#xff0c;原本应该出现的游戏界面也是迟迟不出现&#xff0c;万般无奈之下选择重启客户端&#xff0c;然而情况依旧如此。下边小编带您一起来看看为什么cf更新之后进不去&#xff0c;穿越火线进不去解决方法。 1…

echarts折线图使用记录

1项目中引入echarts文档api介绍&#xff0c;链接地址如下 https://echarts.apache.org/handbook/zh/basics/import 2 官网基础样例介绍,链接地址如下 https://echarts.apache.org/handbook/zh/get-started/ 3 基本折线图介绍内容及链接 3.1 最简单的折线图 3.2 笛卡尔坐标系中…

【unity小技巧】常用的方法属性和技巧汇总

学习目标&#xff1a; 最近学习过程经常遇到一些好的方法属性和技巧&#xff0c;但是很容易忘记&#xff0c;单内容都比较少&#xff0c;又不至于开一篇文章单独讲解各个用法&#xff0c;特此单独写一篇做汇总&#xff0c;好记性不如烂笔头&#xff0c;后面收获一些新的知识我还…

NineData,稳定、高效的Redis数据同步解决方案

在 DB-Engines 网站的排名中&#xff0c;Redis 在 Key-value 存储的NoSQL领域连续霸榜多年&#xff0c;是目前最流行的键值对存储数据库&#xff0c;被广泛用于缓存、队列、实时分析等多种高并发的场景中。在生产环境中&#xff0c;我们会遇到对Redis进行版本升级和架构的扩缩容…

保护您的邮件安全:Exchange Reporter Plus 助您全面监控与审计

引言&#xff1a; 在当今数字化时代&#xff0c;电子邮件已成为我们日常生活和工作中不可或缺的沟通工具。然而&#xff0c;随着电子邮件的广泛使用&#xff0c;邮件安全也成为一个备受关注的议题。为了保护组织的敏感信息和防止数据泄露&#xff0c;我们需要一种强大的解决方…

微信如何批量添加好友?

现在营销中&#xff0c;微信已成为一种重要的沟通方式。微信目前是没有自动批量添加好友的功能&#xff0c;需要运营者一个一个手动去添加&#xff0c;这样太过于浪费时间&#xff0c;并且加频繁了还容易被封号&#xff0c;今天给大家介绍几种手动批量加好友的方式以及怎么借助…

怎么把投票链接生成二维码投票链接怎么生成二维码

用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。 而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务&#xff0c;很多用户都很喜欢“活动星投票”这款软件。 “活动星投票”小程序在…