美文网首页
ROS 基础

ROS 基础

作者: _49_ | 来源:发表于2021-02-16 15:55 被阅读0次

    1. ROS 开发环境

    1.1 安装 ROS

    Installation: http://wiki.ros.org/melodic/Installation/Ubuntu
    Ubuntu 20.04 Install Ros:
    https://blog.csdn.net/qq_44339029/article/details/108919545
    https://blog.csdn.net/weixin_45168199/article/details/106910446

    pycharm ros env setting:

    # sudo vi /var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.
    
    update Exec:
    
    [Desktop Entry]
    X-SnapInstanceName=pycharm-community
    Version=1.0
    Type=Application
    Name=PyCharm Community Edition
    Icon=/snap/pycharm-community/232/bin/pycharm.png
    #Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.desktop /snap/bin/pycharm-community %f
    Exec=bash -i -c "env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/pycharm-community_pycharm-community.desktop /snap/bin/pycharm-community" %f
    Comment=Python IDE for Professional Developers
    Categories=Development;IDE;
    Terminal=false
    StartupWMClass=jetbrains-pycharm-ce
    StartupNotify=true
    
    
    # Setup your sources.list
    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
    # Set up your keys
    sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
       or
    curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -
    # Installation
    sudo apt update
    sudo apt install ros-melodic-desktop-full
    apt search ros-melodic
    # sudo apt install ros-melodic-PACKAGE
    e.g.
    sudo apt install ros-melodic-slam-gmapping
    

    1.2 配置ROS

    初始化ros开发环境:

    $ echo "source/opt/ros/melodic/setup.bash" >> ~/.bashrc
    
    $ sudo apt install python-rosdep
    $ sudo apt install python-rosinstall
    $ sudo apt install python-rosinstall-generator
    $ sudo apt install python-wstool
    $ sudo apt install build-essential
    
    $ sudo rosdep init
    $ rosdep update
    

    解决sudo rosdep init和rosdep update的错误

    安装ROS时 sudo rosdep initsudo rosdep update 报错:

    ERROR: cannot download default sources list from:
    https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
    Website may be down.
    

    根本原因是无法解析 raw.githubusercontent.com

    https://site.ip138.com/raw.Githubusercontent.com/
    输入raw.githubusercontent.com
    查询IP地址
    修改 /etc/hosts 直接在终端输入
    151.101.109.133 raw.githubusercontent.com

    1. 工作空间 workspace

    1.1 Create Workspace

    $ mkdir -p ~/catkin_ws/src
    $ cd ~/catkin_ws/src
    $ catkin_init_workspace
    

    1.2 Build Workspace

    $ cd ~/catkin_ws
    $ catkin_make
    
    // 查看目录结构
    $ tree -L 1 ~/catkin_ws
    catkin_ws
    ├── build
    ├── devel
    └── src
    

    1.3 Init Workspace Env

    $ source ~/catkin_ws/devel/setup.bash
    // 查看工作空间环境变量(一层一层嵌套式的)
    $ echo $/ROS_PACKAGE_PATH
    /home/pi/catkin_ws/src:/opt/ros/melodic/share
    

    2. 功能包 Package

    2.1 自定义 Package

    catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

    // Create
    $ cd ~/catkin_ws/src
    $ catkin_create_pkg learning_communication std_msgs rospy roscpp
    
    // Build
    $ cd ~/catkin_w
    $ catkin_make
    
    // Env
    $ source ~/catkin_ws/devel/setup.bash
    

    2.2 Ros 系统提供功能包

    $ sudo apt-get install ros_melodic_ros_tutorials
    $ rospack find roscpp_tutorials
    /opt/ros/melodic/share/roscpp_tutorials
    

    2.3 第三方开源 功能包

    $ cd ~/catkin_ws/src
    $ git clone git://github.com/ros/ros_tutorials.git
    $ cd ~/catkin_ws
    $ catkin_make
    $ source ~/catkin_ws/devel/setup.bash
    $ rospack find roscpp_tutorials
    /home/pi/cue_ws/src/ros_tutorials/roscpp_tutorials
    

    注意:工作空间覆盖问题
    在系统和不同工作空间中,功能包是可以重名的(本例中:roscpp_tutorials)。同名时,会根据工作空间的覆盖顺序,优先选择最近工作空间里的功能包进行使用。这是开发中需要关注的。避免功能包运行在预期外的工作空间中。

    3. Ros 架构

    3.1 Ros 基础架构设计

    图3-1 ROS 架构

    通信系统: TCPROS/UDPROS

    ROS 通信系统,使用 发布/订阅、客户端/服务器 等模型,实现多种通信机制的数据传输。

    跨进程通信: Nodelet API

    Ros Nodelet API 为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性有较高要求的应用。

    ROS 机器人开发相关库:Client Library

    基于通信机制之上,ROS提供了大量机器人开发相关库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。

    应用层:Application Layer

    在应用层,ROS需要运行一个管理者 -- Master,负责管理整个系统的正常运行。ROS 社区提供了大量机器人应用的功能包,这些功能包内的模块以节点为单位运行,以ROS标准输入输出作为接口,让开发者不需要关注模块内部的实现机制,只需要了解接口规则即可实现复用,极大的提高了工作效率。

    从系统实现角度可以将ROS划分为三个层次: 开源社区、文件系统、计算图。


    图3-2 从系统实现角度可以将ROS划分为三个层次

    3.2 计算图

    从计算图角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接。

    // 计算图查看工具
    $ rqt_graph
    

    3.2.1 节点(Node)

    节点(Node)是执行运行任务的进程,一个系统由多个节点构成,也可以看作是软件模块。当许多节点同时运行时,可以很方便的额将端对端的通信机制绘成节点关系图。在这个图中可以清晰看出节点(圈)和端对端的连接关系(节点间的连线)。


    图3-3 ROS 中的节点关系图

    3.2.2 消息(Message)

    节点间通讯的通用数据结构定义的封装,可根据需求由开发者自定义。

    3.2.3 话题(Topic)

    消息以一种 发布/订阅(Publish/Subscribe)的方式传递。数据以广播的形式发布。这是一种单向的数据通信,发布者与订阅者之间,订阅者相互之间并不知道彼此的存在。


    图3-4 ROS中基于发布/订阅模型的通信

    3.2.4 服务(Service)

    双向同步传输,在ROS中,采用Service。基于Client / Server模型实现。类似于Web服务,包含两部分通信数据类型:request / response。 ROS 只允许一个节点提供一个指定命名的服务。

    3.2.5 节点管理器(ROS Master)

    ROS Master 通过RPC调用,提供登记列表和对其他计算图表查询的功能,帮助ROS节点之间互相查找、建立连接。同时还未系统提供参数服务器,管理全局参数。ROS Master是一个管理者,没有他,节点无法找到彼此,无法交换消息或调用服务,整个系统将会瘫痪。

    3.3 文件系统

    参考:http://niehen.cn/ros/ros-file-system/

    Catkin

    对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统
    CMake 是一个跨平台的安装工具,可以用最简单的语句来描述所有平台的安装,为软件跨平台创建而生。


    enter description here

    一个Catkin的软件包(package)必须要包括两个文件:
    package.xml
    CMakeLists.txt

    catkin编译的工作流程如下:
    1.首先在工作空间catkin_ws/src/下递归的查找其中每一个ROS的package。
    2.package中会有package.xml和CMakeLists.txt文件,Catkin(CMake)编译系统依据CMakeLists.txt文件,从而生成makefiles(放在catkin_ws/build/)。
    3.然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)。

    也就是说,Catkin就是将cmake与make指令做了一个封装从而完成整个编译过程的工具。

    初始化Catkin工作空间
    输入下列指令,完成初始创建。

    mkdir -p ~/catkin_ws/src  
    cd ~/catkin_ws/
    catkin_make #初始化工作空间

    第一行代码直接创建了第二层级的文件夹src,这也是我们放ROS软件包的地方。第二行代码使得进程进入工作空间,然后再是catkin_make。

    进行编译
    用catkin编译一个工程或软件包,只需要用catkin_make指令,一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件.

    cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
    catkin_make #开始编译
    source ~/catkin_ws/devel/setup.bash #刷新坏境

    显示文件结构
    在工作空间下用tree命令,。

    cd ~/catkin_ws
    sudo apt install tree
    tree

    通过tree命令可以看到catkin工作空间的结构,它包括了src、build、devel三个路径
    src/: ROS的catkin软件包(源代码包)
    build/: catkin(CMake)的缓存信息和中间文件
    devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量


    enter description here

    平常主要用到的是src文件夹
    我们写的ROS程序、网上下载的ROS源代码包都存放在这里。
    在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包

    package

    package是catkin工作空间的基本单元,我们在ROS开发时,写好代码,然后catkin_make,系统就会完成所有编译构建的工作。

    package结构

    enter description here

    Package可以分为二进制和源代码。
    二进制包里面包括了已经编译完成,可以直接运行的程序,一般是官方给的程序,无法修改查看源代码 一般在/opt/ros/kinetic/中存放
    源代码是指第三方开发的,根据需求自己下载。通常放在 ~/catkin_ws/src,需要通过make/cmake/caktin 进行编译使用,可以进行修改源代码对于编译工具软件包等有依赖问题。

    package相关命令
    rospack是对package管理的工具,命令的用法如下:
    rostopic命令 | 作用
    ——— |————
    rospack help | 显示rospack的用法
    rospack list | 列出本机所有package
    rospack depends [package] | 显示package的依赖包
    rospack find [package] |定位某个package
    rospack profile |刷新所有package的位置记录
    以上命令如果package缺省,则默认为当前目录(如果当前目录包含package.xml)
    roscd命令类似与Linux系统的cd,改进之处在于roscd可以直接cd到ROS的软件包。
    rosls也可以视为Linux指令ls的改进版,可以直接lsROS软件包的内容。
    rosdep是用于管理ROS package依赖项的命令行工具,用法如下
    rostopic命令 | 作用
    ——— |————
    roscd [pacakge] |cd到ROS package所在路径
    rosls命令 | 作用
    rosls [pacakge] | 列出pacakge下的文件
    rosdep命令 | 作用
    rosdep check [pacakge] |检查package的依赖是否满足
    rosdep install [pacakge]| 安装pacakge的依赖
    rosdep db |生成和显示依赖数据库
    rosdep init |初始化/etc/ros/rosdep中的源
    rosdep keys |检查package的依赖是否满足
    rosdep update |更新本地的rosdep数据库
    一个较常使用的命令是rosdep install –from-paths src –ignore-src –rosdistro=kinetic -y,用于安装工作空间中src路径下所有package的依赖项(由pacakge.xml文件指定)。

    package.xml

    包括了package的描述信息,name, description, version, maintainer(s), license,opt. authors, url’s, dependencies, plugins, etc…
    实际上rospack find、rosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件
    包含的标签有


    enter description here

    run_depend 也是运行依赖 不过是上一版本的标签,也能共用。
    示例 小海龟的package.xml 部分文件


    enter description here

    可以使用 rospack find turtlesim 找到包的位置 或者 roscd turtlesim 直接找到该目录下

    CMakeLists.txt: 构建package所需的CMake文件,调用Catkin的函数/宏,解析package.xml,找到其他依赖的catkin软件包,将本软件包添加到环境变量。

    总体结构如下


    enter description here

    对于CMake的语法可以参考 《CMake实践》
    示例 :

    enter description here

    这是小海龟的Cmakelists.txt 文件的一部分,具体可以到
    /opt/ros/kinetic/share/turtlesim 中查看

    launch文件

    一般launch文件中会指定要启动哪些package下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch文件通常放在软件包的launch/路径中中。

    ROS为我们提供了一个命令能一次性启动master和多个node。该命令是:
    $ roslaunch pkg_name file_name.launch
    roslaunch就像是一个启动工具,能够一次性把多个节点按照我们预先的配置(写入launch文件中)启动起来

    launch文件同样也遵循着xml格式规范,是一种标签文本,它的格式包括以下标签:


    enter description here

    参考链接:

    示例
    launch文件的写法和格式看起来内容比较复杂,我们先来介绍一个最简单的例子如下:


    enter description here

    这是官网给出的一个最小的例子,文本中的信息是,它启动了一个单独的节点talker,该节点是包rospy_tutorials软件包中的节点。
    但是实际比这个更为复杂

    元功能包 Metapackage

    功能包集,就是将多个功能接近,相互依赖的软件包放到一个集合中去。
    ros中常用的Metapackage有

    Metapacakge名称 描述
    navigation 导航相关的功能包集
    moveit 运动规划相关的(主要是机械臂)功能包集
    image_pipeline 图像获取、处理相关的功能包集
    vision_opencv ROS与OpenCV交互的功能包集
    turtlebot Turtlebot机器人相关的功能包集
    pr2_robot pr2机器人驱动功能包集

    metapacakge中的 package.xml文件,CMakeLists.txt 文件 和普通pacakge不同点是:
    CMakeLists.txt:加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
    package.xml:标签将所有软件包列为依赖项,标签中添加标签声明。
    metapacakge在我们实际开发一个大工程时可能有用

    4. ROS2 升级

    https://blog.csdn.net/weixin_36628778/article/details/104751581

    相关文章

      网友评论

          本文标题:ROS 基础

          本文链接:https://www.haomeiwen.com/subject/djyvxltx.html