【ROS机器人系统】实验1 熟悉ROS操作系统、熟悉ROS通信架构

文章目录

  • 实验1 熟悉ROS操作系统、熟悉ROS通信架构
  • 1、实验目的
  • 2、实验设备
  • 3、实验内容
    • 3.1 安装ROS
    • 3.2 ROS常用指令以及小海龟示例
      • ·roscore命令
      • ·rosrun命令
      • ·rosnode 命令
      • ·roscd 命令
      • ·rostopic 命令
    • 动手实现1:
      • ·rosservice 命令
      • ·roslaunch 命令
    • 动手实现2:
    • 动手实现3:
    • 3.3 了解ROS节点间的通信过程:
      • ·使用rqt_graph查看ROS节点关系
      • ·使用rostopic查看话题信息
    • 动手实现4:
    • 3.4编写节点实现话题通信
      • ·创建功能包
      • ·编写发布者节点(c++版本)
      • ·编写接收者节点(c++版本)
      • ·构建节点
    • 动手实现5:
    • 动手实现6:
    • 动手实现7:
      • (1)创建beginner_tutorials包:
      • (2)创建srv
      • (3)使用rossrv
      • (4)msg和srv的一般步骤
      • (5)编写服务节点
      • (6)编写客户端节点
      • (7)构建节点
      • (8)检验简单的服务和客户端

实验1 熟悉ROS操作系统、熟悉ROS通信架构

1、实验目的

掌握ROS的安装以及常用命令,具体内容如下:

  1. 学会在ubuntu18.04系统下安装ROS。
    1. 了解ROS基础命令。
    2. 运行海龟示例。
    3. 了解ROS节点间的话题通信过程,编写节点实现话题通信。
    4. 了解ROS节点间的服务通信过程,编写节点实现服务通信。

2、实验设备

硬件环境:windows 10

系统环境:Ubuntu20.04、ROS noetic

3、实验内容

3.1 安装ROS

1、添加ROS软件源

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ \$DISTRIB_CODENAME main" \> /etc/apt/sources.list.d/ros-latest.list'

2、添加密钥

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

3、更新软件源

sudo apt update

4、安装ROS

sudo apt install ros-noetic-desktop-full

过程:

5、 初始化rosdep

输入以下的命令,先对其初始化一下

sudo rosdep init

6、设置环境变量

(1)ubuntu是20.04版本的,对应的是noetic。

echo “source /opt/ros/noetic/setup.bash” >> ~/.bashrc

(2)输入以下命令,运行该脚本让环境变量生效

source ~/.bashrc

7、 安装rosinstall

输入以下命令:

sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool

9、 验证ROS是否安装成功

roscore

3.2 ROS常用指令以及小海龟示例

·roscore命令

ROS的使用需要一个主节点master,通过执行roscore命令即可启动一个主节点。

·rosrun命令

然后启动一下小海龟的仿真器,按ctrl+alt+t打开一个新的终端,输入以下命令

rosrun turtlesim turtlesim_node

按ctrl+alt+t再打开一个新的终端,输入以下命令

rosrun turtlesim turtle_teleop_key

此时将光标聚焦于该窗口,这时候按键盘上的↑↓←→键就可以控制小海龟移动了。

·rosnode 命令

执行rosnode list命令,即可查看当前运行中的节点。如下图所示。

·roscd 命令

通过使用roscd命令定位到该包所在的路径。使用方法为roscd 包名,比如定位turtlesim包

·rostopic 命令

可以通过rostopic命令当前节点间存在的通信话题

rostopic list

动手实现1:

通过手动给/turtle1/cmd_vel话题发送消息,控制小海龟移动。

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:

x: 1.0

y: 0.0

z: 0.0

angular:

x: 0.0

y: 0.0

z: 0.0"

让这个指令每秒发送10次

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: 0.0"

控制转弯:

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’

控制画圈:

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, -1.8]’

·rosservice 命令

使用rosservice list命令即可查看当前运行的服务,如下图所示。

·roslaunch 命令

与前面rosrun命令启动一个节点相对比,roslaunch可以一次启动多个节点

roslaunch gazebo_ros empty_world.launch

动手实现2:

当使用rosluanch启动节点后,再运行roscore会发生什么,为什么?

roscore是roslaunch工具的一个专业化工具,用于启动“核心”ROS 系统。如果 roslaunch 检测到它尚未运行(除非提供了 --wait 参数),它将自动启动 roscore。也就是说使用rosluanch启动节点的时候已经自动启动了roscore。

动手实现3:

使用rosed命令或者roscd命令快速定位到empty_world.launch所在位置并打开查看内容

3.3 了解ROS节点间的通信过程:

·使用rqt_graph查看ROS节点关系

rqt_graph

·使用rostopic查看话题信息

rostopic info turtle1/cmd_vel

geometry_msgs/Twist,话题的发布者为/teleop_turtle节点,话题的订阅者有/turtlesim节点。

动手实现4:

利用所学知识,查看turtle1/cmd_vel话题的消息类型Twist的内容是什么?

rosmsg show geometry_msgs/Twist

3.4编写节点实现话题通信

·创建功能包

首先创建一个工作空间,并使用catkin_make编译。

然后创建名为test的功能包,为其加上std_msgs、rospy、roscpp依赖。

·编写发布者节点(c++版本)

进入该包内,创建c++文件并编写

mkdir -p test/src

cd test/src

gedit talker.cpp

代码如下

·编写接收者节点(c++版本)

gedit listener.cpp

代码如下

·构建节点

打开test包内的CMakeLists.txt,

修改内容:

找到

// 建立talker节点

// 建立listener节点

保存文件,并编译

cd ~/catkin_ws

catkin_make

将该工作空间添加到.bashrc文件中,让系统能够知道我们所写的功能包在哪。

gedit ~/.bashrc

添加如下内容

source /home/xinyang/catkin_ws/devel/setup.bash

保存后重新打开终端,即可运行我们写的两个节点。

首先启动roscore

启动talker节点

rosrun test talker

启动listener节点

rosrun test listener

此时,两个节点就建立了通信,如下图所示

动手实现5:

利用所学知识,编写launch文件,通过roslaunch同时启动talker与listener节点。

cd ~/catkin_ws/src

catkin_create_pkg test_launch

gedit test.launch

catkin_make

·编写Python版本话题通信

与C++文件不同,python文件一般存储在scripts文件夹内,接下来编写talker.py

cd test

mkdir scripts

cd scripts

gedit talker.py

填入如下代码

编写listener.py

gedit listener.py

代码如下

修改CmakeLists.txt

保存退出,此时还需为python文件添加执行权限

cd scripts

chmod +x listener.py

chmod +x talker.py

回到catkin工作空间,然后运行catkin_make:

cd ~/catkin_ws

catkin_make

此时,即可运行,首先运行roscore,然后到scripts目录下分别执行

rosrun test talker.py

rosrun test listener.py

此时发送与接收的消息为当前的系统时间。

动手实现6:

当话题通信时,使用学习的命令,查看话题的信息,比如rosnode、rostopic、rosservice。

动手实现7:

模仿话题通信方式,实现服务通信过程。

实现目标:用C++编写服务和客户端节点。接收两个整数,并返回它们的和。

(1)创建beginner_tutorials包:

catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

将当前目录切换到之前创建的beginner_tutorials包中:

roscd beginner_tutorials

(2)创建srv

srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。srv文件则存放在srv目录下

用之前创建的包再来创建服务:mkdir srv

从rospy_tutorials包中复制一个服务:

roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

打开package.xml,取消以下两行的注释。

<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>

在CMakeLists.txt文件中,直接将message_generation添加到COMPONENTS列表中即可,如下所示:

此外,在CMakeLists.txt文件中,修改服务字段,因此请看上面描述的所需附加依赖项。删除#符号来取消注释,然后将Service*.srv替换为你的.srv文件名,就像下边这样:

(3)使用rossrv

通过rossrv show命令看看ROS能否识别它。

rossrv show beginner_tutorials/AddTwoInts

(4)msg和srv的一般步骤

取消注释,然后添加任意消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:

已经创建了一些新消息,所以需要重新make一下软件包: catkin_make

(5)编写服务节点

创建简单的服务(Service)节点add_two_ints_server,该节点将接收两个整数,并返回它们的和。

在beginner_tutorials包中创建src/add_two_ints_server.cpp文件并粘贴以下内容进去:

(6)编写客户端节点

在beginner_tutorials包中创建src/add_two_ints_client.cpp文件并粘贴以下内容进去:

(7)构建节点

再来编辑一下beginner_tutorials里面的CMakeLists.txt文件,文件位于~/catkin_ws/src/beginner_tutorials/CMakeLists.txt,并将下面的代码添加在文件末尾:

在catkin工作空间下

cd ~/catkin_ws

catkin_make

(8)检验简单的服务和客户端

运行服务

rosrun beginner_tutorials add_two_ints_server

运行客户端(并附带必要的参数:)

rosrun beginner_tutorials add_two_ints_client 1 3

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

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

相关文章

免费代理IP的弊端有哪些?使用代理IP前要这样哪些事项?

随着互联网的普及&#xff0c;越来越多的人开始需要使用代理IP来保护自己的隐私或突破网络限制。然而&#xff0c;免费代理IP并非完美的解决方案&#xff0c;它们也存在一些弊端。在本文中&#xff0c;我们将探讨免费代理IP的弊端以及使用代理IP前需要注意的事项。 免费代理IP的…

如何使用第三方API采集电商数据呢?

电商商家最常唠叨的就是店铺运营难做。每日多平台店铺数据统计汇总繁琐耗时&#xff0c;人工效率偏低&#xff0c;且工作内容有限。 特别是眼下“618&#xff0c;双十一&#xff0c;双十二&#xff0c;年底大促”将至&#xff0c;如何提高运营的效率和质量、保证产品及服务的良…

算法学习——华为机考题库9(HJ56 - HJ63)

算法学习——华为机考题库9&#xff08;HJ56 - HJ63&#xff09; HJ56 完全数计算 描述 完全数&#xff08;Perfect number&#xff09;&#xff0c;又称完美数或完备数&#xff0c;是一些特殊的自然数。 它所有的真因子&#xff08;即除了自身以外的约数&#xff09;的和&…

C# CAD界面-自定义工具栏(二)

运行环境 vs2022 c# cad2016 调试成功 一、引用 acdbmgd.dllacmgd.dllaccoremgd.dllAutodesk.AutoCAD.Interop.Common.dllAutodesk.AutoCAD.Interop.dll using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.T…

【pwn】pwnable_start --只有read和write函数的getshell

首先查一下程序的保护情况 保护全关&#xff01;&#xff01;&#xff01; 然后看ida逻辑 ida的结果很简洁&#xff0c;只有一段汇编代码&#xff0c;我们再来看看nc情况 现在我们来分析一下汇编代码 mov ecx, esp ; addr .text:08048089 B2 14 …

Fink CDC数据同步(六)数据入湖Hudi

数据入湖Hudi Apache Hudi(简称&#xff1a;Hudi)使得您能在hadoop兼容的存储之上存储大量数据&#xff0c;同时它还提供两种原语&#xff0c;使得除了经典的批处理之外&#xff0c;还可以在数据湖上进行流处理。这两种原语分别是&#xff1a; Update/Delete记录&#xff1a;H…

LLaVA:GPT-4V(ision) 的新开源替代品

LLaVA&#xff1a;GPT-4V(ision) 的新开源替代品。 LLaVA &#xff08;https://llava-vl.github.io/&#xff0c;是 Large Language 和Visual A ssistant的缩写&#xff09;。它是一种很有前景的开源生成式 AI 模型&#xff0c;它复制了 OpenAI GPT-4 在与图像对话方面的一些功…

arping交叉编译

arping命令依赖libpcap和libnet&#xff0c;需要先交叉编译这两个库。 1.交叉编译libpcap 下载libpcap源文件&#xff0c;从github上克隆: git clone https://github.com/the-tcpdump-group/libpcap.git source交叉编译环境 # environment-setup是本机的交叉编译环境, 里面…

LabVIEW风力发电机在线监测

LabVIEW风力发电机在线监测 随着可再生能源的发展&#xff0c;风力发电成为越来越重要的能源形式。设计了一个基于控制器局域网&#xff08;CAN&#xff09;总线和LabVIEW的风力发电机在线监测系统&#xff0c;实现风力发电机的实时监控和故障诊断&#xff0c;以提高风力发电的…

windows安装Visual Studio Code,配置C/C++运行环境(亲测可行)

一.下载 Visual Studio Code https://code.visualstudio.com/ 二.安装 选择想要安装的位置: 后面的点击下一步即可。 三.下载编译器MinGW vscode只是写代码的工具&#xff0c;使用编译器才能编译写的C/C程序&#xff0c;将它转为可执行文件。 MinGW下载链接&#xff1a;…

Stable Diffusion 模型下载:国风3 GuoFeng3

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十推荐提示词下载地址模型介绍 欢迎使用GuoFeng3模型 - 这是一个中国华丽古风风格模型,也可以说是一个古风游戏角色模型,具有2.5D的质感。 条目内

CDH6.3.2 多 Spark 版本共存

一 部署Spark客户端 1.1 部署spark3客户端 tar -zxvf spark-3.3.1-bin-3.0.0-cdh6.3.2.tgz -C /opt/cloudera/parcels/CDH/lib cd /opt/cloudera/parcels/CDH/lib mv spark-3.3.1-bin-3.0.0-cdh6.3.2/ spark3将 CDH 集群的 spark-env.sh 复制到 /opt/cloudera/parcels/CDH/li…

C语言函数递归例子2青蛙跳台阶问题

接下来我们来看一下第二个例子青蛙跳台阶 青蛙跳台阶问题 这个问题经常在各类面试中看到。一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。是实践函数递归的典型问题 分析问题 我们先假设有n个台阶&#xff0c;如果n1&am…

如何构建多种系统架构支持的 Docker 镜像

如何构建多种系统架构支持的 Docker 镜像 1.概述2.解决方案3.使用manifest案例 1.概述 我们知道使用镜像创建一个容器&#xff0c;该镜像必须与 Docker 宿主机系统架构一致&#xff0c;例如 Linux x86_64 架构的系统中只能使用 Linux x86_64 的镜像创建容器 例如我们在 Linux…

PyTorch 2.2 中文官方教程(七)

使用 torchtext 库进行文本分类 原文&#xff1a;pytorch.org/tutorials/beginner/text_sentiment_ngrams_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 在本教程中&#xff0c;我们将展示如何使用 torchtext 库构建文…

Vue中nextTick方法的作用与原理

在Vue的开发中&#xff0c;你可能会遇到一些异步更新的问题&#xff0c;如在改变数据后需要等待DOM更新完毕后再进行下一步操作。这时就可以使用Vue提供的nextTick方法来解决这个问题。 nextTick方法的作用是在DOM更新之后执行回调函数&#xff0c;确保在下次DOM更新循环结束之…

ReactNative实现一个圆环进度条

我们直接看效果&#xff0c;如下图 我们在直接上代码 /*** 圆形进度条*/ import React, {useState, useEffect} from react; import Svg, {Circle,G,LinearGradient,Stop,Defs,Text, } from react-native-svg; import {View, StyleSheet} from react-native;// 渐变色 const C…

PyTorch 2.2 中文官方教程(四)

torch.nn 到底是什么&#xff1f; 原文&#xff1a;pytorch.org/tutorials/beginner/nn_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 作者&#xff1a; Jeremy Howard&#xff0c;fast.ai。感谢 Rachel Thomas 和 Fr…

队列---数据结构

定义 队列&#xff08;Queue&#xff09;简称队&#xff0c;也是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff1b;删除元素称为出队或离队。 队头&#xff08;Front&#xff09;&a…

2024年Java面试题大全 面试题附答案详解,BTA内部面试题

基础篇 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 阿里内部资料 基本类型 大小&#xff08;字节&#xff09; 默认值 封装类 6、Java自动装箱与拆箱 装箱就是…