Ros基础

  1. 学习资料推荐
    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/
    本篇的内容也参考了以上学习资料。

  2. ROS的安装
    ROS不能再详细的安装教程16.04+kinetic:http://www.cnblogs.com/liu-fa/p/5779206.htmlu
    安装过程中若是报错的话,建议用以下指令:

  sudo apt update
  sudo apt full-update

重新更新一遍系统后,再按照教程中的过程进行ROS的安装。

  1. 基本概念
    3.1 ROS
    ROS(Robot Operating System)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。主要可以从以下四个方面去理解:

1.通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。

2.工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。

3.强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。

4.生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。

简单来说,ROS提供了一些开源的可调用的功能库和通信手段供我们使用。

3.2 工作空间
工作空间(workspace)是ROS里面最小环境配置单位,可以把workspace看成是一个有结构的文件夹,它包含多个package以及一些结构性质文件。一次将一个workspace配置进环境变量里面,才能使用ROS命令执行与这个workspace里面的package相关的操作。

3.3 功能包
功能包(package)是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。 创建了相应的软件包才能实现相应的功能。

3.4 清单
清单(Manifest)是对于功能包相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。 也就是 package.xml文件。

3.5 脚本文件
CMakeLists.txt是一个Cmake的脚本文件,Cmake是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和链接库。

3.6 节点
节点(Node)是 ROS 功能包中的一个可执行文件,节点之间可以通过 ROS 客户端库(如roscpp 、 rospy )相互通信。一个机器人控制系统由许多节点组成,这些节点各司其职,如,一个节点控制激光距离传感器,一个节点控制轮子的马达,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的整个视图等。也就是能够执行特定工作任务的工作单元。

3.7 节点管理器
节点管理器(Master)是 ROS 名称服务,能够帮助节点找到彼此。节点通过与节点管理器通信来报告他们的注册信息。值得注意的是,当这些节点和节点管理器通信时,它们可以接受其他注册节点的信息,并能保持通信正常。当这些注册信息改变时,节点管理器也会回调这些节点。所以,没有节点管理器,节点将不能相互找到,也不能进行消息交换或者调用服务。

3.8 参数管理器
参数管理器( Parameter Server )是节点管理器的一部分,是一个可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时参数。

3.9 消息
消息(Message)是一种ROS数据类型。一个节点向特定主题发布消息,从而将数据发送到另一个节点。消息具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型。消息与话题(发布 / 订阅模式)是紧密联系在一起的,msg文件实质上就是一个从结构上描述ROS中所使用消息类型的简单文本,描述的是消息的数据类型。

3.10 话题
话题( Topic )是节点间用来传输数据的总线,通过主题进行消息路由不需要节点之间直接连接。节点可以发布消息到话题,也可以订阅话题以接收消息。一个话题可能对应有许多节点作为话题发布者和话题订阅者。当然,一个节点可以发布和订阅许多话题。一个节点对某一类型的数据感兴趣,它只需订阅相关话题即可。一般来说。话题发布者和话题订阅者不知道对方的存在。发布者将信息发布在一个全局的工作区内,当订阅者发现该信息是它所订阅的,就可以接收到这个信息。

3.11 服务
当需要直接与节点通信并获得应答时,将无法通过话题来实现,而需要服务(Service)。我们可以看出,发布 / 订阅模式是一种多对多的传输方式,显然这种传输方式不适用于请求 / 回复的交互方式。请求 / 回复交互方式经常被用于分布式系统中。请求服务通过 Service 来进行,Service 被定义为一对消息结构:一个用于请求,一个用于回复。一个客户通过发送请求信息并等待响应来使用服务( ROS中的请求 / 回复交互方式类似于一个远程函数调用,srv文件类似于函数参数和返回值的定义)。

3.12 消息记录包
消息记录包(Bag)是一种用于保存和回放 ROS 消息数据的格式。消息记录包是检索传感器数据的重要机制,这些数据虽然很难收集,但是对于发展和测试算法很有必要。

  1. 常用命令
    4.1 ROS Shell命令
    命令 功能
    roscd 移动到指定的ROS软件包目录
    rosls 显示ROS软件包的文件与目录
    rosed 编辑ROS软件包的文件
    roscp 复制ROS软件包的文件
    rospd 添加目录至ROS目录索引
    rosd 显示ROS目录索引中的目录
    roscd [功能包名称] 。使用它,无需再使用cd一层层到查找,进入功能包里。
    rosls [功能包名称] 。等价与roscd+ls。查看ROS功能包的文件列表更方便,快捷。
    rosed[功能包名称][文件名称]。 用于编辑功能包中的特定文件,优点也是快捷,修改容易。
    4.2 ROS执行命令
    命令 功能
    roscore 开启Master(ROS名称服务)
    rosrun 运行单个节点
    roslaunch 运行多个节点及设置运行选项
    rosclean 检查或删除ROS日志文件
    roscore [选项]。运行主节点,主节点管理节点之间的消息通信中的连接信息。关于主节点的具体作用就不累述了。
    rosrun [功能包名称] [节点名称]。执行指定的功能包中的一个节点的命令(rosrun rqt_graph rqt_graph 可查看当前系统的运行情况)。
    roslaunch [功能包名称] [launch文件名]。 类似dat批命令,是运行指定功能包中一个或设置执行选项的命令。
    rosclean [选项]。运行roscore时,对所有节点的记录都会写入日志文件,随着时间的推移,需要定期使用rosclean命令删除这些记录.
    4.3 ROS信息命令
    命令 功能
    rostopic 查看ROS话题信息
    rosservice 查看ROS服务信息
    rosnode 查看ROS节点信息
    rosparam 确认和修改ROS参数信息
    rosbag 记录和回放ROS消息
    rosmsg 显示ROS消息类型
    rossrv 显示ROS服务类型
    rosversion 显示ROS功能包的版本信息
    roswtf 检查ROS系统
    rostopic [选项]
    list - 列出活动话题
    echo [话题名称] - 实时显示指定话题的消息内容
    find [类型名称] - 显示使用指定类型的消息的话题
    type [话题名称] - 显示指定话题的消息类型
    bw [话题名称] - 显示指定话题的消息类型
    hz [话题名称] - 显示指定话题的消息数据发布周期
    info [话题名称] - 显示指定话题的消息
    pub [话题名称] [消息类型] [参数] - 用指定的话题名称发布消息,许多时候另开一个终端操作 例:rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]”[0.0, 0.0, 0.0]’
    rosservice [选项]
    list - 显示活动的服务信息
    info [服务名称] - 显示指定服务的信息
    type [服务名称] - 显示服务类型
    find [服务类型] - 查找指定服务类型的服务
    uri [服务名称] - 显示ROSRPC URI服务
    args [服务名称] - 显示服务参数
    call [服务名称] [参数] - 用输入的参数请求服务,通常用于测试服务
    rosnode [选项]
    list - 查看活动的节点列表
    ping [节点名称] - 与指定的节点进行连接测试
    info [节点名称] - 查看指定节点的信息
    machine [PC名称或IP] - 查看该PC中运行的节点列表
    kill [节点名称] - 停止指定节点的运行
    cleanup - 删除失连节点的注册信息
    rosparam [参数]
    list - 查看参数列表
    get [参数名称] - 获取参数值
    set [参数名称] - 设置参数值
    dump [文件名称] - 将参数保存到指定文件
    load [文件名称] - 获取保存在指定文件中的参数,经常使用。
    delete [参数名称] - 删除参数
    rosmsg [参数]
    list - 显示所有消息
    show [消息名称] - 显示指定消息
    md5 [消息名称] - 显示md5sum
    package [功能包名称] - 显示用于指定功能包的所有消息
    packages - 显示使用消息的所有功能包
    rossrv [参数]
    list -显示所以服务
    show [服务名称] - 显示指定的服务信息
    md5 [服务名称] - 显示md5sum
    package [功能包名称] - 显示指定的功能包中用到的所有服务
    packages - 显示使用服务的所有功能包
    rosbag [参数]
    record [选项] [话题名称] - 将指定话题的消息记录到bag文件
    info [文件名称] - 查看bag文件的信息
    play [文件名称] - 回放指定的bag文件,这个使用玩的也多。
    compress [文件名称] - 压缩指定的bag文件
    decompress [文件名称] - 解压指定的bag文件
    filter [输入文件] [输出文件] [选项] - 生成一个删除了指定内容的新的bag文件
    reindex bag [文件名称] - 刷新索引
    check bag [文件名称] - 检查指定的bag文件是否能在当前系统中回放
    fix [输入文件] [输出文件] [选项] - 将由于版本不同而无法回放的bag文件修改可以回放的文件
    4.4 ROS catkin命令
    catkin_create_pkg - 自动生成功能包(示例命令:catkin_create_pkg [功能包名称] [依赖性功能包1] [依赖性功能包2]….)。
    catkin_make - 基于catkin构建系统的构建 (示例:catkin_make –pkg [包名] 只构建一部分功能包)。
    catkin_eclipse - 对于用catkin构建系统生成的功能包进行修改,使其能在Eclipse环境中使用。
    catkin_prepare_release - 在发布时用到的日志整理和版本标记。
    catkin_generate_changelog - 在发布时生成或更新CHANGLOG.rst文件。
    catkin_init_workspace - 初始化catkin构建系统的工作目录。
    catkin_find - 搜素catkin,找到并显示工作空间。
    4.5 ROS功能包命令
    rospack [选项] [功能包名称] - 查看与ROS功能包相关的信息(可以使用find, list, depend-on, depends和profile等选项)。
    rosinstall - 安装ROS附加功能包。
    rosdep [选项] - 安装该功能包的依赖性文件(check, install, init, update)。
    roslocate [选项] [功能包名称] - ROS功能包信息相关命令(可用的选项是info, vcs, type, uri和repo等)。
  2. 基本操作
    5.1 创建ROS工作空间
    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws/
    catkin_make

其中catkin_ws是自定义的工作空间名,也就是文件夹名。

5.2 将工作空间配置进环境变量
可通过以下的命令来配置:

  source devel/setup.bash

也可直接在.bashrc里写入:

source ~/catkin_ws/devel/setup.bash

5.3 创建一个功能包
首先切换到工作空间的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两个文件。

5.4 配置package.xml文件
接下来对package.xml文件进行配置。package.xml文件主要由4个标签组成,分别为描述标签、维护者标签、许可证标签、依赖项标签。

<?xml version="1.0"?>
<package format="2">
  <name>beginner_tutorials</name>
  <version>0.1.0</version>
  <description>The beginner_tutorials package</description>

  <maintainer email="you@yourdomain.tld">Your Name</maintainer>
  <license>BSD</license>
  <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  <author email="you@yourdomain.tld">Jane Doe</author>

  <buildtool_depend>catkin</buildtool_depend>

  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>

  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

</package>

5.5 编写ROS程序
在 ~/工作空间/src/功能包名 目录下,创建并编辑cpp程序文件(以hello.cpp为例)。运行如下命令:

  cd ~/catkin_ws/src/beginner_tutorials
  touch hello.cpp
  gedit hello.cpp

hello.cpp代码如下:

#include <ros/ros.h>

int main ( int argc , char ** argv)
{
  ros::init ( argc , argv , "hello");
  ros::NodeHandle nh;
  ROS_INFO_STREAM( "Hello , ROS! ");
}

5.6 编译ROS程序
5.6.1 声明依赖库
首先,我们需要声明程序所依赖的其他功能包。对于C++程序而言,此步骤是必要的,以确保catkin能够向C++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。
为了给出依赖库,我们需要编辑CMakeLists.txt文件。即修改find_package如下:

find_package(catkin REQUIRED COMPONENTS
 依次写上所依赖的功能包
  roscpp
)

同样,我们也需要在package.xml文件中列出依赖库,由于hello程序在编译时和运行时都需要roscpp库,故将roscpp添加至build_depend(编译依赖)和exec_depend(运行依赖)。如下:

<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_export_depend>roscpp</build_export_depend>
<exec_depend>roscpp</exec_depend>

5.6.2 声明可执行文件
接下来,我们需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。
第一行:

add_executable(hello hello.cpp)

其中,hello是我们想要生成的可执行文件的文件名,hello.cpp是生成此可执行文件所需的源文件列表。如果有多个源文件,把它们列在此处,并用空格将其区分开。
第二行:

target_link_libraries(hello ${catkin_LIBRARIES})

该行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中已经定义了)。

5.6.3 编译工作区
首先返回工作空间目录,然后使用catkin_make命令进行编译:

  cd ~/catkin_ws
  catkin_make

完成编译后,将会在工作区中创建devel(开发空间,用来放置编译生成的可执行文件)和build(编译空间,用来储存工作空间编译过程中产生的缓存信息和中间文件)两个子目录。

5.7 运行ROS程序
hello 程序是一个节点(Node),需要节点管理器才可以正常运行,启动节点管理器后,用rosrun命令运行程序:

  roscore
  rosrun beginner_tutorials hello

至此,完成了创建工作空间、功能包、编写、编译、运行简单的ROS程序。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 1. ROS 开发环境 1.1 安装 ROS Installation: http://wiki.ros.org/...
    _49_阅读 603评论 0 0
  • 需要一个人有强大的上进心、克制力、自律。克制自己的欲望,希望自己能做到"精进"。 话题编程 创建发布者 创建订阅者...
    徐凯_xp阅读 1,248评论 0 1
  • 工作空间 典型的目录空间:1.代码空间src;2.编译空间build;3.开发空间devel;4.安装空间inst...
    Hz_5c60阅读 186评论 0 0
  • 在寒假开始之前,我们已经下载了ROS系统,并且了解了一部分ROS的工作机制和基础框架,现在我们从问题出发,重新开始...
    暗夜比邻星_f19b阅读 1,183评论 0 0
  • 1. ROS 包/package ros的包(package)指的是一个完整的程序功能模块,一个package可以...
    北方的花姑娘阅读 516评论 0 0