• ROS2对比ROS1的一些变化与优势(全新安装ROS2以及编译错误处理)《1》


    1、概述

    我们在前面介绍的ROS,都是ROS1的版本,近期对机器狗进行学习的时候,发现版本是ROS2了,也发现平时习惯的一些命令都有了变化,改变还是挺大的,不过熟悉之后还是很习惯ROS2的写法。
    ROS2不是在ROS1的基础上做的更新,而是重新构建的,这样避免ROS1的设计的很多不规范,尤其是在实时性,安全性等方面都满足不了现代工作的需求,而做一些底层修改又可能造成ROS1的不稳定,所以算是全新架构了。底层是用C语言编写,叫做RCL库(ROS客户端库Client Library,是一种API,提供ROS话题、服务、动作、参数等接口),在写上层程序中调用的rclcpprclpy是在RCL库上进行一次包装,这样带来的好处是让C++(默认使用cpp 11, cpp1A4,cpp17标准,比ROS1默认使用的cpp98标准更加现代化的)和Python(这里放弃了Python2,直接使用的是Python3)程序调用API更加统一相似,同时对ROS2进行功能更新时,直接更新RCL库,再新增C++和Python的支持。
    虽然launch启动文件还是支持,不过在ROS2中建议使用Python文件写launch文件,更加的灵活。

    2、历史版本 

    我们先来看下ROS1有哪些历史版本: 

    Ubuntu版本    ros版本
    Ubuntu 20.04    noetic
    Ubuntu18.04    melodic
    Ubuntu16.04    kinetic
    Ubuntu14.04    indigo

    这个跟Ubuntu的版本对应着,到了ROS2的时候,基本每年都有新的版本发布,ROS2的历史版本列表:

    Crystal: 2018年12月
    Dashing: 2019年5月
    Eloquent: 2019年11月
    Foxy: 2020年6月
    Galactic: 2021年5月 

    本人的Ubuntu版本信息:lsb_release -a 

    No LSB modules are available.
    Distributor ID:    Ubuntu
    Description:    Ubuntu 20.04.4 LTS
    Release:    20.04
    Codename:    focal 

    其余命令还有:cat /etc/issue 或者cat /etc/os-release或者cat /proc/version 

    比如本人的ROS2版本:rosversion -d
    foxy
    或者:rosversion --distro
    foxy 

    3、命令变化 

    命令也改变了,基本是将ros1中的rosxxx拆分成了ros2 xxx的形式,比如 rosrun 变成了 ros2 run,当然我们可以通过双击tab键来看提示是最好的,这个也是多次推荐的做法,如下图: 

    可以看到这样的命令,个人感觉更合理了,每个单词都有其实际意义了,更加直观。 

    我们来运行一个节点Demo看下效果,一个发布节点和一个订阅节点:

    1. ros2 run demo_nodes_cpp talker
    2. ros2 run demo_nodes_py listener

     截图如下:

    这里运行上述两个节点之前,我并没有运行roscore,可以看到两个节点可以互相进行通信了,也就是说ROS2的去中心化设计让其适应更多工业应用和产品级应用场景的需求。
    ROS1和ROS2可以并存于同⼀台电脑,你只需要source其对应的setup.bash即可完成环境的选择。
    其余一些常见命令的变化如下:

    编译指令,从 catkin_make 更改为 colcon build 
    rosrun rqt_graph rqt_graph 更改为 rqt_graph
    rosrun rqt_tf_tree rqt_tf_tree 更改为 ros2 run tf2_tools view_frames.py
    rviz 更改为 rviz2

    4、全新安装

    本人安装环境:lsb_release -a 

    No LSB modules are available.
    Distributor ID:    Ubuntu
    Description:    Ubuntu 18.04.6 LTS
    Release:    18.04
    Codename:    bionic 

    前面铺垫了一些ROS1到ROS2的部分变化,接下来我们来安装一个全新的ROS2,这样就会更加快速的熟悉它。

    4.1、安装ROS2

    首先更新软件库

    1. sudo apt update
    2. sudo apt upgrade

    安装ROS2,推荐安装完整版

    sudo apt install ros-foxy-desktop

    如果不想安装完整版本,可以只安装核心软件包:sudo apt install ros-foxy-ros-base
    不出意外的出了意外,报错如下:

    E: Unable to locate package ros-foxy-desktop

    所以需要指定软件安装源来安装:

    1. sudo apt update && sudo apt install curl gnupg2 lsb-release
    2. curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
    3. sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'

    这里可以写死也可以获取变量值的写法:

    dpkg --print-architecture ,本机:amd64

     lsb_release -c 可以给出自身的版本,本机: Codename:    bionic

    写入之后,我们查看下源内容:cat /etc/apt/sources.list.d/ros2-latest.list

    deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu bionic main

    然后再次更新:sudo apt update

    这里的Ubuntu18版本好像不能安装foxy?网上却很多安装成功的?这个暂时存疑,因为我也觉得这个ROS2应该跟Ubuntu版本没有对应关系了,那我们安装Dashing来体验下:

    sudo apt install ros-dashing-desktop

    安装好了之后,配置环境,追加到 ~/.bashrc,这样不需要每次source

    echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc

    由于本人在之前也安装了ROS1,所以我们在这里可以写一个判断,~/.bashrc文件追加如下内容:

    1. echo "ROS melodic (1) or ROS2 dashing (2)?"
    2. read edition
    3. if [ "$edition" -eq "1" ];then
    4. source /opt/ros/melodic/setup.bash
    5. echo using ros melodic
    6. else
    7. source /opt/ros/dashing/setup.bash
    8. echo using ros2 dashing
    9. fi

    这样就会在开启终端时,选择ROS1还是ROS2,输入1表示启动ROS1,输入2表示启动ROS2
    如果启动ROS2时,出现下面警告:

    ROS_DISTRO was set to 'melodic' before. Please make sure that the environment does not mix paths from different distributions.

    翻译过来是,之前将ROS_DISTRO设置为“melodic”。请确保环境没有混合来自不同发行版的路径。
    就将.bashrc里面的/opt/ros/melodic/setup.bash注释掉即可。 

    如果双击tab键没有给出提示,需安装命令补全包:sudo apt install python3-argcomplete 

    然后测试下,分别输入: 

    1. ros2 run demo_nodes_cpp talker
    2. ros2 run demo_nodes_py listener

    ROS2安装之后测试没问题,如下图:

     一些常见的开发需要的包,自行按需选择安装: 

    1. sudo apt install ros-dashing-turtlesim
    2. sudo apt install ros-dashing-xacro
    3. sudo apt install python3-pip
    4. sudo apt install python3-colcon-common-extensions
    5. sudo apt install python3-vcstool
    6. sudo apt-get install ros-dashing-joint-state-publisher-gui
    7. #卸载ROS2
    8. sudo apt remove ros-dashing-* && sudo apt autoremove

    4.2、安装Gazebo

    Gazebo是一个强大的仿真平台,平时用的比较多,安装如下: 

    sudo apt install ros-dashing-gazebo-ros-pkgs

    导航相关的包

    1. sudo apt install ros-dashing-cartographer
    2. sudo apt install ros-dashing-cartographer-ros
    3. sudo apt install ros-dashing-navigation2
    4. sudo apt install ros-dashing-nav2-bringup
    5. sudo apt install ros-dashing-gazebo-ros2-control
    6. sudo apt install ros-dashing-ros2-control ros-dashing-ros2-controllers

     4.3、编译

    编译的过程相比ROS1,在ROS2中也发生了很大的改变,未来随着ROS1的慢慢淘汰,我们还是重点掌握ROS2的用法即可
    创建工作空间

    1. mkdir -p ~/myRobotDog_ws/src
    2. cd ~/myRobotDog_ws/src

    创建包(这里跟ROS1不一样)

    ros2 pkg create --build-type ament_cmake mypkg --node-name mynode

    同样会在mypkg这个包下面,生成以下目录与文件

    CMakeLists.txt  include  package.xml  src

    然后我们来看下节点mynode,在src里的一个c++文件:gedit mynode.cpp

    1. #include
    2. int main(int argc, char ** argv)
    3. {
    4. (void) argc;
    5. (void) argv;
    6. printf("hello world mypkg package\n");
    7. return 0;
    8. }

    接下来就是编译,在编译之前确保已安装colcon编译器

    ​​​​​​​sudo apt install python3-colcon-common-extensions
    1. cd ~/myRobotDog_ws
    2. colcon build --symlink-install
    3. echo 'source ~/myRobotDog_ws/install/setup.bash' >> ~/.bashrc

    然后测试下

    1. ros2 run mypkg mynode
    2. #hello world mypkg package

    如果想增加节点,修改CMakeLists.txt文件即可:

    1. cd ~/myRobotDog_ws/src/mypkg
    2. gedit CMakeLists.txt

    新增即可:

    1. add_executable(mynode src/mynode.cpp)
    2. target_include_directories(mynode PUBLIC
    3.   $
    4.   $<INSTALL_INTERFACE:include>)
    5. install(TARGETS mynode
    6.   DESTINATION lib/${PROJECT_NAME})

    colcon的一些常用参数:

    --symlink-install:使用符号链接比如,动态链接库,会在install目录中使用符号链接,指向build目录下生成的库文件(如 *.so),如果没有该选项,则两个目录都有该库文件。
    --packages-select:只编译指定包,比如单独编译mypkg包:colcon build --packages-select mypkg
    --packages-ignore: 忽略指定包,用法同上
    --continue-on-error:编译出错继续编译其他模块
    --cmake-args ,--ament-cmake-args, --catkin-cmake-args :传递参数给对应的package

    最后需要注意的,ROS2在修改完任何文件后,需要重新编译 colcon build 

    更多详情可以查阅:https://docs.ros.org/en/dashing/Installation/Ubuntu-Install-Debians.html 

    5、编译Python 

    对于Python的编译,有好几个点需要注意,以及一些配置文件的修改

    1. mkdir -p ~/mypy_ws/src
    2. cd ~/mypy_ws/src
    3. ros2 pkg create --build-type ament_python my_py
    4. cd ~/mypy_ws/src/my_py/my_py
    5. touch PYNode.py
    6. gedit PYNode.py
    1. #!/usr/bin/env python3
    2. import rclpy
    3. from rclpy.node import Node
    4. def main(args=None):
    5. rclpy.init(args=args)
    6. node = Node("ChyiChin_Node")
    7. node.get_logger().info("Python TEST")
    8. rclpy.spin(node)
    9. rclpy.shutdown()
    10. if __name__ == '__main__':
    11. main()

    加个可执行权限:chmod +x PYNode.py

    1. cd ~/mypy_ws
    2. colcon build --packages-select my_py
    3. source install/setup.bash

    运行ChyiChin_Node节点,看下能否正确输出日志信息:

    1. ros2 run my_py ChyiChin_Node
    2. [INFO] [ChyiChin_Node]: Python TEST

    OK,没有问题,对C++和Python的编译就这么愉快的搞定了。接下来,将贴出在编译过程中遇到的一些错误,以及处理的方法

    6、编译出错

    6.1、setup.cfg

    Usage of dash-separated 'script-dir' will not be supported in future version

    短横线在未来版本不再支持,所以我们需要修改为下划线的形式:

    1. cd ~/mypy_ws/src/my_py
    2. gedit setup.cfg

    将里面的script-dirinstall-scripts修改为script_dirinstall_scripts

    6.2、Setuptools版本

    SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
      setuptools.SetuptoolsDeprecationWarning,

    查看下setuptools的版本

    1. python3
    2. import setuptools
    3. print(setuptools.__version__)
    4. 59.6.0

    版本太新了,安装低版本的就可以了:

    pip3 install setuptools==58.2.0 -i http://pypi.douban.com/simple/  --trusted-host pypi.douban.com

    6.3、No executable found

    ros2在运行python文件时,会报错:No executable found 

    在前面的mypkg包里面,可以查询到所有可执行程序:ros2 pkg executables mypkg

    mypkg mynode
    mypkg mynode1 

    然后在Python里面的my_py包,查询是空的:ros2 pkg executables my_py 

    解决方案:在编译之前,需要修改setup.py,告知入口点位置,也就是Python文件的路径 

    1. cd ~/mypy_ws/src/my_py
    2. gedit setup.py
    3. entry_points={
    4. 'console_scripts': ["ChyiChin_Node=my_py.PYNode:main"],
    5. },

    其中ChyiChin_Node为节点名称,my_py.PYNode为Python文件路径(包名.文件名),加:main入口函数

    6.4、RuntimeError

    RuntimeError: 'distutils.core.setup()' was never called -- perhaps 'setup.py' is not a Distutils setup script? 

    翻译过来是:RuntimeError: ' Distutils .core.setup()'从未被调用-也许'setup.py'不是Distutils安装脚本?
    这个属于运行时错误,所以需要一个rclpy的依赖,所以在创建包的时候,这样写即可:
    ros2 pkg create my_py --build-type ament_python --dependencies rclpy
    最后来看下运行Python写的这个节点

    ros2 run my_pkg ChyiChin_Node

    截图如下:

    7、小结

    ROS2的出现,让ROS真正成为了去中心化的分布式的操作系统,这个是其最主要的特点,因为在ROS1中,我们知道需要首先启动roscore,也就是MASTER管理节点,如果这个节点崩了,那整个ROS系统都崩了,这是一种不好的设计。
    另外引入了数据分发服务通信协议(DDS),使用零拷贝的方式来传递消息,这大大节省了内存和传输所占用的资源,提高了通信的实时性。 

  • 相关阅读:
    设计模式——策略模式
    快速打字只需要16.8
    Go语言基础01 变量
    【ASP.NET Core】使用SignalR推送服务器日志
    《动手学深度学习 Pytorch版》 7.5 批量规范化
    C++特性:继承,封装,多态
    HashMap
    gradle-4-构建有向无环图
    Kubernetes-三大开放接口-初见
    Spring Boot文档阅读笔记-CORS Support
  • 原文地址:https://blog.csdn.net/weixin_41896770/article/details/134545199