A. ROS(机器人操作系统)
现在还只是个草稿,后面会陆续更新改正,保证大家一看就会,绝对不废
只是帮助大家理解,很多知识点只是类比推理,是有错误的,哈哈,勿喷
蛮多人在学习ROS的时候,其实还是不太理解什么是ROS,为什么要去ROS,以及怎么样去学习ROS,我大二的时候开始接触到ROS,也经历过比较痛苦的一段时间,所以希望用这篇文章来帮助大家对ROS有一个较好的理解。
首先我们抛开ROS来说,如果我们要写一个程序,程序需要完成特定的功能,就拿C语言中的加法函数来说吧。我们定义了一个加法函数,输入两个整数最后返回两个整数的和,然后定义完函数以后,在main()函数里调用这个加法函数,就可以在键盘上输入两个整数,然后计算两个整数的和了。
那么问题来了 如果我要在别的程序需要使用加法函数所返回的值,应该怎么做呢?
一种方式 定义一个全局变量,将加法函数返回的值赋给这个全局变量,那么在一个工程文件下的程序都可以使用这个全局变量了,这就达到了其他程序使用这个变量的目的了
那么问题又来了,如果不是在同一个工程目录下的程序,要怎么样才能使用到这个加法函数的返回值呢?
一种方式 将第一个程序的加法返回值写到一个文档中,然后其他程序去读这个文件,这样也可以达到使用这个数据的目的了
上面的例子,想给大家传递的知识点就是 我们在写程序的时候,大多数人是只有一个main()函数的,也就是只有一个可执行文件,那么问题就来了,要是不同的main()函数之间需要相互使用对方的数据,那应该怎么办呢,这就引申出了程序与程序之间到交流问题,也就是通信问题。这也是ROS里面我个人觉得必须首先要搞清楚的问题。大家先理解到这个地方,然后往下看。
开始进入主题 到底什么是ROS,ROS就是Robot Operating System 的缩写,这大家都知道,对吧,翻译成中文也就是机器人操作系统,可是除了这个大家对操作系统是什么大家有了解过么,为什么需要操作系统,也就是操作系统能干什么,大家有简单的了解过么
操作系统(先空白,后面再填坑)
在了解操作系统以后,我们就可以开始分析我们的机器人操作系统了,话不多说,先放狗,不不不,先放图:
我们知道,操作系统本身也是一个软件,但是他的特殊之处在于能够完成对硬件的调配,而其他的应用软件,比如网易云,他如果想放歌,他需要打开播放器,是得需要操作系统去完成的,它本身没有这个能力去直接打开播放器,而是对操作系统说,大哥,能不能帮我打开一下播放器,求求你了,哈哈。
我们也知道,在win上安装了许许多多的软件,向上面的solidworks(三维制图软件),matalab(数据计算软件) QQ(聊天软件) 网易云 (听歌软件) 腾讯视频(播放软件)......
那么问题又来了 你能让你的扣扣去跟网易云说 我想听歌,然后网易云就会打开播放么,当然你要是杠杆定理学得好,那我认了,哈哈,大多数人是应该是觉得这应该不可以,因为扣扣怎么跟网易云通信嘛,对吧。
所以我们安装在win上的各个软件只负责自己的问题,不会跟其他的软件有过多的交流。
哈哈,所以我有了一个大胆的想法,让我的电脑同时登录3个扣扣,那么这三个扣扣总该可以相互发消息了吧,没错,这就是我想要讲的东西,我只在我的电脑上安装三个软件 也就是3个扣扣软件,他们肯定是可以相互交流的。因为他们是同一类软件。
是的,ROS也是这么干的,在ROS上也安装了向扣扣这样的可执行程序,只不过在ROS中换了个说法,可执行程序叫做节点,这应该不拿理解吧。要记住在ROS上安装了许许多多的软件哦,也就是许许多多的可执行程序,也就是许许多多的节点,如果你现在理解了节点是什么了,那么恭喜你,已经迈出了一小步了,你说巧不巧,安装在ROS上的这些程序,它还可以相互通信,也就是相互交流,哈哈。
好了,理解到这一步呢就理解了节点是个什么东西了。
下面又开始了一个新的例子,我们的手机上有一个扣扣,我们需要和其他人聊天对吧,那么你知道你要和别人聊天需要先做什么么,你肯定说,登录账号加好友啊,不对的,首先要做的就是把腾讯的服务器打开,不然你登录不上去的,也就是说,腾讯的服务器不打开,你是登录不上扣扣的,只不过这一步不是我们操作的,人家的服务器他已经给我门打开了,然后我们再登录扣扣,想一下,我们在登录的时候,做了什么,对吧,大家都知道,我们也就是输入账号密码就可以登录了吧对吧,这个过程呢就是向腾讯的服务器注册自己的信息,告诉腾讯服务器,我上线了,然后腾讯服务器就把你加入到注册表中,里面包含了你的一些信息,你想要和别人连天,那么别人是不是也要跟你一样,也要先登录,过程和你的一样,所以这个时候,腾讯服务器那边是已经有了你和你想要聊天的对象的一些信息的,比如ip地址之类的东西,这样,你想发消息给你的朋友(后面再填坑)
类比一下 服务器 就相当于ROS里面的ros master
只不过这个rosmaster需要我们自己开启而已。
事实上,ros并不是一个操作系统,他并不能直接运行在硬件之上,只不过他把硬件做了一个给操作系统的接口 和网易云一样 网易云大不了就使用一个喇叭呗,只不过ros使用了太多的硬件,比如激光雷达,相机,编码器,imu等等。
因此ROS本身也就是一个软件,和qq一样,运行在操作系统之上,所不同的是,在ROS上又可以安装许许多多的同类软件,这些安装在ROS上的程序(节点)之间可以按照ROS所规定的通讯机制进行相互交流通讯。比如激光雷达节点(程序)通过ROS提供的接口,让操作系统把激光数据传上来,交给建图所需要的Gmapping节点使用,然后Gmaping节点把所构建的地图给move_base节点使用,move_base节点的输入是一个速度和角度的命令,先由move_base下发给ros,然后ros下发给操作系统,然后操作系统调用硬件,在这里是电机,让电机按照ROS下发的速度的角速度进行运动.
大家应该会有一点点理解了吧
总结下 就是ros是一个类似于win上的一个软件,但是这个软件上又安装了很多软件,在ros上安装的这些软件可以相互通信,然后可以借助ROS,去调用操作系统去调用硬件。
这就是为什么我们每次想要聊天的时候,需要先打开qq这个软件,也就是我们想要用ROS的时候,先运行roscore这个命令打开ROS了吧
接下来是
ros中的通讯方式
ros中的一些工具
ros中的一些已经有了的功能包(算法)
慢慢写,不着急
B. ROS_安装一个第三方仿真软件包——机器人模拟世界
安装依赖:
过程图:
注意:以上命令非常重要,缺少依赖将导致软件包无法正常编译和运行。
在开始编译之前,需要确保Gazebo在7.0版本以上
接着回到catkin_ws下编译:
过程图:
过程图:
首先需要解决一个问题,不然待会儿运行时会闪退:
下面是运行过程图(是的,一开始可能会遇到一个报错 [robot_spawn.launch] is neither a launch file in package [robot_sim_demo] nor is [robot_sim_demo] a launch file name The traceback for the exception was written to the log file ,然而下面的过程图已经是从报错到解决报错成功运行的过程了):
再打开一个终端,输入以下命令,用键盘控制机器人移动,聚焦控制程序窗口,按下i、j、l等按键,控制机器人移动:
过程图如下,记得运行前要刷新环境,或者用上面的方法把刷新命令添加到脚本:
呐,对比上图,我把它移到了简介牌的右边:
C. 如何使用 sdk交叉编译ros
使用ros_qtc_plugin插件新建项目
使用插件新建项目Import ROS
Workspace选项仅新建工作空间导入现工作空间新建文件ROS面Package、Basic
Node等选项创建package节点、launch文件、urdf文件等
现我创建新catkin工作空间,并且面创建package
1、新建项目
文件——新建文件或项目选择Import ROS Workspace——choose图
填写catkin工作空间名字位置图
我Namecatkin工作空间文件夹名字相同(同)名catkin_new选择浏览——创建文件夹创建名catkin_new文件夹图按车再选择打
现框询问新建工作空间未初始化否执行初始化我选择yes
相于执行catkin_init_workspace命令使工作空间初始化
点击Generate Project File再点击步
项目管理步骤配置版本控制系统我选择完图
建工作空间catkin_new空图
2、创建package
接我工作空间创建新package
catkin_new面src右键单击选择添加新文件图
选择ROS——package——choose
填写package名字test1
填写作者(Authors)维护者(Maintainers)Qt环境部没配置文支持请要用文否则新建package或者新建package面package.xml空文件
DependenciesCatkin栏填写依赖通用C++写节点需要添加roscpp依赖
图
点击完
3、添加新节点
目前package空没任何节点
我test1src文件夹右键单击选择添加新文件
选择ROS——Basic Node——choose创建节点新建.cpp文件
节点名称写node1则名node1.cpp源文件
用ROS模板新建node1.cpp源文件图自Hello World程序
4、编译节点
让编译执行文件我需要编辑test1makefile图
test1CMakeLists.txt加面几行意思node1.cpp编译名node1节点
add_executable(node1 src/node1.cpp)
target_link_libraries(node1
${catkin_LIBRARIES}
)
D. ROS 工作空间、package 及 catkin 编译系统
本文内容都可以在 ROS 官网 wiki ( http://wiki.ros.org/ROS/Tutorials )中找到,作者只是根据自己的理解重新阐述了其中的某些内容,或许能帮助读者更好的理解 ROS 系统中的一些概念。首先保证 ROS 已经正确安装了。安装方式可以参考 本博客的另一篇文章 。
简单地说,ROS workspace (工作空间)就是统一存放 ROS 文件的地方,比如一个项目的所有 ROS 文件最好都放在一个 workspace 中,便于统一管理、编译和调用。
catkin 是目前 ROS 的编译系统,自 ROS Groovy 版本开始使用,取代了之前的 rosbuild 编译系统。
ROS workspace 中可以包含若干 ROS package,每个 package 内部包含实现某些特定功能的文件。
其中,~ 表示当前用户的 home 目录, -p (parent)参数可以创建某个文件夹和它的父文件夹,也就是两层的路径。这里 workspace 的名字是 catkin_ws,这个名字可以按照自己项目的内容设定,但是 src 这个文件夹的名字是固定的。
初始化工作空间。这里 src 就是以后存放 ROS 源文件的地方。上述命令之后,会在 src 目录下产生 CMakeLists.txt 文件,这实际上是一个链接到ROS 安装目录下的 /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake 一个超链接文件,对工作空间做了一些初始设置。不用去管它,也不要随便修改它。
会一次性编译 src 文件夹中的所有源文件,同时生成 devel 和 build 两个文件夹。
实际上,catkin_make 这个命令并没有特别神奇的地方,它只是把一系列基本的编译命令整合在了一起,一个 catkin_make 命令相当于如下的一系列命令:
如果要深入研究 catkin_make 编译方式,可以参考 这篇文章 。
将 workspace 的信息载入系统环境变量。
这种方法载入的信息只对当前 terminal 有效。新开一个 terminal 就无效了。如果要对每个 terminal 都有效,可以将上述命令写入用户 home 路径下的 .bashrc 文件中:
注意,.bashrc 文件是隐藏文件,在 home 路径下通过命令
命令可以看到。
还要注意, >> 是将 echo 后边的内容写入文件的尾部,如果用 > 则要覆盖原文件,一定不要搞错。
编译之后,由于我们只是一个空的 workspace,还没有任何 package,所以没有什么实质性的东西,只是告诉系统这里有个 ROS workspace,算是在系统中注册了一下。
package 是组织 ROS 文件的基本单元,一般来说,每个 package 完成一些特定功能。
package 中至少包含两个文件: package.xml 和 CMakeLists.txt.
package 在 workspace 中的存放结构一般如下:
也可采用其他的结构,但是要注意 package 之间不能嵌套,也就是在一个 package 中,不能再创建另一个 package ,所有 package 都必须是相对独立的目录。
用 catkin 创建 package 的过程很简单,用如下命令:
其中 depend 为依赖的其他 package。这样创建之后,package 中的 CMakeLists.txt 和 package.xml 中会体现出这种依赖关系。创建时也可以不指明依赖关系,在后续编译 package 的时候再补上。
创建好了 package,就可以使用 rospack 相关的命令进行查找、进入等操作了。不过,有时会有延迟,可以用命令
或者
查找、更新一下。
上述方式创建了 ROS package,然后就可以在其中编写 源文件了,可用的语言主要是 c++, python,我们现在的项目中还用到了 Julia。这里就不再细述具体的源文件编写过程了。
创建好了源文件,如果是 c++ 编写的,要编译一下。这里要设置好 package.xml 和 CMakeLists.txt 中的信息。如果依赖的 package 已经设置好了,就不需要修改 package.xml 了,只需要在 CMakeLists.txt 中添加源文件对应的编译信息如下:
实际上在 CMakeLists.txt 中有非常全面的模板,很容易找到在哪里添加这些编译文件信息。
设置好了编译信息,就可以回到 workspace 的 src 所在文件夹中,用如下命令编译:
该命令可以一次性编译 src 中的所有 package。如果只想编译指定的 package,可以用如下命令:
但是,这个命令似乎有时不太管用,根据我们的实际经验,最有效的方法是用如下的 whitelist 命令:
这样就是只编译 package1 和 package2。但是要注意,该命令中的 whitelist 具有记忆功能。用完该命令之后,下次如果要编译 src 中所有的 package,如果只用 catkin_make,则还是只编译 whitelist 中的 package,需要用如下命令清除一下 whitelist
以上就是我们使用 ROS 中的一些基本操作,希望其中的一些内容对读者有帮助。
Written by SH
Revised by QP