草庐IT

ROS学习记录(二)玩转海龟——海龟保姆级教程

真滴吃不胖 2023-09-27 原文

前言——环境变量那些事儿

编译工作空间后,一定要先设置环境变量,此工作空间下的代码才能有效运行

在工作空间目录下打开终端,输入

source devel/setup.bash

此次source仅对当前terminal有效,若新建的终端都有效,需要sudo gedit ~/.bashrc,在文件最后一行添加source ~/(工作空间目录名)/devel/setup.bash,保存退出

经过本人实验,此方法每次仅能针对一个工作空间有效,当更换工作空间运行代码时,需要打开~/.bashrc重新设置

通过一下命令检查环境变量的设置路径

echo $ROS_PACKAGE_PATH

后续运行代码过程中绝大部分遇到的问题都是因为环境变量设置不正确,血泪教训!!!

一、启动海龟并用键盘控制

打开终端,启动ROS Master

roscore

打开新终端,启动小海龟仿真器

rosrun turtlesim turtlesim_node

打开新终端,启动海龟控制节点

rosrun turtlesim turtle_teleop_key

这样,就可以通过键盘的上下左右控制海龟移动

结果如下

这时,我们可以打开新的终端,查看节点与话题信息

rosnode list

/rosout

/teleop_turtle

/turtlesim

表明此时有三个节点在运行

通过以下命令可以查看节点关系图

rosrun rqt_graph rqt_graph

使用 rostopic echo 命令可以查看在一个话题上发布的数据。它的使用方法如下:

rostopic echo [topic]

例如,我们可以输入:

 rostopic echo /turtle1/cmd_vel

结果如下

现在我们重新查看节点图,发现多了一个订阅者

使用 rostopic list 可以列举出当前系统中的话题:

rostopic list

使用rostopic list -v 可以查看每一个话题的发布者和订阅者的个数。

rostopic list -v

话题上的通信通过节点之间发送消息来完成。对于发布者(turtle_teleop_key)和接收 者(turtlesim_node)的通信,发布者和接收者必须使用类型相同的消息。也就是说,一个 话题的类型是通过在它上面发布的消息的类型来定义的。可以通过:

rostopic type /turtle1/cmd_vel

来查看/turtle1/cmd_vel 的消息类型。你得到的返回类型如下:

geometry_msgs/Twist

我们可以使用 rosmsg 来查看一个消息类型的详细信息:

rosmsg show geometry_msgs/Twist

得到的结果如下

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

我们可以基于此发布信息,用具体的数值控制小海龟移动。

下面来尝试按照记忆路线控制小海龟移动

rosbag record -a -O cmd_record

保留之前的终端窗口,再创建一个新窗口,输入:~$ rosbag record -a -O cmd_record 开始记录小海龟路径,出现:

将光标放在启动键盘控制的终端,控制小海龟移动,此时已经开始记录小海龟的路径信息,记录完成后将光标放在开启记录路径的终端 按下< ctrl > + < C > 停止记录,主文件夹会生成一个.bag文件就是我们的记录文件:

将之前的终端全部关掉,重新按照步骤打开小海龟控制窗口后,打开一个新的终端输入:

~$ rosbag play cmd_record.bag

小海龟就开始按照之前记录的路径开始移动了~~~

二、控制海龟画圆

1.用命令行

打开终端,启动ROS Master

roscore

打开新终端,启动小海龟仿真器

rosrun turtlesim turtlesim_node

打开新终端,创建发布者

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist -- '[1.8, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0"

其中linear是线速度,angular是角速度

结果如下:

创建第二只海龟需要使用/spawn服务

我们先来查看/spawn的信息

 rosservice info /spawn

Node: /turtlesim

指这个服务属于哪个节点的

URI: rosrpc://localhost:47839

统一资源标识符

Type: turtlesim/Spawn

服务类型

Args: x y theta name

服务参数

输入以下命令

rosservice call /spawn "x: 2.0
y: 2.0
theta: 0.0
name: 'turtle2'" 

这就在 x=2, y=2, 角度=0 的地方,创建了一个名字是 turtle2 的小海龟如下图:

2.通过ROS的话题通信机制

(1)控制海龟画圈

本人功能包结构如下:

test_pkg

->include

->launch

-->start_talker.launch

->src

-->talker.cpp

-->listener.cpp

->CmakeLists.txt

->package.xml

在创建功能包时,已经安装了所需要的依赖,如果后续发现仍需要安装新的依赖,可以在功能包路径下用命令行安装,并自行修改CmakeLists.txt与package.xml

sudo apt-get install [软件包名]

例如:

sudo apt-get install ros-kinetic-PACKAGE

回到正题,我们需要为海龟画圈创建发布者、订阅者,为了方便启动,最好再写一个launch文件

在发布者中,我们需要在提供模板(详见古月居相关课程)的基础上,添加消息类型对应的头文件依赖(include……)、创建一个自己的发布者、并初始化对应的消息类型数据

创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist

ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

然后设置linear.x为1,angular.z为0.5

在订阅者中,我们需要在模板的基础上,创建一个自己的订阅者,并修改打印信息参数

创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数chatterCallback

ros::Subscriber sub = n.subscribe("/turtle1/pose", 100, chatterCallback);

在launch文件中,我们需要启动海龟仿真器、自己的发布者与订阅者

效果如下图示所示

(2)同时控制两只海龟

让第一只海龟画圈,第二只海龟以圆弧轨迹从(5,5)运动到(10,10)

本人功能包结构如下:

test_pkg

->include

->launch

-->start.launch

->src

-->talker.cpp

-->talker1.cpp

-->listener.cpp

-->add_turtle1.cpp

->CmakeLists.txt

->package.xml

首先,我们需要在代码中添加第二只海龟,这通过调用/spawn服务来实现,具体参照古月居服务端的编程实现。我们需要设置生成海龟的初始位置、运动速度和它的名字“turtle2”

在发布者中,我们需要在提供模板的基础上,添加消息类型对应的头文件依赖(include……)、创建一个自己的发布者、并初始化对应的消息类型数据

在订阅者中,我们需要在模板的基础上,创建一个自己的订阅者,并修改打印信息参数

创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数chatterCallback

在launch文件中,我们需要启动海龟仿真器、add_turtle节点、自己的发布者与订阅者

效果如下图示所示

(3)使用tf变换进行海龟跟随试验

我们的目的是,召唤出两只海龟,用键盘控制第一只海龟的移动,另一只海龟自动跟随。当然,你也可以结合上文控制海龟画圆的内容自行设计轨迹。

想要实现目标,首先在launch文件中设置turtlesim_node、turtle_teleop_key两个节点的启动,这里不做过多赘述。

然后,我们就可以关注两只海龟的控制了。

在发布者中,我们需要接收两只海龟的位姿信息,包括坐标、角度、线速度、角速度。

其次,需要定义tf广播器,并设置当前小乌龟相对于世界坐标系的坐标变换,设置子坐标系在父坐标系下的位置信息,并发布坐标变换。

// 根据乌龟当前的位姿 设置当前小乌龟相对于世界坐标系的坐标变换
    tf::Transform transform;
    transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
    // 设置子坐标系在父坐标系下的位置信息 建立子坐标系的原点和父坐标系的对应关系
    tf::Quaternion q;
    q.setRPY(0, 0, msg->theta);
    transform.setRotation(q);
 
    // 发布坐标变换 四个参数分别为 tf转换 时间戳 目标坐标系 待转换坐标系
    br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);

在订阅者中调用/spawn服务,在(5,5)生成第二只海龟;定义tf监听器,发布第二只海龟的速度;查找turtle2与turtle1的坐标变换;根据turtle1和turtle2之间的坐标变换计算turtle2需要运动的线速度和角速度,并发布速度控制指令使turtle2向turtle1移动

// transform代表两个坐标系之间的转换关系
        geometry_msgs::Twist vel_msg;

        vel_msg.angular.z = 9.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());
        // 计算角速度 使用getOrigin获得的是跟随乌龟在主控乌龟坐标系下的位置信息
        // atan2函数返回以弧度表示的y/x的反正切
        vel_msg.linear.x = 1.5 * sqrt(pow(transform.getOrigin().x(), 2) + pow(transform.getOrigin().y(), 2));
        // 计算线速度
        turtle_vel.publish(vel_msg);

然后,在launch文件中添加监听器与两只海龟的广播器。

本人功能包结构如下

test_follow

->include

->launch

-->start.launch

->src

-->my_tf_listener.cpp

-->my_tf_broadcaster.cpp

->CmakeLists.txt

->package.xml

运行效果如下:

可以看出,跟踪效果非常好(不要贴贴😜)

用rosnode list命令查看运行的节点

用rostopic list命令查看存在的话题

画出节点树

rosrun rqt_graph rqt_graph

通过 一下命令录制数据,再现记忆路线,来看看跟踪效果

rosbag record -a -O cmd_record
~$ rosbag play cmd_record.bag

有关ROS学习记录(二)玩转海龟——海龟保姆级教程的更多相关文章

  1. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  2. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  5. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  8. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  9. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  10. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

随机推荐