ROS实操:通信机制的实现

           最近闲来无事,打算重温了一下ROS方面的相关知识。先前的学习都是一带而过,发现差不多都忘了,学习的不够深入。因此,在重温的同时,写下了这篇关于ROS通信实操的学习博客。

        上一篇博客的链接为:ROS架构的学习【Noetic】-CSDN博客

        主要简单介绍了一下ROS的基本架构,下面以实操的演示来进行后续的学习并记录。

        本篇博客主要是通过ROS内置的turtlesim案例,结合ROS命令获取节点、话题、话题消息、服务、服务消息与参数的信息,最终再以编码的方式实现乌龟运动的控制、乌龟位姿的订阅、乌龟生成与乌龟窗体背景颜色的修改。

0 测试 ROS

        在实操前,请先安装好ROS和相关配置。

        我使用的是虚拟机Ubuntu20.04和ROS1(noetic)版本

        ROS 内置了一些小程序,可以通过运行这些小程序以检测 ROS 环境是否可以正常运行:

  1. 首先启动三个命令行(ctrl + alt + T)

  2. 命令行1键入:roscore

  3. 命令行2键入:rosrun turtlesim turtlesim_node (此时会弹出图形化界面)

  4. 命令行3键入:rosrun turtlesim turtle_teleop_key (在3中可以通过上下左右控制2中乌龟的运动)

最终结果如下所示(注意:光标必须聚焦在键盘控制窗口,否则无法控制乌龟运动):

下面来试试控制乌龟做圆周运动(极简实现):
新开一个终端,输入指令:

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:

然后使用Tab进行补齐,出现如下图所示的终端:

然后再修改 linear: x为1.0 , angular: z为1.0,回车执行,发现乌龟转了起来:

1 实操: 话题发布

下面我们使用VScode编辑器IDE来进行实操环节的代码编写流程展示:

 首先在src下新建一个功能包:

后面出现如下界面,输入包名 plumbing_test 后回车:

 再输入依赖 roscpp rospy std_msgs geometry_msgs 后再次回车:

 发现功能包创建成功:

实现方案A: C++

下面继续在这个功能包(plumbing_test)的src目录中创建一个文件:test01_pub_twist.cpp

将如下C++代码复制到 test01_pub_twist.cpp 文件当中:

/*编写 ROS 节点,控制小乌龟画圆准备工作:1.获取topic(已知: /turtle1/cmd_vel)2.获取消息类型(已知: geometry_msgs/Twist)3.运行前,注意先启动 turtlesim_node 节点实现流程:1.包含头文件2.初始化 ROS 节点3.创建发布者对象4.循环发布运动控制消息
*/#include "ros/ros.h"
#include "geometry_msgs/Twist.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 2.初始化 ROS 节点ros::init(argc,argv,"control");ros::NodeHandle nh;// 3.创建发布者对象ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000);// 4.循环发布运动控制消息//4-1.组织消息geometry_msgs::Twist msg;msg.linear.x = 1.0;msg.linear.y = 0.0;msg.linear.z = 0.0;msg.angular.x = 0.0;msg.angular.y = 0.0;msg.angular.z = 2.0;//4-2.设置发送频率ros::Rate r(10);//4-3.循环发送while (ros::ok()){pub.publish(msg);ros::spinOnce();}return 0;
}

下面还需要对同级目录下的CMakeLists.txt文件进行配置:

配置完成后,进行编译catkin_make:

必须确保编译成功。发现编译无误之后,我们继续新开一个终端:

我这里进行了终端分屏,左边启动roscore,右边启动乌龟的GUI,在终端内输入并执行:

rosrun turtlesim turtlesim_node

发现GUI界面启动成功,再开启一个终端后进入我们的工作空间内:

source一下,继续输入并回车:

source ./devel/setup.bash

下面运行一下我们刚刚编写的节点,继续输入并回车:

rosrun plumbing_test test01_pub_twist

发现小乌龟开始转了起来:

实现方案B: Python

下面在plumbing_test的目录中新建一个scripts目录;

继续在这个scripts目录中创建一个文件:test01_pub_twist_p.py

将如下Python代码复制到 test01_pub_twist_p.py 文件当中:

#! /usr/bin/env python
"""编写 ROS 节点,控制小乌龟画圆准备工作:1.获取topic(已知: /turtle1/cmd_vel)2.获取消息类型(已知: geometry_msgs/Twist)3.运行前,注意先启动 turtlesim_node 节点实现流程:1.导包2.初始化 ROS 节点3.创建发布者对象4.循环发布运动控制消息"""import rospy
from geometry_msgs.msg import Twistif __name__ == "__main__":# 2.初始化 ROS 节点rospy.init_node("control_circle_p")# 3.创建发布者对象pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=1000)# 4.循环发布运动控制消息rate = rospy.Rate(10)msg = Twist()msg.linear.x = 1.0msg.linear.y = 0.0msg.linear.z = 0.0msg.angular.x = 0.0msg.angular.y = 0.0msg.angular.z = 0.5while not rospy.is_shutdown():pub.publish(msg)rate.sleep()

Python文件保存后,需要对其添加可执行权限,在scripts目录下开启一个终端后输入:

chmod +x *.py

查看文件权限已经给到:

下面还需要对同级目录下的CMakeLists.txt文件进行配置:

配置完成后,进行编译catkin_make:

必须确保编译成功。发现编译无误之后,我们继续新开一个终端:

我这里进行了终端分屏,左边启动roscore,右边启动乌龟的GUI,在终端内输入并执行:

rosrun turtlesim turtlesim_node

发现GUI界面启动成功后,再开启一个终端进入我们的工作空间内,source一下,继续输入并回车:

source ./devel/setup.bash

下面运行一下我们刚刚编写的节点,继续输入并回车:

rosrun plumbing_test test01_pub_twist_p.py

发现小乌龟开始转了起来:

2 实操: 话题订阅

为了方便起见,下面我们都使用python代码进行演示:

案例:已知turtlesim中的乌龟显示节点,会发布当前乌龟的位姿(窗体中乌龟的坐标以及朝向),要求控制乌龟运动,并时时打印当前乌龟的位姿。

首先在plunbing_test目录下编写一个launch文件夹,存放launch文件:

launch文件的代码如下:

<!-- 启动乌龟GUI与键盘控制节点 -->
<launch><!-- 乌龟GUI --><node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen" /><!-- 键盘控制 --><node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen" /></launch>

接下来我们启动这个launch文件,在工作空间目录中source一下,继续输入并回车:

source ./devel/setup.bash

接下来执行launch文件:

roslaunch plumbing_test start_turtle.launch 

可以发现,启动正常:

 下面通过键盘控制运动,运行正常:

准备工作完毕后,我们开始和获取话题与其相关的格式

1.话题与消息获取

下面新开一个终端:

rostopic list

可以查看到话题信息:

如果想要查看话题的消息,输入:

rostopic info /turtle1/pose

可以看到相关信息:

下面再看一下消息类型,输入:

rosmsg info turtlesim/Pose

 我们会发现,消息类型的格式就是下面的这5个字段

分别为:x,y的坐标;theta朝向;线速度;角速度

那么,上述的话题、消息、消息格式,我们就都获取到了

下面我们继续以命令的方式来获取乌龟的位姿:

rostopic echo /turtle1/pose

 打印出的消息如下,由于乌龟没有运动,所以数据一直是固定不变的:

下面用键盘控制乌龟运动,可以发现数据发生了变化:

2.实现订阅节点

创建功能包需要依赖的功能包: roscpp rospy std_msgs turtlesim

下面需要追加turtlesim这个包,需要修改package.xml配置文件:

添加完上面的2行代码后,再进入CMakeLists.txt文件进行配置,添加turtlesim:

完成后相关的配置后,保存并编译:

发现编译无误后,下面可以开始编写代码了。

以python的方式来实现乌龟位姿的订阅:

在plumbing_test的目录中的scripts目录中创建一个文件:test02_sub_pose_p.py

将如下Python代码复制到 test02_sub_pose_p.py 文件当中,并添加可执行权限:

下面还需要对同级目录下的CMakeLists.txt文件进行配置,在此处添加下面这行代码:

保存后并进行编译。编译无误后,下面便可以开始执行代码了,开启乌龟的相关节点,执行下面的launch指令即可:

roslaunch plumbing_test start_turtle.launch

等待乌龟的GUI界面出现后,新开一个终端并cd到我们的工作空间,进行一下source后执行我们的python文件:

rosrun plumbing_test test02_sub_pose_p.py

由于乌龟目前处于静止状态,所以终端中的打印的数据是不变的

下面我们通过键盘控制乌龟的运动,发现终端的数据发生了改变:

3 实操: 服务调用

        编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。

  1. 首先,需要启动乌龟显示节点。
  2. 要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
  3. 编写服务请求节点,生成新的乌龟。
1.服务名称与服务消息获取

下面我们新开一个终端,先调用之前写好的launch文件:

roslaunch plumbing_test start_turtle.launch

再新开一个终端,获取服务话题以及消息类型:

rosservice list

 可以查看到ROS系统当中所有存在的服务:

我们需要生成新的小乌龟,需要用到 /spawn,可以查看一下相关信息:

rosservice info /spawn

可以进一步再了解Type的具体数据格式,输入:

rossrv info turtlesim/Spawn

那么,上述的服务话题、消息类型、消息格式,我们就都获取到了

下面我们用终端来进行一下简易的演示,新开一个终端输入:

rosservice call /spawn 

再使用Tab进行补齐,得到:

 对补齐后的数据进行赋值修改,如下图所示:

确认无误后回车,发现GUI界面中出现了一只新的小乌龟:

2.服务客户端实现

创建功能包需要依赖的功能包: roscpp rospy std_msgs turtlesim

下面需要追加turtlesim这个包,需要修改package.xml配置文件:

参考资料:

2.5 通信机制实操 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

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

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

相关文章

Android 开发部分基础工具使用

c调试 在NDK调试的时候&#xff0c;如果找不到 符号的话&#xff0c;我们可以在调试配置中添加符号地址的全路径一直到根目录&#xff1a;&#xff0c;xxx/armeabi-v7a&#xff1a; You must point the symbol search paths at the obj/local/ directory. This is also not a …

设计模式: 责任链模式

目录 一&#xff0c;责任链模式 二&#xff0c;特点 四&#xff0c;实现步骤 五&#xff0c;代码 一&#xff0c;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种软件设计模式&#xff0c;它属于行为型模式。在这种模式中&#xff0c…

华为云耀云服务器开放端口

博客主页&#xff1a;花果山~程序猿-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一.华为云控制台开放端口 寻找到安全组信息 2. 添加开放的端口信息 3. 检查是否成…

Python量化炒股的财务因子选股

Python量化炒股的财务因子选股-财务因子选股 选股是股市投资的第一步&#xff0c;是最基础的一步&#xff0c;也是最重要的一步。 初识财务因子选股 量化选股是利用数量化的方法选择股票组合&#xff0c;期望该股票组合能够获得超越基准收益率的投资行为。总的来说&#xff…

VBA技术资料MF147:从Excel运行PowerPoint演示文稿

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

数组的扩容与缩容

数组的扩容与缩容 文章目录 数组的扩容与缩容数组的扩容内存分析 数组的缩容内存分析内存分析 数组的扩容 数组扩容是指当原有数组的空间不足以容纳更多的元素时&#xff0c;创建一个新的、长度更大的数组&#xff0c;并将原数组中的元素复制到新数组中&#xff0c;然后更新原…

《半小时漫画论语》读书笔记

站在几年前看现在的我&#xff0c;感觉多了几分犹豫、内耗&#xff0c;少了几分勇敢。 今天重新读下论语&#xff0c;矫正一下人生态度。 一、论语是什么 论语&#xff0c;主要记载了孔子和他弟子们日常说的话、做的事。 孔子&#xff0c;读书人心中的圣人&#xff0c;中国历…

数据通信-A

数据通信 一、数据通信网络基础二、VRP系统三、eNSP配置命令 不是从零开始&#xff0c;有一些基础&#xff0c;主要记录配置命令。一、数据通信网络基础 图标&#xff1a;主要是认识第一行。 常见术语&#xff1a;数据通信网络最基本的功能是实现数据互通。 数据载荷&#…

【C++】滑动窗口:长度最小的子数组

1.题目 2.算法分析 这种题目&#xff0c;首先想到的是暴力穷举法&#xff1a; 用两层循环取遍该数组的所有子数组&#xff0c;然后找到那个最短的就可以了。 我们的滑动窗口就是对这种暴力穷举法进行优化&#xff1a; 主要是舍弃的思想&#xff0c;舍弃那些一定不可能是最终…

jupyter notebook切换conda虚拟环境

首先&#xff0c;切换到某个虚拟环境&#xff0c;本人切换到了d2l环境&#xff1a; (d2l) C:\Users\10129>pip install ipykernel然后&#xff0c;如代码所示安装ipykernel包 最后&#xff0c;按下述代码执行&#xff1a; (d2l) C:\Users\10129>python -m ipykernel i…

857.雇佣K名工人的最低成本

题目说的其实是有点乱的,所以我们可能抓不住重点,甚至都不太清楚规则,比如 eg. quality[3,1,10,10,1] wage[4,8,200,200,7] 这里是选下标0,1,4 ->单价为8 但是想清楚其实就很easy. 就是 贪心(sort) 优先队列 梳理下我们发现其实要让每个人得到最低期望,就要按照当前最贵…

vue中配置 测试、准生产、生产环境

在package.json,scripts中配置 "dev": "vue-cli-service serve --open --mode dev",在项目根目录下配置 新建 .env.dev 和.env.development文件 //类似于title NODE_ENV "serve" //各环境API数据接口请求地址 VUE_APP_BASE_API "http:…

Python绘制的好看统计图

代码 sx [Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, P…

DataTrove:一款针对大规模文本数据的处理、过滤和消除重复数据工具

关于DataTrove DataTrove是一款针对大规模文本数据的处理、过滤和消除重复数据工具&#xff0c;该工具可以通过提供一组平台无关的可定制管道处理块&#xff0c;帮助广大研究人员从各种复杂脚本中解放出来&#xff0c;同时还允许我们轻松添加自定义功能。 DataTrove所实现的数…

Linux内核之原子操作:atomic_long_inc用法实例(六十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【C语言】atoi和atof函数的使用

人生应该树立目标&#xff0c;否则你的精力会白白浪费。&#x1f493;&#x1f493;&#x1f493; 目录 •&#x1f319;知识回顾 &#x1f34b;知识点一&#xff1a;atoi函数的使用和实现 • &#x1f330;1.函数介绍 • &#x1f330;2.代码演示 • &#x1f330;3.atoi函数的…

springboot + slf4j + log4j2

<!--Web依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifact…

Oracle 执行计划

1.执行计划 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。 执行计划描述了SQL引擎为执行SQL语句进行的操作&#xff1b;分析SQL语句相关的性能问题或仅仅质疑查询优化器的决定时&#xff0c;必须知道执行计划&#xff1b;所以执行计划常用于sql调优。 2.查…

python学习笔记----异常、模块与包(九)

一、异常 1.1 什么是异常 在Python中&#xff0c;异常是程序执行时发生的错误。当Python检测到一个错误时&#xff0c;它会引发一个异常&#xff0c;这可能是由于多种原因&#xff0c;如尝试除以零、访问不存在的文件&#xff0c;或者尝试从列表中获取不存在的索引等。异常处…

在Centos7上部署LDAP服务

安装ldap和设置自起 - 安装ldap yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openldap openldap-servers-sql- 启动和开机自起 systemctl start slapd systemctl enable slapd- 查看服务是否安装成功 配置ldap - 创建第一个管理账号…