• Ubuntu18.04 ROS与Anaconda兼容并且在python3的虚拟环境下与ROS通信


    1. ROS跟anaconda的兼容问题

    首先为什么ROS跟anaconda会出现冲突,问题的核心在于调用python的路径,ROS是建立在python2.7下的,所以运行ROS需要当前的python版本指向python2,而anaconda则是在anaconda创建的python路径,一旦启动anaconda,python的路径就指向了anaconda创建的python路径。弄清这点后,用点小技巧把它们分开执行就可以实现兼容。
    可以通过下面的方法验证刚刚说的,先进入bashrc,一般装完ROS和anaconda后,会多出这么几行

    # added by Anaconda3 installer
    export PATH="/home/will/anaconda3/bin:$PATH"
    
    export ROS_HOSTNAME=127.0.0.1
    export ROS_MASTER_URI=http://127.0.0.1:11311
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这时如果启动ROS的东西就会报错,因为python路径不对,查看当前的python路径

    will@will-Dell-G15-5511:~$ source ~/.bashrc
    will@will-Dell-G15-5511:~$ which python
    /home/will/anaconda3/bin/python
    
    • 1
    • 2
    • 3

    可以看出当前python的路径指向的是anaconda下的路径,这时我们还没激活conda环境,但是在bashrc里面已经指定了路径,所以先把export PATH="/home/will/anaconda3/bin:$PATH"这句注释掉

    # added by Anaconda3 installer
    #export PATH="/home/will/anaconda3/bin:$PATH"
    
    export ROS_HOSTNAME=127.0.0.1
    export ROS_MASTER_URI=http://127.0.0.1:11311
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后打开一个新terminal,再次查看python版本

    will@will-Dell-G15-5511:~$ source ~/.bashrc
    will@will-Dell-G15-5511:~$ which python
    /usr/bin/python
    
    • 1
    • 2
    • 3

    这时python路径指向的是根目录下的路径,再进一步,看看根目录下面这个python路径有哪些
    cd /usr/bin
    ls -l python*

    will@will-Dell-G15-5511:~$ cd /usr/bin/
    will@will-Dell-G15-5511:/usr/bin$ ls -l python*
    lrwxrwxrwx 1 root root      18 Nov  3  2021 python -> /usr/bin/python2.7
    lrwxrwxrwx 1 root root       9 Apr 16  2018 python2 -> python2.7
    -rwxr-xr-x 1 root root 3620744 Mar 18 21:21 python2.7
    lrwxrwxrwx 1 root root      33 Mar 18 21:21 python2.7-config -> x86_64-linux-gnu-python2.7-config
    lrwxrwxrwx 1 root root      16 Apr 16  2018 python2-config -> python2.7-config
    -rwxr-xr-x 1 root root     365 Aug 23  2016 python2-qr
    lrwxrwxrwx 1 root root       9 Oct 29  2021 python3 -> python3.6
    -rwxr-xr-x 2 root root 4526456 Mar 15 21:55 python3.6
    lrwxrwxrwx 1 root root      33 Mar 15 21:55 python3.6-config -> x86_64-linux-gnu-python3.6-config
    -rwxr-xr-x 2 root root 4526456 Mar 15 21:55 python3.6m
    lrwxrwxrwx 1 root root      34 Mar 15 21:55 python3.6m-config -> x86_64-linux-gnu-python3.6m-config
    lrwxrwxrwx 1 root root      16 Oct 25  2018 python3-config -> python3.6-config
    lrwxrwxrwx 1 root root      10 Oct 29  2021 python3m -> python3.6m
    lrwxrwxrwx 1 root root      17 Oct 25  2018 python3m-config -> python3.6m-config
    -rwxr-xr-x 1 root root 3633000 Nov  3  2021 python_bak
    lrwxrwxrwx 1 root root      16 Apr 16  2018 python-config -> python2.7-config
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    我们关注python2和python3的指向就行了,也就是下面两行

    lrwxrwxrwx 1 root root       9 Apr 16  2018 python2 -> python2.7
    lrwxrwxrwx 1 root root       9 Oct 29  2021 python3 -> python3.6
    
    • 1
    • 2

    所以,最开始的理解是对的,就是由于python路径引起的冲突。


    1.1 解决办法

    思路就是:不在bashrc里面指定python的路径,我们在有需要的时候再重新开一个terminal激活anaconda的虚拟环境,不改变初始的python路径。

    接下来就是实施的方法:
    1)首先先把bashrc里面的export PATH="/home/will/anaconda3/bin:$PATH"这句注释掉,然后加上一个快捷命令手动激活anaconda,修改如下:

    # added by Anaconda3 installer
    #export PATH="/home/will/anaconda3/bin:$PATH"
    # activate anaconda env. this method can work with ROS in the same time
    alias setconda='. ~/anaconda3/bin/activate'
    
    export ROS_HOSTNAME=127.0.0.1
    export ROS_MASTER_URI=http://127.0.0.1:11311
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    重点在这句alias setconda='. ~/anaconda3/bin/activate'其实这个快捷命令就是为了启动引号内的内容的,不喜欢用快捷命令也可以直接输入,一样的效果。
    修改完后,重新开一个terminal,然后就可以开始测试了

    will@will-Dell-G15-5511:~$ source ~/.bashrc
    will@will-Dell-G15-5511:~$ which python
    /usr/bin/python
    will@will-Dell-G15-5511:~$ setconda 
    (base) will@will-Dell-G15-5511:~$ which python
    /home/will/anaconda3/bin/python
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以发现,在没有使用setconda前,python路径没问题,启动后,路径立刻进入anaconda的环境下,这就是我们想要的
    也只有在使用setconda后,才能用source activate your_evironment_name,后面的操作就是常规操作了,该干嘛干嘛

    这就是解决ROS和anaconda冲突的解决方法,如果想在conda环境下与ROS其他的节点通信,还会遇到其他的问题,下面一节会举例说明。


    2. 在anaconda的python3环境中与ROS的其他节点通信

    解决兼容问题后, 在启动python节点时会发现,提示import rospy出错,如下:

    Python 3.7.0 (default, Jun 28 2018, 13:15:42) 
    [GCC 7.2.0] :: Anaconda, Inc. on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import rospy
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/__init__.py", line 49, in <module>
        from .client import spin, myargv, init_node, \
      File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/client.py", line 52, in <module>
        import roslib
      File "/opt/ros/melodic/lib/python2.7/dist-packages/roslib/__init__.py", line 50, in <module>
        from roslib.launcher import load_manifest  # noqa: F401
      File "/opt/ros/melodic/lib/python2.7/dist-packages/roslib/launcher.py", line 42, in <module>
        import rospkg
    ModuleNotFoundError: No module named 'rospkg'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    意思就是我们没有在python3的环境下配好rospy所需要的包,只需要补齐就可以了,运行下面这句

    pip install rospkg

    安装完后,再测试一次,不报错就说明成功了

    >>> import rospy
    >>> rospy
    <module 'rospy' from '/opt/ros/melodic/lib/python2.7/dist-packages/rospy/__init__.py'>
    >>> 
    
    • 1
    • 2
    • 3
    • 4

    这个包好就好在,在python3的环境下,把调用ROS的python路径指向python2.7的路径,这就解决一切问题了,舒服

    所有的根源都出在于ROS和anaconda所使用的python版本有区别,希望早日出个稳定可靠的python3版本的ROS,就没有这些问题了

  • 相关阅读:
    黑马C++ 02 核心 4 ——类和对象_C++对象模型和this指针_友元
    QT转型Visual Studio(qmake项目到cmake项目的移植)
    python脚本源码检查数据库内容并上报飞书
    gradle使用教程,小白一篇就够
    Python绘图系统26:坐标和绘图函数设置
    mysql简单介绍2.0
    Codechef [June Long Two 2022] 题解
    如何彻底删除MySQL
    UE4 Unlua源码解析10 - Lua怎么替换BlueprintImplementableEvent或BlueprintNativeEvent的方法实现的
    Vue3类与样式绑定
  • 原文地址:https://blog.csdn.net/Will_Ye/article/details/125546383