ROS(Robot Operating System) Tutorial 学习记录

ROS(Robot Operating System) Tutorial 学习记录

编写: 王宇 
2018-03-31

注: 此文档仅仅是我阅读时的流水账,也因为本人英语水平有限,仅凭个人的自我理解所编写,不可避免的存在错误和偏差,请以官方原文为准。

官方教程:http://wiki.ros.org/ROS/Tutorials

Beginner Level

1. 安装配置ROS环境

安装ROS
管理环境
  • 概念 :notion of combining spaces using the shell environment
  • 检查环境
  •     $ printenv | grep ROS
  • 安装命令
  •     $ source /opt/ros/kinetic/setup.bash
创建ROS工作空间
  • Build空间
  •     $ mkdir -p ~/catkin_ws/src
  •     $ cd ~/catkin_ws
  •     $ catkin_make
  • catkin : http://wiki.ros.org/catkin
  • 设置
  •     $ source devel/setup.bash
  • 确认环境变量: $ROS_PACKAGE_PAHT 
/home/youruser/catkin_ws/src:/opt/ros/kinetic/share

2. ROS文件系统

预备
  • 安装教程预先准备的Package
  •     $ sudo apt-get install ros-<distro>-ros-tutorials
Overview 文件系统概念
  • Package : Package 组织ROS单元代码的抽象组织结构,每个Package能够包含库,可以执行文件,脚本和其他部分
  • Manifests(package.xml) : Manifest是对Package的描述,它定义Package的依赖,明确Package的元数据,像版本,License等。
文件系统工具
  • 使用 rospack - 得到Packages中的信息
  •     $ rospack find [package_name]
  • 使用 roscd - 更改目录
  •     $ roscd [locationname [/subdir]]
  • roscd log - 切换到日志目录
  •     $ roscd log
  • 使用 rosls - 查询目录
  •     $ rosls [locationname [/subdir]]
Tab 补全

3.创建ROS Package

  • Package 由什么组成的?
  1. package.xml 提供Package的元数据描述
  2. catkin使用的CMakeList.txt
  3. 每个Package必须有它自己的目录
  • 在 catkin工作空间中的Package 


  •  

  • 创建catkin Package 
使用catkin_create_pkg脚本创建 catkin Package
  •     $ cd ~/catkin_ws/src
    $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • 编译和设置
    $ cd ~/catkin_ws
    $ catkin_make
    $ . ~/catkin_ws/devel/setup.bash
  • package 依赖
  • 自定义你的Package

4. 编译ROS Package

编译 Packages
  • 使用 catkin_make - 类似于cmake make工具
  •     $ catkin_make --source my_src
    $ catkon_make install --source my_src
  • 构建你的Package
  •     $ cd ~/catkin_ws/
    $ ls src

beginner_turorials/CMakeLists.txt
    $ catkin_make

5. 理解ROS Nodes节点

预备- 同ROS文件系统
Overview Graph 概念
  • Node : 用ROS(roscore)协同其他node的可以执行体
  • Message: 当使用subscribing和publishing topic时,被使用的数据类型
  • Topics:subscribing和publishing 时的主题
  • Master:ROS的服务名
  • rosout:ROS的 stdout stderr
  • roscore: Master + rosout + parameter server
Nodes
  • ROS nodes 使用 ROS 客户端库与其他节点通讯。
  • Nodes可以发布和订阅一个主题。Node
  • Node能够提供和使用服务
客户端库

ROS客户端库允许nodes使用不同的程序语言编写,用于通讯,例如Python和C++

roscore
使用 rosnode
  • 查询Node信息
  •     $ rosnode list

       从rosout中查看内容

  • rosnode info 命令查看特定node信息
使用rosrun
    $ rosrun [package_name] [node_name]

6. 理解ROS Topics主题

启动一个例子
  • 启动 roscore
  •     $ roscore
  • 运行 turtlesim - turtlesim是package,turtlesim_node 和 turtle_turtle_teleop_key是 node
    $ rosrun turtlesim turtlesim_node
  • turtle键盘遥控
  • $ rosrun turtlesim turtle_teleop_key



 
ROS Topics

The turtlesim_node 和 turtle_teleop_key 节点使用各自的ROS Topic进行通讯。turtle_teleop_key是发布键盘消息的topic, turtlesim 订阅相同topic,去接受键盘消息。让我们使用rqt_graph(能够显示nodes和topics)去运行

  • 使用 rqt_graph 

        rqt_graph在系统中,建立一个实时动态图像。rqt_graph是rqt package的一部分。

 

  • 安装 rqt_graph
  •     $ sudo apt-get install ros-<distro>-rqt
  •     $ sudo apt-get install ros-<distro>-rqt-common-plugins
  • rqt_graph的显示效果 



 


  • 介绍rostopic 
         rostopic 工具允许你获得关于ROS topics的信息
  •     $ rostopic -h
  • 使用 Using rostopic echo 
        rostopic echo显示在topic上的被发布数据
  •     $ rostopic echo [topic]
  • 使用 rostopic list 
  •         rostopic list返回所有当前发布和订阅主题列表
  •     $ rostopic list -h
ROS Message

在nodes之间,topics上凭借发送的ROS Message去通讯。因为发布和订阅通讯,它们必须发送接收相同类型的信息。这意味着,topic类型凭借message 类型发布被定义。

  • 使用 rostopic type 
        rostopic type 返回topic发布的message类型。
  •     $ rostopic type [topic]
rostopic continued
  • 使用 rostopic pub 
        rostopic pub 发布数据给当前被公布的topic
  •     $ rostopic pub [topic] [msg_type] [args]
  • 使用rostopic hz 
         rostopic 报告被发布数据的频率。
  •     $ rostopic hz [topic]
  • 使用rqt_plot 
       rqt_plot显示一个在topic上被发布数据的实时滚动图


 

7. 理解ROS 的服务和参数

ROS 服务

服务是使node与其他node通讯的另外一种途径。服务允许node发送一个请求和接收一个回应

使用rosservice

rosservice能够轻松的使用serives附加到ROS C/S框架结构。 rosservice有许多能够使用在topics上的命令。



  

8. 使用rqt_console and roslaunch

ROS使用rqt_console 和 rqt_logger_level进行调试,使用roslaunch一次启动多个node

预备
使用rqt_console 和rqt_logger_level

rqt_console依附于ROS的日志框架,用于显示从node的输出信息。rqt_logger_level允许我去改变运行时node的调试级别(DEBUG WARN INFO ERROR)

9. 使用rosed在ROS中编辑文件

使用rosed

rosbash : http://wiki.ros.org/rosbash 
rosed是rosbash套件中的一部分。它允许你直接在package内编辑文件。

    $ rosed [package_name] [filename]
使用rosed 用 tab补全
    $ rosed [package_name] <tab><tab>
编辑器

rosed默认编辑器是vim。 更加友好的编辑器nano通过默认Ubuntu 安装时被包含。你能够通过编辑你的~/.bashr文件去使用它们。

    export EDITOR='nano -w'

10. 创建ROS msg 和 srv

介绍msg 和 srv
  • msg:msg files是描述ROS信息字段的样例文本文件。它们用于生成不同语言信息的源代码
  • srv:srv file表示一个服务。由两部分组成: a request , a response

msg files 被保存在package 的msg目录中, svr files 被保存在srv目录中

  • 字段类型 


  
在ROS还有一些特殊的类型: Hear,它包含一个时间戳和在ROS中被使用的坐标参照信息。你将在msg file中第一行频繁的看到Hearder 
例子: 


 
srv file就像msg files,除了他们包含两部分内容:request,respone。这两部分内容被“-------”行分开
使用msg
  • 创建msg 
    让我们定义一个在之前的教程被创建的package中的msg
  •     $ roscd beginner_tutorials
    $ mkdir msg
    $ echo "int64 num" > msg/Num.msg

这部分内容待续

  • 使用rosmsg
  •     $ rosmsg show [message type]
使用srv
  • 创建srv

这部分内容待续

  • 使用rossrv
  •     $ rossrv show <service type>
    $ rossrv show begineer_turoials/AddTwoInts
用于msg 和srv 常见步骤
  • 改变CMakeList.txt
获得帮助
$ rosmsg -h
$ rosmsg show -h

11. 用C++写一个Publisher和Subscriber的例子

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

12. 用Python写一个Publisher和Subscriber的例子

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29

13. 测试Publisher和Subscriber的例子

http://wiki.ros.org/ROS/Tutorials/ExaminingPublisherSubscriber

14. 用C++写一个Service 和 Client的例子

http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29

15. 用Python写一个Service和Client的例子

http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28python%29

16. 测试Service和Client的例子

http://wiki.ros.org/ROS/Tutorials/ExaminingServiceClient

17. 记录和播放数据

记录数据-创建一个bag 文件
  • 启动roscore,运行两个node,一个是显示乌龟,一个是键盘操作
  1. Terminal1 : $ roscore
  2. Terminal2 : $ rosrun turtlesim turtlesim_node
  3. Terminal3 : $ rosrun turtlesim tutle_teleop_key
  • 记录所有的 publisher topics
  •     $ mkdir ~/bagfiles
    $ cd ~/bagfiles
    $ rosbag record -a
测试和播放bag file
    $ rosbag info <your bagfile>
记录数据的子集
    $ rosbag record -O subset /turtle1/cmd_vel /turtle1/pose
rosbag 记录播放限制-(没搞懂)

18. 用roswtf开始

roswtf: 诊断ROS运行时错误的工具 
http://wiki.ros.org/roswtf

19. 导航ROS wiki

总结



 

此文档的PDF版本下载

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器人操作系统 ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。 ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步RPC(远程过程调用)通讯、基于Topic的异步数据流通讯,还有参数服务器上的数据存储。 1 发展目标 2 ROS的概念 2.1 ROS 的 Filesystem Level 2.2 ROS 的 Computation Graph Level 3 参考文献 4 外部链接 发展目标 ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。 为了实现“共享与协作”这一首要目标,人们制订了ROS架构中的其他支援性目标: “轻便”:ROS是设计得尽可能方便简易。您不必替换主框架与系统,因为ROS编写的代码可以用于其他机器人软件框架中。毫无疑问的,ROS更易于集成与其他机器人软件框架。事实上ROS已完成与OpenRAVE、Orocos和Player的整合。 ROS-agnostic库:【agnostic:不可知论】建议的开发模型是使用clear的函数接口书写ROS-agnostic库。 语言独立性:ROS框架很容易在任何编程语言中执行。我们已经能在PythonC++中顺利运行,同时添加有Lisp、Octave和Java语言库。 测试简单:ROS有一个内建的单元/组合集测试框架,称为“rostest”。这使得集成调试和分解调试很容易。 扩展性:ROS适合于大型实时系统与大型的系统开发项目。 ROS的概念 ROS有三个层次的概念:分别为Filesystem level,Computation graph level, 以及Communication level。 以下内容具体的总结了这些层次及概念。除了这三个层次的概念, ROS也定义了两种名称-- Package资源名称和Graph资源名称。同样会在以下内容中提及。 ROS 的 Filesystem Level 文件系统层概念就是你在碟片里面遇到的资源,例如: Packages:ROS的基本组织,可以包含任意格式文件。一个Package 可以包含ROS执行时处理的文件(nodes),一个ROS的依赖库,一个数据集合,配置文件或一些有用的文件在一起。 Manifests:Manifests (manifest.xml) 提供关于Package元数据,包括它的许可信息和Package之间依赖关系,以及语言特性信息像编译旗帜(编译优化参数)。 Stacks: Stacks 是Packages的集合,它提供一个完整的功能,像“navigation stack” Stack与版本号关联,同时也是如何发行ROS软件方式的关键。 Manifest Stack Manifests: Stack manifests (stack.xml) 提供关于Stack元数据,包括它的许可信息和Stack之间依赖关系。 Message (msg) types: 信息描述, 位置在路径:my_package/msg/MyMessageType.msg, 定义数据类型在ROS的 messages ROS里面。 Service (srv) types: 服务描述,位置在路径:my_package/srv/MyServiceType.srv, 定义这个请求和相应的数据结构 在ROS services 里面。 ROS 的 Computation Graph Level Computation Graph Level(计算图)就是用ROS的P2P(peer-to-peer网络传输协议)网络集中处理所有的数据。基本的Computation Graph的概念包括Node, Master, Parameter Sever,messages, services, topics, 和bags, 以上所有的这些都以不同的方式给Graph传输数据。 Nodes: Nodes(节点)是一系列运行中的程序。ROS被设计成在一定颗粒度下的模块化系统。一个机器人控制系统通常包含许多Nodes。比如一个Node控制激光雷达,一个Node控制车轮马达,一个Node处理定位,一个Node执行路径规划,另外一个提供图形化界面等等。一个ROS节点是由Libraries ROS client library写成的, 例如 roscpp 和 rospy. Master: ROS Master 提供了登记列表和对其他计算图的查找。没有Master,节点将无法找到其他节点,交换消息或调用服务。 Server Parameter Server: 参数服务器使数据按照钥匙的方式存储。目前,参数服务器是主持的组成部分。 Messages:节点之间通过messages来传递消息。一个message是一个简单的数据结构,包含一些归类定义的区。支持标准的原始数据类型(整数、浮点数、布尔数,等)和原始数组类型。message可以包含任意的嵌套结构和数组(很类似于C语言的结构structs) Topics: Messages以一种发布/订阅的方式传递。一个node可以在一个给定的topic中发布消息。Topic是一个name被用于描述消息内容。一个node针对某个topic关注与订阅特定类型的数据。可能同时有多个node发布或者订阅同一个topic的消息;也可能有一个topic同时发布或订阅多个topic。总体上,发布者和订阅者不了解彼此的存在。主要的概念在于将信息的发布者和需求者解耦、分离。逻辑上,topic可以看作是一个严格规范化的消息bus。每个bus有一个名字,每个node都可以连接到bus发送和接受符合标准类型的消息。 Services:发布/订阅模型是很灵活的通讯模式,但是多对多,单向传输对于分布式系统中经常需要的“请求/回应”式的交互来说并不合适。因此,“请求/回应” 是通过services来实现的。这种通讯的定义是一种成对的消息:一个用于请求,一个用于回应。假设一个节点提供了一个服务提供下一个name和客户使用服务发送请求消息并等待答复。ROS的客户库通常以一种远程调用的方式提供这样的交互。 Bags: Bags是一种格式,用于存储和播放ROS消息。对于储存数据来说Bags是一种很重要的机制。例如传感器数据很难收集但却是开发与测试中必须的。 在ROS的计算图中,ROS的Master以一个name service的方式工作。它给ROS的节点存储了topics和service的注册信息。Nodes 与Master通信从而报告它们的注册信息。当这些节点与master通信的时候,它们可以接收关于其他以注册节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时Master也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。 节点之间的连接是直接的; Master仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个topic将会要求建立一个与发布该topics的节点的连接,并且将会在同意连接协议的基础上建立该连接。ROS里面使用最广的连接协议是TCPROS,这个协议使用标准的TCP/IP 接口。 这样的架构允许脱钩工作(decoupled operation),通过这种方式大型或是更为复杂的系统得以建立,其中names方式是一种行之有效的手段。names方式在ROS系统中扮演极为重要的角色: topics, services, and parameters 都有各自的names。每一个ROS客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行。 例如,为了控制一个北阳激光测距仪(Hokuyo laser range-finder),我们可以启动这个hokuyo_node 驱动,这个驱动可以给与激光仪进行对话并且在"扫描"topic下可以发布sensor_msgs/LaserScan 的信息。为了处理数据,我们也许会写一个使用laser_filters的node来订阅"扫描"topic的信息。订阅之后,我们的过滤器将会自动开始接收激光仪的信息。 注意两边是如何脱钩工作的。 所有的hokuyo_node的节点都会完成发布"扫描",不需要知道是否有节点被订阅了。所有的过滤器都会完成"扫描"的订阅,不论知道还是不知道是否有节点在发布"扫描"。 在不引发任何错误的情况下,这两个nodes可以任何的顺序启动,终止,或者重启。 以后我们也许会给我们的机器人加入另外一个激光器,这会导致我们重新设置我们的系统。我们所需要做的就是重新映射已经使用过的names。当我们开始我们的第一个hokuyo_node时,我们可以说它用base_scan代替了映射扫描,并且和我们的过滤器节点做相同的事。现在,这些节点将会用base_scan的topic来通信从而代替,并且将不再监听"扫描"topic的信息。然后我们就可以为我们的新激光测距仪启动另外一个hokuyo_node。 参考文献 http://www.ros.org/wiki/ros http://bbs.axnzero.com/index.php http://blog.sina.com.cn/digital2image2processing
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值