ROS学习需要看的网络教程_整理

来源:互联网 发布:成都生活家装饰 知乎 编辑:程序博客网 时间:2024/04/30 09:09

官方wiki,主要资料

    tips:在官方链接地址栏加入cn,有些页面会进入中文翻译之后的界面,部分如此;尽量看原版英文的。
            如http://wiki.ros.org/cn/ROS/Installation

    ROS安装教程:http://wiki.ros.org/ROS/Installation   介绍ROS的安装

    ROS核心知识系列:http://wiki.ros.org/ROS/Tutorials  主要介绍ros相关的很多概念,理解ROS的架构

    ROS cpp包的讲解:http://wiki.ros.org/roscpp_tutorials  主要介绍ros c++编程的一些知识,如何编写节点,如何编译..
             http://wiki.ros.org/roscpp/Overview   主要介绍ros c++下的一些主题,比如节点,消息,服务...这部分要好好看


    ROS python包的讲解: http://wiki.ros.org/rospy_tutorials 主要介绍ros python的一些知识

API Doc链接


    节点句柄类(NodeHandle)成员函数相关使用API : http://docs.ros.org/api/roscpp/html/classros_1_1NodeHandle.html


博客资料

    古月居的一篇博客(2013-04-16 21:56): http://blog.csdn.net/hcx25909/article/details/8811313#t1

    古月居的CSDN博客系列(2012.7-2013.9): http://blog.csdn.net/hcx25909/article/category/1191901/1

    小菜鸟上校的CSDN博客(2013.10-11)(20篇): http://blog.csdn.net/xiaocainiaoshangxiao/article/category/1710543/2 

    周学伟的博客园(2016.3-2016.5) :http://www.cnblogs.com/zxouxuewei/tag/%E6%9C%BA%E5%99%A8%E4%BA%BA%E7%B3%BB%E7%BB%9FROS%E7%9A%84%E5%AD%A6%E4%B9%A0%E4%B9%8B%E8%B7%AF/

    永顿007的新浪博客(2011.01-09): http://blog.sina.com.cn/s/articlelist_1712413141_7_1.html

    小庄的博客(2014.10-2015.11): http://blog.csdn.net/junshen1314/article/category/2614195


主题链接

     http://wiki.ros.org/ShuoLiu

    与消息有关的教程: http://wiki.ros.org/msg  关于节点所发布的消息相关的知识,消息的定义描述文件为 程序包目录下的msg/*.msg
                消息文件*.msg 包含两部分,类型(fields)和常值(constants)
                消息的类型引用使用‘包名/消息名’的方式,例如geometry_msgs/msg/Twist.msg是
                程序包geometry_msgs的Twist.msg文件定义的,引用时为 geometry_msgs/Twist
                
    
    图级名称相关: http://wiki.ros.org/Names  主要关于图级名称定义方面的相关知识,其实我的理解就是各种概念的命名索引规则
            1)图级命名对ROS的计算图级(如节点、参数、主题、服务等)提供了一个分层的命名结构。
                这些命名对ROS来说很强大,对ROS的扩大和复杂系统化很至关重要。
                理解这些命名如何工作以及你如何操作它们很重要
                    一些常见的命名方式: /(the global namespace)   /foo  /stanford/robot/name
                图级资源命名在ROS中提供了一种封装的机制,每种资源被定义在一个命名空间下(namespace)。
                这个概念有点类似java的包名,和类名的关系,不同的包下的相同的类名不会产生冲突
                合法的命名:1、首字符:英文字母、波浪(~)、斜杠(/)
                      2、后续字符:字母字母、下划线、斜杠
                    例外:基本名称中不能出现斜杠和波浪线
                解决方案:ROS中有四种类型的图级资源:base、relative、global、private
                     base
                    reletive/name
                    /global/name
                    ~private/name
                默认情况下,对节点命名使用相对命名方式,例如,节点/wg/node1 有一个名字空间/wg 所以
                节点node2自动归为/wg/node2
                没有任何名字空间类型的名字就是基本名字base,它实际上是相对命名的一个子类,
                基本名字是节点名字初始化是使用最频繁的。
                以/开头的名字属于global类型,尽量避免全局命名方式,因为这不利于代码的可移植性
                以~开头的名字属于private类型。它将一个节点名字转化为名字空间,例如,node1在名字空间/wg/中的
                private名字是/wg/node1 private名字在通过参数服务器像特定的节点进行传递参数的时候特别有用
                当一个节点被命令行launch时,可以使用remap(重映射)
            2)包级资源命名:这个概念用于ROS文件系统级.这简化了磁盘文件和数据的引用过程.
                包级资源命名很简单,主要就是包资源和其内部的资源名.例如名字"std_msgs/String"指String消息类型
                在"std_msgs"包中.
                可能使用包级资源命名的ROS相关的文件有:消息类型(Message) 服务类型(Service) 节点类型(Node)
                包级资源命名与文件路径很相似,只是它们更短.这归功于ROS从磁盘定位包以及对包中的内容进行估计的能力
                例如消息描述文件始终存放在msg子目录下并以*.msg文件存储,所以std_msgs/String 比路径/std_msgs/msg/String.msg短
                同样,节点类型 foo/bar 等同于从一个以foo为包名 下的一个可执行文件bar

    boost库下的共享指针相关: http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/shared_ptr.htm
                boost是c++的一个开源库,这里使用到了它的共享指针来传递数据,优点是不需要将数据复制一份就可以实现参数的传递

                这就意味着你可以存储它而又不需要复制数据,关于智能指针(shared_ptr等) ,C++11标准库已经实现,不过鉴于ros使用了

                boost库的很多头文件,还是要了解学习一下这个库.


    关于CMakeLists.txt:     http://wiki.ros.org/catkin/CMakeLists.txt 主要介绍该文件的内容和如何编写..很重要!


    关于创建消息和服务文件: http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv  介绍了如何在一个程序包下创建需要的消息文件和服务文件
                使用rosed工具(语法类似vim)可以编辑ros文件系统中的文件,语法是: rosed pkg_name file_name   例如:rosed m_pkg String.msg
            pkg_name指已经被系统识别的ros程序包名,file_name指该程序包下的各种文件,包括 *.msg、*.cpp 、CMakeLists.txt、package.xml文件等等
            
            消息(msg):msg消息文件是简单文本文件,其定义了ROS消息的成员类型和成员名称,用于产生不同的程序语言下的消息源代码
                消息文件存放于程序包msg目录下
                msg文件实际上就是每行声明一个数据类型和变量名,
                使用的数据名包括:int8/int16/int32/int64/uint*...float32/float64/string/time/duration/Header
                    特殊的Header消息类型,其他消息
            创建消息文件:在工作空间的某个程序包下,创建msg目录,在里面创建该程序包所使用到的msg消息文件
                接下来,要确保msg文件被转换成C++,Python或者其他语言的源代码,查看package.xml文件,
                确保有以下两条语句:    
                    <build_depend>message_generation</build_depend>  添加编译构建依赖项
                    <run_depend>message_runtime</run_depend>         添加运行依赖项
                打开CMakeLists.txt文件,在find_paackage(……message_generation)  添加对该项的依赖
                在catkin_package(…… CATKIN_DEPENDS message_runtime……)   设置运行依赖项
                在add_message_files()中添加消息文件
                最后添加generate_messages()函数
                编译程序包文件之后,可以使用rosmsg show [pkg_name/msg]来查看消息类型如:rosmsg show m_pkg/String 将会看到string data
            服务(srv):srv文件描述一个服务(service),它包含两部分,一个是请求(request),一个是响应(response)
                srv文件存放于程序包srv目录下
                srv文件的请求和响应两部分只见使用---分割
            创建一个服务文件:在工作空间的某个包下,创建srv目录。在该目录下编写*.srv文件
                接下来,要确保srv文件被转换成C++,Python或者其他语言的源代码,查看package.xml文件,
                确保有以下两条语句:    
                    <build_depend>message_generation</build_depend>  添加编译构建依赖项
                    <run_depend>message_runtime</run_depend>         添加运行依赖项
                打开CMakeLists.txt文件,在find_paackage(……message_generation)  添加对该项的依赖 message_generation对msg和srv都起作用
                取消注释add_service_files(),添加进相应的srv文件
                在工作空间中catkin_make,会显示如下
                    ...
                    [  5%] [ 11%] Generating EusLisp code from m_pkg/AddTwoInts.srv
                    [ 17%] Generating C++ code from m_pkg/AddTwoInts.srv
                    Generating Python code from SRV m_pkg/AddTwoInts
                    [ 23%] Generating Lisp code from m_pkg/AddTwoInts.srv
                    [ 41%] Built target m_pkg_generate_messages_eus
                    [ 52%] [ 52%] [ 64%] Built target m_pkg_generate_messages_lisp
                    Generating Python srv __init__.py for m_pkg
                    Generating Python msg __init__.py for m_pkg
                    ...
                使用rossrv show m_pkg/AddTwoInts显示相应的信息
            
            编译之后,生成的msg和srv对应于相关语言的源代码都在devel目录下
                c++版的头文件在devel/include/m_pkg下
                python版的在devel/lib/python2.7/dist-packages/m_pkg下

    关于参数服务器(Parameter Server):http://wiki.ros.org/Parameter%20Server
            参数服务器是一个共享的、多变量的词典。它以网络API相连接。在运行时阶段,节点通过服务器存储和提取参数。
            由于不是为高性能设计,它最好被用于存储静态的非二进制的数据,像是配置数据。
            它是全局可见的,因而其它工具可以容易地查看配置状态,也能够修改它们。
            参数服务器通过XMLRPC(使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。远程过程调用
            http://baike.baidu.com/link?url=ZVlh7vBK9AXil5ZhGEaXes69XcaMd9KfAKcfHtFrRdUj0fhzx7fY4gOTS7SgfJuIOTOplkv03YRrhQvn4g3HOa)
            实现。在master节点内部运行,意味着通过普通的XMLRPC库可以获得调用它的API。
            
            参数:使用ROS传统的命名机制命名。这意味着ROS参数有其与话题和节点命名空间相关联的分层机制。这种层次机制保障了参数名称不会相互冲突。
            层次机制也使得参数可以像树一样单独地被引用。
                例如:/camera/left/name:leftcamera
                      /camera/left/exposure:1
                      /camera/right/name:rightcamera
                      /camera/right/exposure:1.1

            参数/camera/left/name有一个leftcamera值,也可以使用/camera/left得到一个词典 name:leftcamera  exposure:1

            参数类型:参数服务器的参数值使用XMLRPC数据类型,
                包括:32bitintegers,booleans,strings,doubles,iso8601dates,lists,B64-encoded binary data

            私有参数(private parameters):ROS的命名规则将~name视为private name.
                这些私有名字最初是为点以节点的具体参数准备的

            参数工具: rosparam 命令工具可以取得或设置参数服务器中的参数,使用YAML语法

    关于主节点Master: http://wiki.ros.org/Master
        1.    主节点提供了ros系统中其它节点的命名和注册服务.
            它会跟踪消息发布节点和注册节点的话题topic,还有服务service
            主节点的作用是使其它节点可以定位另外的节点,一旦定位到了别的节点,就可以实现peer2peer的通信
            主节点也提供参数服务器.
            
            主节点主要是用roscore命令启动,该命令会加载ros主节点和其它一些必要的组件.

        2.    XMLRPC API
            ros主节点提供了基于XMLRPC的API,这些调用会为ROS的客户端库,比如roscpp和rospy所调用,以实现信息的存取
            大部分的ROS用户并不需要直接和这些API打交道

        3.    一个小例子
            有两个节点,camera节点和image_viewer节点。
            首先camera节点向主节点master通知说它想要发布images消息在images话题上。
            那就发布了这个消息,但无节点订阅,所以并没有数据发送。
            现在,image_viewer节点想要订阅images话题,看看有没有images数据。
            这样,images话题就有了消息发布者和消息订阅者,主节点就会通知camera节点和image_viewer节点对方的存在
            所以,它们之间就通过主节点识别到了对方,这样就开始传递images数据了。
        4.    Master的实现
            在ROS 1.1中,主节点是由rosmaster程序包实现的;
            之后的ros版本(jade是1.11),主节点master是rospy程序包的一部
1 0