小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 1699|回复: 0

从零学会XR-ROS SLAM自主导航机器人开发之第四章 ROS知识入门

[复制链接]
发表于 2021-7-1 11:11:39 | 显示全部楼层 |阅读模式
注:本章内容是在ROS系统下进行的,对ROS环境具有依赖,其它环境可能无法顺利执行。
一、创建自己的ros工作空间       
在开发中我们做一些新功能或者测试一些功能,那么可能就会需要创建自己的ros工作空间,下面我们创建一个mywork_ws的ros工作空间。
一个工作空间最基本的组成有:src、build或devel(其中build和devel由编译生成),所以我们只需要创建一个文件夹(文件夹名称既工作空间名称),src是放软件功能包的地方。mywork_ws文件夹在用户文件主目录下创建。
1.1、mywork_ws下创建src
输入:$ mkdir -p ~/mywork_ws/src
1.2、进入mywork_ws文件夹
输入:$ cd ~/mywork_ws
1.3、使用catkin_make编译
即使这个工作空间是空的(即在'src'目录中没有任何软件包),你依然可以编译它,执行完该命令后,查看当前路径,会发现该空间除了 src,又多了 build 和 devel 文件夹。这两个文件夹中是一些配置信息、编译信息等。
输入:$ catkin_make
图片13.jpg

1.4、当然编译完这个工作空间还只停留在普通文件夹层面,如果我们想让ros系统认可,那么就要把这个文件添加到系统变量里。
输入 vim ~/.bashrc
1.5、如下图,同步添加工作空间信息。添加完并不会立即生效,需要用source ~/.bashrc或者重启终端, 这将确保ROS能够找到所有属于新建立的包的新消息类型和 Python模块。
输入:source ~/mywork_ws/devel/setup.bash
图片14.jpg
catkin_make命令在catkin 工作空间中是一个非常方便的工具。后边在开发过程中也会经常用到,如修改了src源码,都需要重新编译功能才会更新。
二、编译重建ros工作空间
在前边的内容中我们已经学习过如何构建一个新的工作空间,现在学习怎么重新编译已经存在的工作空间,直接使用catkin_make指令可以直接编译,但是有时候会出现异常,在一些特殊情况下需要完整重新构建ros空间。如这本章内容我们以重新构建mywork_ws为例。
2.1、为了保证构建的完整性,需要重删除build与 devel两个文件。
警告:请不要在rm命令中包括src目录,否则会导致所有 catkin源文件丢失!
输入:$ cd ~/mywork_ws/
输入:$ rm -r build/ devel/
图片15.jpg
2.2、执行上面的命令之后,你就可以像往常一样重新构建数据包:
按顺序输入以下指令:
l $cd ~/mywork_ws
l $catkin make
l $source devel/setup. bash
图片16.jpg
2.3、重新构建单独的catkin包。如果你在 catkin工作空间单独更新了一个包,并且想要重新构建它,请按照如下的顺序使用 catkin make变化命令:
按顺序输入以下指令:
l $cd ~/mywork_ws
l $catkin_make  --pkg package_name
l $source devel/setup. bash
三、理解 ROS节点
本节主要介绍 ROS 图(graph)概念,并说明roscore、rosnode和 rosrun 命令行工具的使用。
3.1、在本教程中我们将使用到一个轻量级的模拟器,请按顺序使用以下命令来安装:
l $ sudo apt-get install ros-<distro>-ros-tutorials
l #<distro>用你使用的ROS发行版本名称(例如kinetic、melodic等)替换掉''。
l roscore
3.2、roscore命令roscore是你在运行所有ROS程序前首先要运行的命令。
输入:$ roscore
然后你会看到类似下面的输出信息:
图片17.jpg
注意:如果roscore运行后无法正常初始化,很有可能是存在网络配置问题。
解决办法:
(1) 参考第四章节《机器人与电脑之间的联网设置Master配置》;
(2) 如果roscore不能初始化并提示缺少权限,这可能是因为~/.ros文件夹归属于root用户(只有root用户才能访问)。
3.3、使用rosnode
1)打开一个新的终端, 可以使 rosnode 像运行roscore一样。如果你在rosnode的指令时出现下面问题说明当前无节点运行,这时候你需要启动至少一个节点如:roscore。 图片18.jpg
[size=9.0000pt](2)rosnode list指令列出活跃的节点。
输入:$ rosnode list

图片19.jpg
这表示当前只有一个节点在运行: rosout。rosout这个节点用于收集和记录节点调试输出信息,所以它总是在运行的。
3)rosnode info命令返回的是关于一个特定节点的信息
输入:$ rosnode info /rosout
通过下图可以看出,事实上由它发布/rosout_agg
图片20.jpg
这给了我们更多关于rosout的信息
3.4使用 rosrun
rosrun允许我们使用功能包等名直接运行包内的节点(而不需要知道这个包的路径)。
1)rosrun用法:
输入:$ rosrun [package_name] [node_name]
2)接着我们在一个新的终端运行turtlesim包中的 turtlesim_node。
输入$ rosrun turtlesim turtlesim_node
你会看到 turtlesim 窗口(如下图):
图片21.jpg
注意: 这里的 turtle 可能和你的 turtlesim 窗口不同,不同ros版本界面有些区别
3)在一个 新的终端输入以下指令:
输入$ rosnode list
你会看到下图:
图片22.jpg

关闭 turtlesim 窗口停止运行节点 或者回到rosrun turtlesim终端并使用ctrl+C。
4)现在让我们重新运行它,但是这一次使用Remapping Argument改变节点名称:
输入:$ rosrun turtlesim turtlesim_node __name:=my_turtle
5)现在,我们退回使用rosnode list:
输入:$ rosnode list
你会看见下图信息:
图片23.jpg
注意: 如果你仍看到 /turtlesim在列表中,这可能意味着你在终端中使用ctrl-C停止节点而不是关闭窗口
6)如果尝试清除rosnode 列表,可以通过下边的指令,然后我们可以看到新的/my_turtle节点。
输入:$ rosnode cleanup
(7)使用另外一个rosnode指令ping来测试:
输入:$ rosnode ping my_turtle
得到下图效果:
图片24.jpg
四、理解ROS话题
1、roscore
1.1 首先确保roscore已经运行, 打开一个新的终端:
输入:$ roscore
1.2 如果你没有退出在上一篇教程中运行的roscore,那么你可能会看到下面的错误信息:
roscore cannot run as another roscore/master is already running.
Please kill other roscore/master processes before relaunching
这是正常的,因为只需要有一个roscore在运行就够了。
2、turtlesim
在本教程中我们也会使用到turtlesim,请在一个新的终端中运行:
输入:$ rosrun turtlesim turtlesim_node
2.1、通过键盘远程控制turtle
我们也需要通过键盘来控制turtle的运动,请在一个新的终端中运行:
输入:$ rosrun turtlesim turtle_teleop_key
得到如下图页面:
图片25.jpg
提示:如果不能控制,请选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获
图片26.jpg
2.2 ROS Topics:紧接上章已经启动的turtlesim_node和turtle_teleop_key节点进行操作。
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上输入消息并发布,而turtlesim则订阅该话题以接收消息。
3、rqt_graph 工具
3.1 下面让我们使用rqt_graph来显示当前运行的节点和话题。
rqt_graph能够创建一个显示当前系统运行情况的动态图形。是rqt程序包中的一部分。
3.2、在一个新终端中运行:
输入:$ rosrun rqt_graph rqt_graph
会得到类似下图所示的图形:
图片27.jpg
如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会有颜色显示。
正如你所看到的turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来互相通信。
图片28.jpg
4、rostopic介绍:rostopic命令工具能让你获取有关ROS话题的信息。
4.1、你可以使用帮助选项查看rostopic的子命令:
输入:$ rostopic -h
显示:
图片29.jpg
接下来我们将使用其中的一些子命令来查看turtlesim。
5、使用 rostopic echo:可以显示某个话题上发布的数据。
5.1、用法:
输入:rostopic echo [topic]
让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocit话题(非hydro版)上发布的数据。
输入:$ rostopic echo /turtle1/command_velocity
你可能看不到任何东西,因为现在还没有数据发布到该话题上,接下来我们通过按下方向键使turtle_teleop_key节点发布数据。
注意:如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。
现在当你按下向上方向键时应该会看到下面的信息:
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
6、用 rostopic list:能够列出所有当前订阅和发布的话题。
6.1、让我们查看一下list子命令需要的参数,在一个新终端中运行:
输入:$ rostopic list -h
显示:
图片30.jpg
7、ROS Messages:话题之间的通信是通过在节点之间发送ROS消息实现的。
对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面的消息类型决定的。
使用rostopic type命令可以查看发布在某个话题上的消息类型。
8、使用 rostopic type:用来查看所发布话题的消息类型。
用法:
输入:rostopic type [topic]
可以看到:
turtlesim/Velocity
我们可以使用rosmsg命令来查看消息的详细情况(非hydro版):
输入$ rosmsg show turtlesim/Velocity
显示:
float32 linear
float32 angular
现在我们已经知道了turtlesim节点所期望的消息类型,接下来我们就可以给turtle发布命令了。
9、使用 rostopic pub:可以把数据发布到当前某个正在广播的话题上。
用法:
输入:rostopic pub [topic] [msg_type] [args]
示例(非hydro版):
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8
上面的命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度开始移动。
图片31.jpg
9.2、这是一个非常复杂的例子,因此让我们来详细分析一下其中的每一个参数。rostopic pub这条命令将会发布消息到某个给定的话题。
9.3、-1单个破折号)这个参数选项使rostopic发布一条消息到turtle1/command_velocity后马上退出
这是消息所发布到的话题名称。
turtlesim/Velocity
这是所发布消息的值。
--2.0  1.8
· 正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。
· 在本例中2.0是linear的值,1.8是angula的值。
· 这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。
9.4、你可能已经注意到turtle已经停止移动了,这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。我们可以使用rostopic pub -r命令来发布一个稳定的命令流(非hydro版):
输入:$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8
这条命令以1Hz的频率发布速度命令到速度话题上。
图片32.jpg
我们也可以看一下rqt_graph中的连接情况,可以看到rostopic发布器节点(红色)正在与rostopic echo节点(绿色)进行通信:
图片33.jpg
我们也可以在一个新终端中通过rostopic echo命令来查看turtlesim所发布的数据。
10、使用 rostopic hz:这个命令可以用来查看数据发布的频率。
用法:
输入:rostopic hz [topic]
我们看一下turtlesim_node发布/turtle/pose时有多快:
输入:$ rostopic hz /turtle1/pose
你会看到:
subscribed to [/turtle1/pose]
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
average rate: 59.459
min: 0.005s max: 0.027s std dev: 0.00271s window: 118
average rate: 59.539
min: 0.004s max: 0.030s std dev: 0.00339s window: 177
average rate: 59.492
min: 0.004s max: 0.030s std dev: 0.00380s window: 237
average rate: 59.463
min: 0.004s max: 0.030s std dev: 0.00380s window: 290
现在我们可以知道了turtlesim正以大约60Hz的频率发布数据给turtle。
我们也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次的信息(非hydro版):
输入:$ rostopic type /turtle1/command_velocity | rosmsg show
到此,我们已经完成了通过rostopic来查看话题相关情况的过程,接下来我将使用另一个工具来查看turtlesim发布的数据。
11、使用 rqt_plot:此命令可以实时显示一个发布到某个话题上的数据变化图形。这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。
注意:如果你使用的是electric或更早期的ROS版本,那么rqt命令是不可用的,请使用rxplot命令来代替。
11.1、首先,在一个新终端中运行rqt_plot命令:
输入:$ rosrun rqt_plot rqt_plot
运行后会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。
在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮,按一下该按钮,并对/turtle1/pose/y重复相同的过程,现在你会在图形中看到turtle的x-y位置坐标图。
图片34.jpg
同理减号按钮会显示一组菜单让你隐藏图形中指定的话题。
11.2、现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta,你会看到如下图所示的图形:
图片35.jpg
五、rviz可视化工具
简介:rviz是ros的一个可视化工具,用于可视化传感器的数据和状态信息。rviz支持丰富的数据类型,通过加载不同的Dispalys类型来可视化,每一个Dispaly都有一个独特的名字。
运行rviz
1.1、打开一个linux终端
输入:$  gedit ~/.bashrc
图片36.jpg
图片37.jpg
1.2、启动roscore
roscore是节点和程序的集合,这些节点和程序是基于ROS的系统的先决条件。您必须运行roscore才能使ROS节点进行通信。使用roscore命令启动它。
输入:$ roscore
如果顺利,会显示以下页面:
图片38.jpg

1.3、新开终端运行,打开rviz
输入:$ rosrun rviz rviz
图片39.jpg
rviz的视角操作:
: 单击并拖动围绕焦点旋转
: 在相机向上和向右向量形成平面,按下中键并拖动焦点
R: 单击拖动鼠标 放大/缩小焦点  向上拖动放大,向下拖动缩小
滚轮: 放大缩小焦点
常见的display类型
图片40.jpg
六、机器人与电脑之间的联网设置Master
ROS主从环境配置:ROS的主从环境其实是一种分布式通信方式。这里我们讲述ROS主从环境的配置步骤。
6.1、IP与Hostname
启动机器人后,机器人会启动随身WIFI,在PC上链接机器人WIFI。
首先,使用下面的命令,分别在xrrobot与您PC上执行,获取xrrobot主机和您PC的IP地址:
输入:$ ifconfig
图片41.jpg
xrrobot机器人主机的默认IP已在出厂时设定为192.168.1.1,接入无线网后ip由路由器分配,也可进路由后台查看。
图片42.jpg
比如这里我们看到路由器为机器人分配的IP是192.168.5.242
6.2、根据路由器提供的IP我们需要设置路由器的master IP,设置方法如下:将ROS_MASTER_URI换成机器人实际的IP,然后保存,保存后重启终端生效
输入:$ gedit  ~/.bashrc
图片43.jpg
七、发布一个hello world话题
7.1在 ~/ mywork _ws/src/my_ros_helloworld 工作空间的软件包目录下 创建 scripts文件夹(用于存储可执行文件,即python文件)
7.2在 ~/ mywork_ws/src/my_ros_helloworld/script中创建 hello_pub.py  python脚本。下面是程序书写步骤
第一步:初始化节点,给节点起一个名字,用来告诉节点管理器:我来了,并创建节点句柄。这基本是所有话题通讯会做的事,这个节点名字可以随便取,但最好比较有明显的含义。
输入:pub = rospy.Publisher('chatter', String, queue_size=10)
第二步:创建一个发布者。这里发布者的名字可以随便取,好记有意思的名字即可,这里包括了消息类型和话题名。,那我们怎么确定消息类型和话题名字呢?下面这句话是固定操作,记住它:Publisher(大写)与后面的advertise,这都是发布消息的基本语句内容。
例:rospy .Publisher ("话题名字",类型,队列长度);
第三步:设置循环的频率,括号中是多少,就是每秒多少次
例:rate = rospy.Rate(10)
第四步:进入while()循环创建消息实例,发布消息即可。后面加上循环等待,这里的程序要根据消息的数据类型来写,这里不做介绍,在下面的代码中会有体现。
rate.sleep()
# # coding=utf-8
#!/usr/bin/env python
import rospy
from std_msgs.msg import String、
def talker():
pub = rospy.Publisher('chatter', String, queue_size=10)
# 当订阅者接收的不如发布的快,最多有10个最新的消息预留在缓存区中
rospy.init_node('hello', anonymous=True)
# anonymous=True表示当有节点名称重复时,可以在后边自动加数字区分
rate = rospy.Rate(10)
# 10hz 与rate.sleep()配合使用,表示以10hz的频率发布消息
while not rospy.is_shutdown():
#循环:检查rospy没有被关闭则执行
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
#三个任务:消息被打印到屏幕;它被写入Node的日志文件;被写入rosout(可以使用rqt_console来提取消息)
pub.publish(hello_str)     #发布
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
修改 hello_pub.py 为可执行文件(用python hello_pub.py 命令单独运行,可不需要设置,用 rosrun my_ros_helloworld hello_pub.py命令运行则需要,否则会报错找不到可执行文件节点)。
chmod +x talker.py
八、订阅hello world话题
~/ mywork_ws/src/my_ros_helloworld/script中创建 hello_sub.py python脚本
# coding=utf-8
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data)
def listener():
rospy.init_node('listener', anonymous=True)
# anonymous=True真正的标志意味着rospy是唯一的
rospy.Subscriber('chatter', String, callback)  # 订阅话题
rospy.spin()
# spin()简单地保持python不退出,直到该节点停止
if __name__ == '__main__':
listener()
rosrun my_ros_helloworld hello_sub.py 或者进入scripts目录运行 python hello_sub.py
运行结果:
图片44.jpg
九、学习ROS官方教程
图片45.jpg
对于初学者ROS WIKI无疑是最好的入门教程:http://wiki.ros.org/cn
十、如何寻找第三方ros数据包
1.1、有些时候关于ROS最难了解的就是其他开发者提供了什么。举个例子,假如你对在 Arduino机器人上运行ROS感兴趣,并且想知道是否有其他人已经创建了一个ROS包来完成这项工作,有下面4种搜索的方法你可以使用。
1.2、搜索 ROS Wiki
ROS Wiki包含一个ROS包和堆的可搜索索引。如果开发者创建了某个ROS软件并希望和其他人共享,他们往往会向 ros-users邮件列表发布公告和存储库的链接。如果他们同时在ROs Wiki上创建了文档,那么在发布公告不久之后该数据包就会出现在索引搜索中。
最终的结果,你往往仅仅通过在 ROS Wiki上进行关键词搜索就能找到想要的东西。回到上面的 Anduin机器人的例子,如果我们在搜索框中输入“ Arduino”(请去除引号),那么会得到指向两个数据包的链接:rosserial arduino和ros_arduino_bridge。
1.3、使用 relocate命令
如果你清楚想要寻找的包的准确名称,并且希望找到该包的URL地址,那么可以使用 rosIe cate命令(该命令只有在你按照之前的描述安装了 reinstall之后才可用)。例如,为了找到ROs Groovy中 ros_ arduino_bridge包的地址,运行下面的命令
输入:$ roslocate uri ros_arduino_bridge
这条命令应该产生如下的结果:
Not found via rosdistro falling back to information provided by rosdoc https://github.comhbrobotics/ros_arduino_bridge.git
这表示我们可以使用git命令安装该包到我们的个人
$ cd ~/catkin_ws/src
$ git clone git:// github.comhbrobotics/ros_arduino_bridge.git
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
1.4、浏览ROS软件索引点击
ROS Wiki每个页面上端的横幅中的 Browse software,可以浏览Wiki上完整的ROS包堆和存储库列表。
图片46.jpg

1.5、使用 Google搜索
如果其他的方法都失败了,你还可以尝试常规的 Google搜索。例如,搜索“ ROS face nition package2”就会得到一个指向面部识别数据包的链接。
十一、获取更多关于ros的帮助
1.获取更多关于ROS的帮助有几种获取额外帮助的来源。可能的最好出发点就是 ROS Wiki的主页。如前面部分描述的,请一定要利用页面右上角的搜索框。
如果你在Wiki上无法找到需要的帮助,可以尝试ROS问答论坛。问答站点是一个获取帮助的好地方。你可以浏览问题列表,搜索关键词,查看基于标签分类的不同话题,甚至可以在一个话题更新时收到E-mail通知。但是,请一定在发布新问题之前先搜索已有的问题列表避免重复提问。

图片47.jpg
添加小R科技官方ROS支持群1005688426
论坛提问:  http://www.wifi-robots.com/
商务合作:service@xiaorgeek.com







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2022-7-4 07:45 , Processed in 1.177255 second(s), 21 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表