首先为什么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路径引起的冲突。
思路就是:不在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其他的节点通信,还会遇到其他的问题,下面一节会举例说明。
解决兼容问题后, 在启动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,就没有这些问题了