ROS:Robot Operating System,机器人操作系统
通信机制+开发工具+应用功能+生态系统
Powering the world’s robots——机器人领域的普遍标准
使用Google浏览器可以找到很多问题
1991年,芬兰赫尔辛基的大学生Linus Torvalds编写
企鹅logo:敢作敢为,热爱生活
软件更新中可以设置软件源,校园网用edu的源,家里的话可以用阿里云
可扩展性和灵活性更好
根目录是“/”文件夹,里边有home,usr等文件夹
软件安装一般在usr文件夹
home文件夹中有以用户名字为名称的文件夹,进去之后是自己的文档资料,或者叫“主目录”
pwd:查看当前终端所在路径
cd:切换路径
cd /home:到达/home目录下
cd …:回到上一级
mkdir:创建文件夹命令
touch:创建文件命令
mv:剪切命令
cp:拷贝命令
rm:删除命令,-r表示递归删除
sudo:表示指令以最高权限执行
sudo apt-get update:更新系统软件源列表
[指令] --help:帮助指令,看到指令使用方法
g++是c++的编译器:sudo apt-get install g++
安装Python解析器:sudo apt-get insta;; python
编译&运行.cpp文件:g++ [.cpp] -o [可执行文件] + ./[可执行文件]
解析.py文件:python [.py]
可以使用Tab键进行命令的补全
看一遍授课视频,结合官方的安装流程,就基本上问题不大。官网安装教程如下:
官方安装教程.
遇到了一个小问题,解决办法如下:
ubuntu18.04安装ROS时出现错误ERROR: cannot download default sources list from解决办法.
最终实现小乌龟跑动:
2007年诞生,2010年,ROS正式进入公众视野(正式发布)。
核心目标:提高机器人研发中的软件复用率
节点(Node):执行单元
节点管理器(ROS Master):控制中心
话题(Topic):异步通信机制
消息(Message):话题数据
服务(Service):同步通信机制
参数(Parameter):全局共享字典
功能包(Package):ROS软件中的基本单元,包含节点源码、配置文件、数据定义
功能包清单(Package manifest):记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志
元功能包(Meta Packages):组织多个用于同一目的的功能包
直接打rosnode就可以看后边可以加入哪些选项
rosnode list:显示有哪些节点
rosnode info [Node]:可以看某个节点的信息
可以用命令行控制小乌龟的移动
例如用:rosmsg show [Message]可以看某条指令的含义
rosservice list:显示有哪些可选选项
如spawn可以产生多只海龟
保存一段时间的操作,这样就不用每次运行都重新手动操作
是一个存放工程开发相关文件的文件夹
同一个工作空间下,不允许存在同名功能包
不同工作空间下,则可以存在
这一节主要展示了工作空间的创建,以及编译等操作,具体建议直接看视频
小乌龟运动为例,结构框架如图:节点管理器、发布者、订阅者、话题
这里我们要自己定义一个Publisher,在此基础上实现它指令的不断发送,控制小乌龟的运动。
这里涉及到了如何实现一个发布者的编程实现:
具体的操作过程建议参照视频来做,里边提到了很多操作细节。
这里遇到了一个问题,关于环境变量的设置问题,需要在工作空间的根目录下进行环境变量配置(没有采用视频中讲环境变量写入.bashrc的方法),参照该文章,解决了配置环境变量进而运行的目的。
[古月居ros21讲出现问题及个人解决方案1]第十讲出现:[rospack] Error: package’learning_topic’not found
这里使用Ctrl+h在文件夹中显示隐藏文件
最终实现了小乌龟的画圆圈运动。
和第10讲几乎一样的操作
创建一个订阅者,不断打印小乌龟所位置的数据
这里涉及如何实现一个订阅者的编程实现:
回调函数类似嵌入式中的中断服务函数,程序会进入一个等待的循环状态,程序一旦识别到有话题消息,就进入回调函数来处理消息。
最终实现在命令行不断打印小乌龟的姿态信息。
在这一讲,我们不再使用ROS自带的话题模板(我目前是这样理解的),而是自定义一个话题消息,并且建立发布者和订阅者的联系。
首先在功能包learning_topic
内创建一个msg
文件夹,用于存放我们将要定义的话题消息,里边创建一个Person.msg
文件,用于存放具体的消息内容:
在此基础上,在源文件src
目录下创建一个发布者和一个订阅者的源码:
之后,在CMakeLists.txt
里写入一些我们需要的编译选项,这里还不是太懂具体怎么回事。
最后在根目录下使用如下指令进行编译:
catkin_make
而后在不同终端下用如下指令即可实现发布者和订阅者之间的通信:
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun learning_topic person_subscriber
rosrun learning_topic person_publisher
这里需要注意的是,我们没有将环境变量添加到某个文件中(应该是第10讲或者第11讲讲过来着),所以每次运行需要先配置环境变量,再rosrun
我们需要的东西,这里是一个小坑,具体操作可以参考这篇博文:
古月居……[rospack] Error: package ‘learning_topic’ not found
我们可以先运行订阅者,等待发布者的运行
运行发布者后,发布者发布的信息会被订阅者接受,二者同步显示:
另外,如果开始运行后,关闭ROS Master
,并不会让话题中断,因为前者只是用于建立链接,链接建立成功后就不再起作用了,可以类比婚介所的作用
这样我们就完成了本讲的操作
本次要实现的服务模型如图所示:
在第7讲中,我们提到了ROS的两种通信模式,即话题通信和服务通信,前三讲介绍了话题通信的方式,从这一讲开始,将开始服务通信的讲解(虽然没听太懂哈哈),下面进入正题
如何实现一个客户端:
在本讲中,通过一个例子,最终创建了一只小海龟(忘了截图了xixi)
感觉操作起来和之前没有什么明显区别
本讲通过创建Server
来实现对于小乌龟的命令行控制
具体如何实现一个Server
服务器流程如下:
Server
实例具体的代码可以理解为创建了一个Server
后,一直等待Client
发送指令,但是具体我还没看太明白,主要是了解加实践
通过该实例,我们可以实现对小乌龟的命令行控制,控制效果如下:
当我们发送一个请求(触发器),小乌龟就会改变自己的运动状态,此时命令行窗口如下所示:
在这里,为了避免每次都要“引用”环境变量,我将环境变量设置进了.bashrc
里,具体的操作结果就是该文件中添加了这一行:
也就是将setup.bash
这个文件添加进去
具体如何添加,可以参照该博客:
Linux下配置环境变量—— .bashrc 和 /etc/profile
这样我们就不用每次都到根目录下运行source
指令,直接随便打开一个终端就能运行了!
这讲和第12讲是对称的,这里是服务数据的定义与使用
看到这一讲的时候,我感觉我已经蒙圈了
蒙圈归蒙圈,还是能有点收获的
我们整体的话题结构同13讲,用一句话概括这一讲我们干了啥:
怎么样去创建一个自定义的service的服务数据类型,并怎么样在server和client之间使用,以person数据信息为例,创建service数据类型
在本讲中,我们创建了一个srv
文件,内部我们自定义了服务数据
同样使用Client
和Server
作为节点,实现数据收发的效果:
这里我们创建服务器还是客户端的先后顺序没有严格要求,但要注意的是,想要重新开启新的服务器和客户端来测试,最好重新运行roscore
指令,以防程序出现一些莫名其妙的错误
看完上一讲头都要裂开了,索性直接看完再实践,发现观感出奇的好,也可能是这一讲没有那么多玄幻的东西
这一讲主要介绍了参数的相关知识,简单复习一下:
图示为参数模型,可以看到,在ROS Master
里有一个叫做参数服务器(Parameter Server
)的东西,里边包含了各个节点均可以访问的参数
而我们需要学会查看、显示、设置、保存、读取、删除某个或某些参数
这在平时使用过程中或许很有必要
同时,还会讲到如何使用.yaml
文件来存储和读取参数
在本讲中,我们创建了新的功能包learning_parameter
,使用该功能包,并通过更改小乌龟仿真器的背景颜色,来测试相关指令,学习.yaml
文件的使用
如何获取/设置参数:
这里分为使用命令行和使用.cpp文件运行两种方式
通过命令行的一些指令,我们成功实现了小乌龟背景颜色的改变,效果如下图所示:
其中用到的指令主要有以下指令:
这里所谓的“到文件”就是到刚刚提到的.yaml
文件下,我这里生成.yaml
文件内容如下:
rosdistro: 'melodic
'
roslaunch:
uris: {host_lihaha_legion_y7000_2019_pg0__33285: 'http://lihaha-Legion-Y7000-2019-PG0:33285/'}
rosversion: '1.14.10
'
run_id: dd0b45c6-4399-11eb-b7d9-287fcf1016b6
turtlesim: {background_b: 255, background_g: 255, background_r: 255}
其中保存了各个我们用到的参数,我们可以通过这个直接保存,或者给工程指定我们希望的各个参数是多少,非常有用的一个小东西
使用.cpp
文件来执行类似之前各讲的套路,在此不再赘述
从这一讲开始,介绍ROS中的常用组件
TF功能包作用:
TF坐标变换如何实现:
通过一些指令,我们来实现turtle2
对turtle2
的跟随
roslaunch命令启动一个脚本文件来启动节点,跟随结果如下图所示
可以通过指令:
rosrun tf view_frames
将当前各个坐标系的树打印为pdf,它能够记录最近机器人的一些相关数据,我打印出的pdf如下:
为了观察两个坐标系的位置关系,可以使用两种工具:命令行工具/可视化工具
命令行可以打印变换矩阵以及旋转矩阵的不同描述形式,显示效果如下:
可视化工具这里使用Rviz,显示效果如下,可以进行缩放,直观看到坐标系的位置关系:
小细节:这里的世界坐标系的原点位于小海龟界面的左下角
这一讲主要是介绍了tf坐标系的广播与监听的编程实现,最终实现功能和上一讲功能基本类似
如何实现一个tf广播器:
如何实现一个TF监听器:
这里有一个小细节,我们在创建广播器的时候,两次调用了同一个程序,但程序中默认的节点名是一样的
我们知道不同节点不能同名,所以我们需要通过指令来让节点名不同
其他的主要是看程序实现,命令行指令如下:
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
$ roscore//启动ROS Master
$ rosrun turtlesim turtlesim_node
$ rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
$ rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
$ rosrun learning_tf turtle_tf_listener
$ rosrun turtlesim turtle_teleop_key
目的:通过xml文件实现多节点的配置和启动(可自动启动ROS Master)
我们需要创建一个learning_launch
功能包,并且在里边创建一个launch
文件夹,用来存放我们要使用的所有launch文件
后者这是一种命名习惯,最好要遵守这种默认的习惯
简单介绍一下Launch语法:
:launch文件中的根元素采用
标签定义
:节点
启动节点示例:
<node pkg="package-name" type="executable-name" name="node-
name" />
参数设置:
/
重映射:
嵌套:
在本讲展示了直接使用launch
文件运行程序的几个例子,我个人感觉非常方便,只需要将相关文件及指令配置好,直接就能实现功能,不必反复使用终端和命令行!
在本讲介绍Qt工具箱、Rviz、Gazebo这三个常用可视化工具的简单介绍
包括了日志输出工具、计算图可视化工具、数据绘图工具、图像渲染工具等一系列工具
可以作为开发过程的战略指挥部
这个在17讲的时候使用过,是一款三维可视化工具
界面如图所示:
1:工具栏 2:显示项列表 3:视角设置区 4:时间显示区
Gazebo是一款功能强大的三维物理仿真平台
典型应用场景:
Gazebo操作界面如图所示:
1:工具栏 2:模型列表 3:模型属性项 4:时间显示区
终于要完结啦!
这是本课程的课程体系:
这一讲老师介绍了很多ROS开发的相关资源,从书籍到网页等等
建议没事的时候回来看看
经过这一套课程的学习,我也只是大概了解了ROS最基础的一些东西,还有浩如烟海的知识等待我们去探索
引用古月居up引用的胡适之先生的话: