ROS官方教程(中文版):http://wiki.ros.org/cn/ROS/Tutorials
ROS学习笔记系列:https://blog.csdn.net/mountzf/article/details/51931806
ROS学习之路的整理:https://blog.csdn.net/zhanshen112/article/details/82792467
古月居:http://www.guyuehome.com/
本篇的内容也参考了以上学习资料。
ROS不能再详细的安装教程16.04+kinetic:http://www.cnblogs.com/liu-fa/p/5779206.htmlu
安装过程中若是报错的话,建议用以下指令:
$ sudo apt update
$ sudo apt full-update
重新更新一遍系统后,再按照教程中的过程进行ROS的安装。
ROS(Robot Operating System)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。主要可以从以下四个方面去理解:
1.通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。
2.工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。
3.强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。
4.生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。
简单来说,ROS提供了一些开源的可调用的功能库和通信手段供我们使用。
工作空间(workspace)是ROS里面最小环境配置单位,可以把workspace看成是一个有结构的文件夹,它包含多个package以及一些结构性质文件。一次将一个workspace配置进环境变量里面,才能使用ROS命令执行与这个workspace里面的package相关的操作。
功能包(package)是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。 创建了相应的软件包才能实现相应的功能。
清单(Manifest)是对于功能包相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。 也就是 package.xml文件。
CMakeLists.txt是一个Cmake的脚本文件,Cmake是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和链接库。
节点(Node)是 ROS 功能包中的一个可执行文件,节点之间可以通过 ROS 客户端库(如roscpp 、 rospy )相互通信。一个机器人控制系统由许多节点组成,这些节点各司其职,如,一个节点控制激光距离传感器,一个节点控制轮子的马达,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的整个视图等。也就是能够执行特定工作任务的工作单元。
节点管理器(Master)是 ROS 名称服务,能够帮助节点找到彼此。节点通过与节点管理器通信来报告他们的注册信息。值得注意的是,当这些节点和节点管理器通信时,它们可以接受其他注册节点的信息,并能保持通信正常。当这些注册信息改变时,节点管理器也会回调这些节点。所以,没有节点管理器,节点将不能相互找到,也不能进行消息交换或者调用服务。
参数管理器( Parameter Server )是节点管理器的一部分,是一个可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时参数。
消息(Message)是一种ROS数据类型。一个节点向特定主题发布消息,从而将数据发送到另一个节点。消息具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型。消息与话题(发布 / 订阅模式)是紧密联系在一起的,msg文件实质上就是一个从结构上描述ROS中所使用消息类型的简单文本,描述的是消息的数据类型。
话题( Topic )是节点间用来传输数据的总线,通过主题进行消息路由不需要节点之间直接连接。节点可以发布消息到话题,也可以订阅话题以接收消息。一个话题可能对应有许多节点作为话题发布者和话题订阅者。当然,一个节点可以发布和订阅许多话题。一个节点对某一类型的数据感兴趣,它只需订阅相关话题即可。一般来说。话题发布者和话题订阅者不知道对方的存在。发布者将信息发布在一个全局的工作区内,当订阅者发现该信息是它所订阅的,就可以接收到这个信息。
当需要直接与节点通信并获得应答时,将无法通过话题来实现,而需要服务(Service)。我们可以看出,发布 / 订阅模式是一种多对多的传输方式,显然这种传输方式不适用于请求 / 回复的交互方式。请求 / 回复交互方式经常被用于分布式系统中。请求服务通过 Service 来进行,Service 被定义为一对消息结构:一个用于请求,一个用于回复。一个客户通过发送请求信息并等待响应来使用服务( ROS中的请求 / 回复交互方式类似于一个远程函数调用,srv文件类似于函数参数和返回值的定义)。
消息记录包(Bag)是一种用于保存和回放 ROS 消息数据的格式。消息记录包是检索传感器数据的重要机制,这些数据虽然很难收集,但是对于发展和测试算法很有必要。
命令 | 功能 |
---|---|
roscd | 移动到指定的ROS软件包目录 |
rosls | 显示ROS软件包的文件与目录 |
rosed | 编辑ROS软件包的文件 |
roscp | 复制ROS软件包的文件 |
rospd | 添加目录至ROS目录索引 |
rosd | 显示ROS目录索引中的目录 |
命令 | 功能 |
---|---|
roscore | 开启Master(ROS名称服务) |
rosrun | 运行单个节点 |
roslaunch | 运行多个节点及设置运行选项 |
rosclean | 检查或删除ROS日志文件 |
命令 | 功能 |
---|---|
rostopic | 查看ROS话题信息 |
rosservice | 查看ROS服务信息 |
rosnode | 查看ROS节点信息 |
rosparam | 确认和修改ROS参数信息 |
rosbag | 记录和回放ROS消息 |
rosmsg | 显示ROS消息类型 |
rossrv | 显示ROS服务类型 |
rosversion | 显示ROS功能包的版本信息 |
roswtf | 检查ROS系统 |
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
其中catkin_ws是自定义的工作空间名,也就是文件夹名。
可通过以下的命令来配置:
$ source devel/setup.bash
也可直接在.bashrc里写入:
source ~/catkin_ws/devel/setup.bash
首先切换到工作空间的src目录下:
$ cd ~/catkin_ws/src
再使用catkin_create_pkg命令来创建功能包:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
其中,beginner_tutorials是创建的功能包名,后面是该功能包依赖的三个功能包。运行完后可以看出在beginner_tutorials目录下创建了package.xml和CMakeLists.txt两个文件。
接下来对package.xml文件进行配置。package.xml文件主要由4个标签组成,分别为描述标签、维护者标签、许可证标签、依赖项标签。
<package format="2">
<name>beginner_tutorialsname>
<version>0.1.0version>
<description>The beginner_tutorials packagedescription>
<maintainer email="[email protected]">Your Namemaintainer>
<license>BSDlicense>
<url type="website">http://wiki.ros.org/beginner_tutorialsurl>
<author email="[email protected]">Jane Doeauthor>
<buildtool_depend>catkinbuildtool_depend>
<build_depend>roscppbuild_depend>
<build_depend>rospybuild_depend>
<build_depend>std_msgsbuild_depend>
<exec_depend>roscppexec_depend>
<exec_depend>rospyexec_depend>
<exec_depend>std_msgsexec_depend>
package>
在 ~/工作空间/src/功能包名 目录下,创建并编辑cpp程序文件(以hello.cpp为例)。运行如下命令:
$ cd ~/catkin_ws/src/beginner_tutorials
$ touch hello.cpp
$ gedit hello.cpp
hello.cpp代码如下:
#include
int main ( int argc , char ** argv)
{
ros::init ( argc , argv , "hello");
ros::NodeHandle nh;
ROS_INFO_STREAM( "Hello , ROS! ");
}
首先,我们需要声明程序所依赖的其他功能包。对于C++程序而言,此步骤是必要的,以确保catkin能够向C++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。
为了给出依赖库,我们需要编辑CMakeLists.txt文件。即修改find_package如下:
find_package(catkin REQUIRED COMPONENTS
#依次写上所依赖的功能包
roscpp
)
同样,我们也需要在package.xml文件中列出依赖库,由于hello程序在编译时和运行时都需要roscpp库,故将roscpp添加至build_depend(编译依赖)和exec_depend(运行依赖)。如下:
<buildtool_depend>catkinbuildtool_depend>
<build_depend>roscppbuild_depend>
<build_export_depend>roscppbuild_export_depend>
<exec_depend>roscppexec_depend>
接下来,我们需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。
第一行:
add_executable(hello hello.cpp)
其中,hello是我们想要生成的可执行文件的文件名,hello.cpp是生成此可执行文件所需的源文件列表。如果有多个源文件,把它们列在此处,并用空格将其区分开。
第二行:
target_link_libraries(hello ${catkin_LIBRARIES})
该行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中已经定义了)。
首先返回工作空间目录,然后使用catkin_make命令进行编译:
$ cd ~/catkin_ws
$ catkin_make
完成编译后,将会在工作区中创建devel(开发空间,用来放置编译生成的可执行文件)和build(编译空间,用来储存工作空间编译过程中产生的缓存信息和中间文件)两个子目录。
hello 程序是一个节点(Node),需要节点管理器才可以正常运行,启动节点管理器后,用rosrun命令运行程序:
$ roscore
$ rosrun beginner_tutorials hello
至此,完成了创建工作空间、功能包、编写、编译、运行简单的ROS程序。