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

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

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

可以看出当前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

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

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

这时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

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

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

所以,最开始的理解是对的,就是由于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

重点在这句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

可以发现,在没有使用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'

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

pip install rospkg

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

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

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

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

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值