3、ROS基础知识

3.1什么是ROS

ROS的雏形诞生:

斯坦福大学人工智能实验室的STAIR机器人项目这个项目希望完成一个服务机器人原型,在视觉的辅助下,可以在复杂环境中运动,还可以通过机械臂操控环境中的物体。STAIR机器人配备了一个运动底盘,一个小型机械臂,立体摄像头、激光雷达。

摩根·奎格利(Morgan Quigley)在开发中意识到,各种功能集成在一个机器人上非常不容易,因此那时他就考虑并采用了“分布式”的方式来连接不同的模块。并将这一概念成功应用到机器人软件系统中,取名为Switchyard。

ROS本尊诞生:

摩根·奎格利的导师吴恩达,帮助柳树车库机器人公司(Willow Garage)开发PR2机器人和软件系统,摩根·奎格利则利用在STAIR项目中积累的经验,成为软件开发框架的负责人。STAIR项目的软件系统Switchyard则演变成后来ROS。

Robot Operating System机器人操作系统

ROS不是传统意义上的操作系统,不是用于进程管理和调度,而是构建在其它操作系统之上的一种结构化的通讯层;ROS 的主要目标是为机器人研究和开发提供代码复用的支持。


关于ROS的更多发展历史,可以参考拓展阅读:《ROS史话36》--张新宇

3.2 Ubuntu下安装ROS

本节内容介绍Ubuntu下ROS的安装,安装需要用到连个参考链接,分别是ROS官方的安装指引和清华大学开源软件镜像站。

由于安装中涉及的地址和key可能会更新,所以安装时务必参考网页内容来复制指令

ROS wiki ROS/Installation - ROS Wiki

清华大学开源软件镜像站 AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

首先打开ROSwiki官方安装指引,这里我们使用的操作系统是Ubuntu18.04所以对应ROS版本选择ROS Melodic Morenia

然后选择安装平台为Ubuntu

接下来就是ROS官方的一个安装指引,根据网页内容即可进行安装。这里需要注意的是,在设置软件源的时候这里是一个国外的地址。我们如果使用这个地址的时候安装过程会非常慢。

这个时候就要用到我们前面提到的清华大学开源软件镜像站

AOSP | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror在左侧目录找到ROS点击,这里就有提供国内的地址。

开始安装:

首先回到ROS官方指引将第一个步骤设置软件来源的指令复制

打开虚拟机Ubuntu,在终端运行。这条指令的作用就是把它提供的这个国外的地址写到/etc/apt/sources.list.d/ros-latest.list这个文件里去。

那么相对应的我们要修改下载地址的话只需进到/etc/apt/sources.list.d/ros-latest.list这个文件中把地址替换掉就好了。

回到清华大学开源软件镜像站把刚刚我们找到的国内地址复制一下将文本里面的内容替换掉然后保存。

因为我们使用的是清华大学的软件地址,拥有也使用它对应的key。这里跳过ROS官方指引的1.3 Set up your keys。

复制这行命令到Ubuntu终端执行。

到这里软件源的替换和key设置已完成,接下来就可以完全按照官方指引进行安装了。

首先运行sudo apt update更新软件列表,完成之后这里有三个选项分别是安装桌面完整版,桌面版,基本框架版。我们选择桌面完整版sudo apt install ros-melodic-desktop-full

安装完成后需无报错方可进行下一步,否则反复安装知道没有报错为止。

继续下一步,设置环境变量。

直接复制echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc到终端执行,source /opt/ros/melodic/setup.bash这一行就会被写入到~/.bashrc文件当中

写入完成后执行source ~/.bashrc使配置文件生效。

安装依赖包

复制运行

初始化rosdep复制sudo apt install python-rosdep去终端运行安装rosdep,安装完成后复制运行sudo rosdep init初始化rosdep。在这里大概率是初始化失败的,如果失败可以直接跳过。

至此,ROS安装已完成。我们在终端启动一下roscore

这里可以看到,roscore已经正常启动

rosdep initrosdep update报错解决方法

在安装ROS的时候,执行到rosdep init这一步骤时,如果你的网络是“正常”且“合法”的,通常都会报这样一个错误

根据提示,问题根源应该就在于https://raw.githubusercontent.com这个网页无法访问(你可以用浏览器测试,确实访问不了)。

机智的你可能已经想到,这是由于国内特殊的网络环境导致的,所以我们可以尝试绕过域名,用直接访问网站IP地址的方式。

首先我们要获取网站的IP地址,可以用域名IP查询工具,百度搜索即可。

进入网站后,复制粘贴网站地址,查询得到我们要找的IP(185.199.109.133这个IP可能是动态的,以实际查询为准)

然后将访问不了的网页和这个IP做一个解析规则(185.199.109.133这个IP可能是动态的,以实际查询为准,使用实际查询到的IP地址替换指令中IP地址)
修改/etc/hosts文件,再文件末尾加入一行,可以直接用下面的指令:

sudo sh -c 'echo "185.199.109.133 raw.githubusercontent.com" >> /etc/hosts'

修改后为了避免之前已经对列表文件做过操作,可以将它删除

修改后为了避免之前已经对列表文件做过操作,可以将它删除

然后再执行

sudo rosdep init

rosdep update

经过测试, rosdep update可能会出现TIMEOUT报错

这是网络超时导致,可以换个时间继续尝试

3.3 ROS通讯结构

这一节课我们给大家介绍一下ROS的通信结构,在此之前我们先来看一张图它从下往上分别分成了OS层,中间层,应用层。

OS层:OS层是操作系统层也就是我们现在使用的ubuntu,它提供了操作系统这一层的相关东西,对我们ROS开发来说不需要过多了解。

中间层:这里有TCPROS/UDPROS、Nodelet API、ClientLibrary。

TCPROS/UDPROS是基于TCP、IP协议做的二次封装取名为TCPROS和UDPROS;

Nodelet API为了弥补TCPROS/UDPROS使用中的一些不足它是使用一种共享内存的方法而不是网络传输的实现一些数据共享;

ClientLibrary是客户端的库,这个库就是指把UDPROS和TCPROS再继续进行封装成了一些ROS的具体通信实现方法例如我们后面要提到的话题、服务等等;

应用层:应用层的最左边是一个Master,Master是跟中间层一起框起来,上面标注了一个Ros。这是因为Master节点是每一个Ros进行中必须要有的并且只能唯一有的所以说Master节点也是Ros官方提供的。它是用来管理右边这些应用层的Node等等。而每一个note就是一个个相互独立的应用。

ROS的通信是在OS层之上、基于TCP/IP协议实现

3.3.1node和master

下面我们再通过一个对比来说明一下note和master之间的关系

节点:

一个可执行程序进程,通常一个node负责者机器人的某一个单独的功能,例如右边图上的Camera Node就是一个相机的节点。不同的节点可以使用不同的编程语言C++或python。在同一个ROS下节点对于编程语言是没有要求的,可以每个节点用互相不同的语言。在右边有一个Image Display Node,它是运行在另一台电脑上的图像处理节点。也就是说Ros的节点是可以运行在同一局域网下的不同机器人上。

master:

每个节点都负责单独的一部分功能,节点跟节点之间要互相发现彼此这就需要master。master相当于一个管理中心,每一个node启动的时候先要在Master处进行一次注册告诉master自己的基本信息,需要订阅什么话题,需要发布什么话题。node之间的通信也是先由master进行“牵线”,才能两两的进行点对点通信,一个ROS计算图中有且只有一个master。

3.3.2节点之间的通讯方式

节点和节点之间的通信具体有4种实现方法,分别是话题、服务、动作、参数;下面我们一一来解释一下这四种通信方式各自有什么优缺点和差异。

话题:

下面这张图就是一个话题通信的模型。我们以这张图为例Publisher发布者发布了一个example这个话题。example话题被两个Subscriber所订阅了。

话题的通讯是单向的,这个订阅过程是完全单向的Publisher只管发Subscriber只管收。

一个话题可以被多个Subscriber订阅,也可以由多个发布者来发布。话题是实时性差且异步的通讯。Publisher的发送时间跟Subscriber接收到的时间并不是严格同步的,而且Publisher是不知道Subscriber有没有收到或者说有多少Subscriber收到了。话题的一般应用场景为,一个传感器的信息发布。例如激光雷达发布扫描的数据,或者相机发布图像就会用话题的方式来发布。话题传递的内容就是message,而message type就是话题的消息类型。当发布者通过udp或者tcp协议发出去一段字符之后接收者接收到了应该怎么样去解析,这就需要共同定义好一个解析的方式这个也就是消息的格式。

服务

下面这张图就是一个服务通信的模型。服务的通讯是双向的,有一条实线箭头和一条虚线箭头。实线这边是从Client端发往Server端的这是一个起始,是由客户端向服务端发起的请求。请求在执行完之后再向客户端返回一个应答这个就是服务的过程

服务有更强的的同步性,实时性。客户端发出一个请求之后如果一定时间之内没有应答就认为这次通信失败,从而进行下一步做一些异常处理。它的底层实现也是UDPROS和TCPROS。服务的通信模型是多对一的,可以有多个客户端但只能有一个服务端。服务适用于逻辑任务的处理。

以下就是服务和话题各自的特点和对比。

动作:

Action和刚刚我们介绍到的服务有点类似,服务是客户端发送一个请求服务端返回一个应答。这种模式在任务执行周期短的情况下是十分有用的,例如让服务器关一下灯,服务器立马把灯关了,然后返回一个应答告诉你灯已经关了。但是如果用服务的方式让机器人去烧一壶水,在水烧开之前是收不到任何回复的。此时无法判断到底是没有收到,还是正在执行。在类似这种执行周期比较长的任务下服务就很不适用了。所以也就产生了动作action这种方法

goal - 用于向服务器发送目标。

cancel - 用于向服务器发送取消请求。

status - 用于通知客户端系统中每个目标的当前状态。

feedback - 用于周期反馈目标的辅助信息。

result - 用于向client发送任务的执行结果,这个topic只会发布一次。
cn/actionlib - ROS Wiki

goal和cancel是由客户端向服务端发送的,status和result和feedback是由服务端返回的。Action和服务的区别在于它有多重回复。例如让机器人去烧一壶水,机器人首先会回复一个status。告诉你当前状态开始烧水,同时还有回复feedback周期性的报告目前水温是多少度。最后水烧开了回复一个result水已经烧开了。客户端接收到result就知道这一组动作已经结束了。Action在执行过程中如果想要取消动作,它还提供了一个cancel这接口来取消请求。这里要注意一下feedback和status都可以有多个但是result只会发布一次。

参数服务器:

参数服务器是一种比较特殊的机制,他既不是一个节点,然后我们在启动的时候也没有特地去启动它。它运行在Master当中,是节点用来存储参数的地方。例如某一个节点启动的时候需要获取变量foo。如果参数服务器当中没有存储这个变量,那他会使用一些默认值。但当你你去调用这个参数,然后给他设置一个值。此时节点如果再去获取参数就会拿到这个新的值。这就是参数服务器的一种通信机制。

参数服务器并非是一个node,运行在master中,节点存储参数的地方

用于配置参数,全局共享参数,是一个字典,key-value
Parameter Server - ROS Wiki

3.4ROS下常用shell命令

所谓shell命令我们前面提ros提供通讯架构之外还提供了一些开发工具。 这里我们说到的shell命令就是指他的命令行工具。这里会详细列举ROS下一些比较常用的命令的格式和用法。

3.4.1roscd

看到roscd的话,可能会大家想到我们之前有介绍过一个Linux下有一个CD指令它是跳转目录用的。而roscd也是跳转目录用的,但它不同的地方在于roscd面要跟的是你的功能包名。 例如turtlesim这个功能包。

这里通过roscd这个指令就直接跳到了opt ros melodic share turtlesim这个目录下。 opt/ros /melodic/share 这个目录在前面章节有提到过,是安装ros功能包的地方。那么显而易见roscd这个指令的功能就是可以直接跳转到功能包所对应的目录下。

3.4.2roscore

这个指令我们在装完ros的时候也有用到过。测试ros启动时输入roscore,它主要是启动了ros的一个master节点管理器和一些必要的日志输出文件以及我们前面所说到的的参数服务器。这个就是roscore的作用。

3.4.3rosrun

rosrun的功能是运行节点,rosrun后面是要带参数的,至少要带两个参数。第1个是功能包名,第二个是可执行程序名。打开一个新终端运行rosrun turtlesim turtlesim_node,这条命的作用就是运行一下turtlesim这个功能包下的turtlesim_node这个节点。我们看到这里出来了界面,有一个小乌龟在界面上。这个是ros官方提供的一个小的demo,我们这一节课所有的指令都是在这个demo下来操作。

这里需要注意的地方是使用rosrun来运行turtlesim_node的时候要在新终端运行,而不要把原终端的roscore关了再运行rosrun turtlesim turtlesim_node,否则会有报错提示master节点未开启。

3.4.4rosnode

rosnode的功能是输出节点相关信息,rosnode顾名思义就是跟节点有关的一些操作。直接运行rosnode可以看到它的一些提示信息。这里会告诉你可以带哪些参数。

rosnode list:列出当前节点。

可以看到目前是有运行两个节点的rosout和turtlesim。turtlesim就是刚刚我们手动的。通过rosrun指令启动的这个节点,rosout是通过roscore启动ros master自动启动的一些日志输出相关的节点。

rosnode info:节点信息查询的一个指令

rosnode info它后面还需要带一个参数,也就是我们的节点。这里也是可以使用tap自动补全的,我们输入turtlesim这个节点。

他会列出节点的各种信息包括的名称,发布了哪些话题订阅了那些话题,有哪些服务,还有更详细的端口号,跟哪些节点有连接关系,还有它传输的方式是tcpros的方式。

rosnode kill:杀掉一个节点

rosnode kill是通过kill的方式来结束一个节点。终端运行rosnode kill /turtlesim,就会结束节点turtlesim_node

rosnode machine:列出运行在特定机器上的节点

只运行rosnode machine的话会列出哪些机器上运行了节点。在前面章节有提到过,节点可以运行在一台机器上也可以运行在多台机器人。这里的Ubuntu是我们的计算机名,并不是代表Ubuntu系统如果把它改为其他的例如说bingda。那这里出现了就会是bingda,在这里是只有ubuntu这台机器运行了节点。如果node machine后面跟上设备名Ubuntu就可以看到,Ubuntu这台计算机上现在是运行的哪些节点。

3.4.5rostopic

rostopic的功能是输出话题相关信息,终端运行rostopic我们先看一下他可以跟哪些参数这里我们挑几个比较重要的。

rostopic list:列出当前所有活跃的话题

rosout、rosout_agg是跟rosmaster相关的一些日志输出的话题。

turtle1/cmd_vel是一个运动相关的话题。打开一个新终端,启动一个键盘遥控程序。

rosrun turtlesim turtle_teleop_key

运行这个节点可以通过上下左右键来控制小乌龟的位置移动,前进后退和旋转等。这个键盘遥控程序。所发布的就是cmd_vel这个话题。

rostopic info:查看话题类型以及发布订阅关系。我们通过rostopic info查看一下这个话题

话题的类型是我们前面提到的message。它的message是一个geometry_msgs/Twist它的发布者是teleop_turtle这个键盘遥控程序订阅者是turtlesim是小乌龟界面rostopic ehco:打印出一个话题传出的内容我们可以通过rostopic echo把话题给输出出来。

现在还没有任何的输出信息。回到键盘遥控程序。把光标放在上面,按一个向前进。这里可以看到开始输出新的信息。

通过echo的方式,相当于注册了一个新的订阅者。当这个话题在网络内有发布的时候。你也会收到一份。并且把它打印出来。

rostopic type:输出话题类型

rostopic type是一个info的简化版,它只输出一个话题的消息类型。

rostopic hz:检查消息发布频率。

运行之后小乌龟没有移动时输出结果,no new messages.用键盘遥控小乌龟移动时就会根据接收的消息计算出当前消息发布的频率。

rostopic pub:向话题发布数据

刚刚我们借助了一个键盘遥控节点来控制乌龟的移动。如果想要手动的通过命令行发布一个消息就需要用到rostopic pub。终端输入rostopic pub+话题名,输入完之后按两下tab可以自动补全消息的类型以及它里面要填充的参数。首先第一个参数是linear线速度xyz,下面还有一个角速度angular。

我们把角速度angular的z项也就是旋转角速度填为1。

在小海龟的界面是可以看到小海龟转动了一下就停了。这个就是通过pub的方式来发布消息。pub之后也是可以跟参数的,例如 -r 10

这条命令会让小海龟持续的转动,因为这条命令是以10赫兹的频率来发布的。在pub后面加入-r,10就是代表频率。

我们也可以用rostopic hz验证一下。平均的发布频率也是10赫兹,和rostopic pub发布出去的消息是相符的。

3.4.6rosservice

首先终端输入 rosservice回车一下看可以带哪些参数

运行rosservice list列出运行的程序当中所有使用到的服务。这里以spawn这个服务为例对rosservice命令进行讲解。

运行rosservice info /spawn这个我们可以看到它是由turtlesim这个节点所产生的。 类型是turtlesim/Spawn这个服务的类型。后面有参数Args:X坐标,y坐标,方向theta和名称。

运行rosservice args /spawn看一下参数Arg,它列出了所需要用到的参数。可以看到这里运行的结果和info当中的arg这个信息是一样的。

我们使用rosservice call 试着调用一下这个服务。它要带4个参数,第1个参数是x轴坐标,第2个参数y轴的坐标,第3个theta角度,第4个名称。分别设为1,1,0,turtl2

在终端运行rosservice call /spawn 1 1 0 turtl2

此时可以看到小乌龟界面上是多了一个小乌龟的,这个spawn的服务也就是产生一个新的乌龟。在输完这条指令之后,调用了一下spawn这个服务。 它有一条应答,输出了乌龟的名字,这个就是service下面一些主要的用法。关于service 的其他用法也可以通过加-h参数查看帮助来自行摸索。在帮助里会详细介绍命令的使用格式,和可以带的参数等。

3.4.7rosmsg

rosmsg的功能是输出消息相关信息,终端输入rosmsg回车,可以看到这个命令下也是有很多参数可选,这里着重讲一下show参数。

rosmsg show直接运行是什么结果都没有的。所以我们加上-h参数查看一下帮助。根据提示可以看到,这个命令是要带一个消息的类型的。

在前面的内容有提到过/turtle1/cmd_vel这个话题的消息类型是geometry_msgs/Twist。我们直接show一下这个geometry_msgs/Twist。先通过rostopic info找到/turtle1/cmd_vel这个话题中间沟通用的消息类型,我们把它复制下来再show一下。

结果显示geometry_msgs/Twist包含了两个向量,第1个代表的是三轴的线速度。第2个代表的是三轴的角速度。 通过rosmsg就可以看到每一个话题当中沟通使用的消息类型里面具体包括了什么。

3.4.8rossrv

rossrv的功能是输出服务相关信息,它和rosmsg的功能是类似的他也是用来显示所用到的服务里面的信息。我们查看一下前面提到的/spawn这个服务。

先运行rosservice info /spawn查看服务信息,复制服务的类型turtlesim/Spawn在终端运行rossrv show turtlesim/Spawn

输出内容里有三条横线组成的一个分隔符,横线上的几个参数是做服务请求时所要带的参数。分隔符以下的代表的是服务器向客户端做响应时所带的参数。在请求时需要带4个参数,乌龟的坐标和名字。响应的时候带的就是乌龟的名字。

3.4.9rosbag

rosbag的功能是播放/录制数据集

在讲解rosbag之前,我们先通过命令行发布一个消息让2号小乌龟原地转圈。

持续发布一个线速度和角速度都为1时可以看到2号小乌龟已经开始原地转圈了

rosbag record:录制数据集

接下来我们来演示一下rosbag的用法,在终端运行rosbag record -a -O subset

rosbag可以录制当前ros通信网络当中所有的话题信息。他用的方法是record-a代表的参数是录制所有的话题。-o可以指定一个话题名,例如说我们把它取名为 subset 。命令运行后就已经开始录制话题了,录制完成后直接ctrl+c结束。此时使用ls就可以可以看到已经有一个subset.bag文件。这是录制所有的话题,如果只关心某一个的话,也可以将-a替换成想要录制的话题名。

例如想录制turtl2/cmd_vel这个话题。则将-a替换成turtl2/cmd_vel这个话题。

rosbag info:输出数据集信息

运行rosbag record /turtl2/cmd_vel -O subset开始录制后等待几秒钟再结束录制。通过rosbag info这个指令查看文件subset.bag。这个指令可以看到数据集的路径,录制的时长,开始时间,结束时间,文件大小,录制消息数量,录制消息类型,录制了哪些话题。

rosbag play :播放数据集

数据集的播放是使用rosbag play,先将2号小乌龟原地转圈的命令停掉。小乌龟停下来后,运行rosbag play subset.bag 将刚刚录制的数据播放一下。小乌龟将随着数据集播放重新转圈,完全复现了刚刚录制的内容。

rosbag这个功能一般是用在需要记录一些实验的过程,尤其是一些比较复杂的实验。例如开发一个机器人去做了一些导航测试,测试环境搭建较为困难。这种情况下就可以在测试的过程中,把所有的数据录制下来。方便进行重演,这就是数据包的作用。

3.5 ROS常用图形工具

本节内容介绍ros的常用图形工具。

打开虚拟机,打开终端运行roscore

打开一个新终端运行小乌龟节点rosrun turtlesim turtlesim_node

再打开一个新终端运行键盘控制节点rosrun turtlesim turtle_teleop_key

接下来将用小乌龟例程来介绍ros下常用的图形化工具

1、rqt_graph

终端输入rqt_graph即可启动,启动之后是这样子的

rqt_graph作用是显示节点和节点之间的联系。例如说我们可以看到。teleop_turtle和turtlesim中间。是因为teleop_turtle 发布了一个turtle1/cmd_vel,然后turtlesim是正好订阅了这个话题。所以这两个话题中间就有了这样一条线,把它们连接起来。通过这个工具可以看到每个节点和每个节点之间的订阅发布关系之类的。当出现问题的时候,通过图形化来看它们中间哪个节点的话题没有连上也会比较方便。这个就是rqt_graph的用法。

2、rqt_plot

终端输入rqt_plot,rqt_plot是一个曲线绘图工具。可在1号标记处选择输入话题名,例如/turtle1/pose。在2号标记出会把pose下的几个变量全部添加进来。可以通过3号标记处的减号来删除一些我们不关注的变量。这里我们只关注小乌龟的坐标位置,把跟速度有关的/turtle1/pose/angular_velocity和/turtle1/pose/linear_velocity移除。

为了便于观察,需要通过4号标记处图标选择调节坐标尺度。

例如说我们希望x轴方向显示。20秒内的数据我们可以在x轴左边设置0,右边设置为20。纵坐标方向我们希望他从0开始显示到10同样调整一下这纵坐标的幅值。

调整完坐标幅值后我们测试一下这个绘图工具。首先启动键盘遥控控制乌龟移动。此时,可以看到小乌龟的坐标位置发生变化时,相对应的在曲线图中x,y,theta三条线也会产生变化。

这就是rqt_plot这个工具的用法,在进行运动控制之类的研究时可通过它把速度,位置等信息的曲线绘制出来。可通过它来观察运动是否平稳,曲线的变化情况等,对调试工作非常有帮助。

3、rqt_image_view

它的作用是查看摄像头图像,在此之前先把摄像头连接到虚拟机。然后在ros下安装一个摄像头的功能包。

终端运行sudo apt install ros-melodic-uvc-camera

ros下的功能包的安装方式都是遵循统一的规范,先是ros然后-版本号这里我们是melodic。然后是功能包名,例如我们要安装的功能包名为uvc camera。

终端运行rosrun uvc_camera uvc_camera_node

uvc camera_node这个节点会启动摄像头,并发布图像话题。打开一个新终端,rostopic list查看一下当前的话题列表现在可以看到已经有了图像的话题。

针对这个图像话题,需要用到rqt_image_view这样一个工具来查看图像。

终端运行rqt_image_view

现在什么显示也没有,需要先选择一下话题在这儿我们选image_raw就能看到摄像头的画面了。

roslaunch

在这里补充一个ros的指令。在前面章节说到,ros下第1步要先启动roscore,然后才能rosrun依次启用各个节点。现在我们先把所有正在运行的节点都关闭。

运行指令:roslaunch uvc_camera camera_node.launch

roslaunch的格式是,第1个参数是功能包名,第2个参数是launch文件名。这个指令启动了uvc_camera 下的camera _node.launch文件。这时候会发现在没有启动roscore的情况下摄像头节点被启动了,图像话题也可以正常订阅。 这是因为roslaunch会先侦测当前环境中有没有master在运行如果没有的话,它就启动一个master。如果已经有了的话他就直接启动节点而不去启动master。 在以后的章节内容当中,我们启动节点会主要通过roslaunch。因为它在一个launch文件中可以包含多个节点的启动。

4、RVIZ

ros下还有一个非常重要的图形化工具就是rviz。

先启动摄像头节点roslaunch uvc_camera camera_node.launch

终端运行rviz

这个就是rviz的界面,rviz是一个非常强大的。图形化显示工具,中间的黑框部分是可以显示的一些3d的内容,例如三维地图,点云数据等等。如果想要显示二维的信息在这里点一下add增加。选择新建一个图像显示工具image。

在右侧出现的图像显示工具,点开选择好要显示的图像话题/image_raw就可以了。在add里还有很多选项。除了刚刚说到的图像,还有地图、里程计、路径、点云等等都可以在这里面显示。

3.6 ROS坐标系和TF变换

ROS下的坐标系是遵循右手坐标,如图1伸出右手,大拇指所指方向为Z轴正方向,食指所指方向为X轴正方向,中指所指方向为Y轴正方向,如图2 所示,右手握在对应的手指上,四根手指的握住方向就是对应轴旋转的正方向。

TF变换是ROS中用于描述两个物体坐标之间的位置关系,如下图中机器人本体和雷达传感器的位置关系,雷达和墙面之间的位置关系,以及根据机器人本体和雷达的坐标变换换算出机器人本体和墙面之间的位置关系。

下面通过ROS中的一个小例程来演示一下TF坐标变换

roslaunch turtle_tf turtle_tf_demo.launch

启动演示例程后,会出现两只小乌龟,通过键盘的上下左右键可以移动第一只乌龟,第二只乌龟会自动跟随第一只乌龟运动

我们可以通过rosrun rqt_tf_tree rqt_tf_tree 启动TF树查看工具来查看坐标关系

可以看到,turtle1和turtle2两个坐标都是的父坐标是world这个坐标,还有坐标变换的发布者,发布频率等信息。

也可以通过rosrun tf tf_echo /world /turtle1 来查看两个坐标之前的变换关系的具体数值,例如/turtle1坐标和/world

也可以通过rviz界面动态的显示各个坐标之间的运动关系,这里要注意,rviz中需要增加TF显示插件,并将基座标修改为world才可以正常显示

3.7 ROS的工作空间和编译

本节内容介绍一下ros的工作空间和代码编译。 在前几个章节中演示了一个小乌龟的例程。这个例程是由ros官方别人已经提供好,我们直接安装上的就能使用的。 如果想要运行一些ros没有提供的,或者自己想设计一些功能包应该要怎么做呢?

建立一个工作空间:mkdir catkin_ws

工作空间的名称里是没有限制的可以自行定义。为了跟ros官方wiki的指导手册当中保持一致,建议沿用catkin_ws这个文件夹名。cd进到工作空间下,在工作空间下创建一个src文件夹,至此工作空间创建完成。

编译工作空间:catkin_make

要编译工作空间内的代码必须在工作空间的根目录,用catkin_make指令编译这个工作空间。编译完成后工作空间下就新增了build和devel这两个文件夹这个是编译系统在过程中自动生成的。

src目录就是用来放功能包源码的,如果想运行自己的功能包,代码需要放到src目录下。例如我们现在去git上拉取一个已经编写好的功能包。进入src文件夹,拉取功能包。

git clone bingda_tutorials: ROS核心教程--初级教程

加入了新的功能包代码之后,工作空间需要重新编译,跳转到上一级在catkin_ws目录运行catkin_make,切记catkin_make必须要在工作空间的主目录下运行。编译完成后代码还是运行不了。因为工作空间只是被编译了,并没有加入到环境变量中去。ros不认这里面的功能。所以下一步把工作空间加到环境变量中。

环境变量的编辑还是通过vim编辑器打开.bashrc这个文件来操作。在文件末尾加入

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

这里还有我们上一次加入的。ros安装之后的把ros加入到环境变量中 所加入的那一行source把这一行加完之后就可以保存退出,运行source .bashrc 重新加载一下环境变量。

运行一下roslaunch bingda_tutorials bingda_talker.launch启动了一个消息的发布者

运行roslaunch bingda_tutorials bingda_listener.launch启动一个消息的订阅者

这就是我们说的运行一个自己编写的程序,以及别人提供好的一些功能包但是没有提供用apt安装方式的,应该怎么去编译运行。

Ubuntu中,ROS(机器人操作系统)是一个常用的开源框架,用于构建机器人软件和控制系统。以下是一些UbuntuROS相关的基础知识: 1. ROS版本:在Ubuntu 18.04中,对应的ROS版本是melodic。确保你安装的ROS版本与你的Ubuntu版本相匹配,以避免出现错误。\[2\] 2. 安装ROS:在Ubuntu中安装ROS可以按照以下步骤进行: - 设置系统软件源和ROS源 - 添加ROS的keys - 安装ROS - 初始化ROS - 配置ROS系统环境 - 进行ROS测试\[1\] 3. 基本概念:ROS中有一些基本概念需要了解,例如: - roscore:ROS的核心功能,用于管理ROS节点之间的通信。 - rosnodelist:用于查看当前运行的ROS节点列表。 - rostopic:用于查看和发布ROS主题(topic)的信息。 - rosrun:用于运行ROS节点。 - rqt_graph:用于可视化ROS节点和主题之间的关系图。 - rosbag:用于记录和回放ROS主题的数据。 - 等等\[1\] 这些是UbuntuROS相关的一些基础知识,希望对你有所帮助。如果你有更具体的问题,请告诉我。 #### 引用[.reference_title] - *1* *2* [Ubuntu18.04 ROS](https://blog.csdn.net/weixin_43563233/article/details/109746851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ROS学习笔记01、安装Ubuntu18.04以及ROS环境](https://blog.csdn.net/cl939974883/article/details/126306805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值