前言:

ros的很多命令都是基于python的文件,比如roslaunch,rospy,rospkg其实都是python文件,所以说ros基于的哪个python版本非常重要。我们运行ros命令其实就是运行这些文件。


基本常识

ros-melodic是基于py27写成的。ros-noetic是基于py38。
通过source /opt/ros/<ROS_VERSION>/setup.zsh或者source /opt/ros/<ROS_VERSION>/setup.bash设置了诸多环境变量,其中就包括$PYTHONPATH,此处$PYTHONPATH=/opt/ros/noetic/lib/python3/dist-packages在该路径可以找到很多ros包和ros命令。
由于anaconda也提供python环境,所以可以在anaconda中运行基于任何python版本的ros。
anaconda的$PYTHONPATH=/home/up/anaconda3/envs/<YOUR_ENV>/lib/python2.7(3.8/3.x)/site-packages


听起来很厉害!
用起来并不顺畅~
目前只是基本功能可用


anaconda中ros包安装

使用anaconda中的ros,必须安装相关ros包。在这个网址可以搜到anaconda package 执行类似conda install -c conda-forge ros-rospy命令,就可以安装ros包。
-c conda-forge指明了源,这个源安装的都是基于py27的,conda list可以看安装的conda包。
网址中还有一个conda install -c robostack ros-melodic-rospy,其中-c robostack指明了使用robostack的源,是非官方组织开发anaconda项目。基本上robostack开发的ros包是noetic的,并据他们称,依据conda开发一套完善的ros-noetic的包,在此处搜索包ros package这样在ubuntu18上安装他们的conda也可以使用ros-noetic。


这样一来,组合会非常灵活。

系统:ubuntu18 + ros-melodic可以运行py2的ros相关程序,如果加anaconda robostack中的ros-noetic则又可运行py3的ros程序。

系统:ubuntu20 + ros-noetic可以运行py3的ros相关程序,如果加anaconda conda-forge中的ros相关包则又可运行py2的ros程序。

需要注意:启动终端时候自带的~/.bashrc或者~/.zshrc中不要加source /opt/ros/<ROS_VERSION>/setup.bash,不然会直接将系统的$PYTHONPATH加入,而无法使用anaconda中$PYTHONPATH
所以最好进入一个空终端后再export PYTHONPATH

另外如果使用anaconda中的ros包,因为没有source /opt/ros/<ROS_VERSION>/setup.bash这样方便的命令,我们需要手动加入ros的环境变量。下面以加入py2的ros包为例。

export ROS_PACKAGE_PATH=/home/up/anaconda3/envs/<YOUR_ENV>/share
export ROS_MASTER_URI="http://localhost:11311"
export ROS_DISTRO=“melodic”

issue

目前在anaconda中开启roscore或者roslaunch,会有找不到rosout的错误,但如果仅仅调用了rospy,std_msgs等基本ros包是没有问题的。
比如我的运行EAI小车的python文件必须使用py2的ros,那么在我的ubuntu20.04的电脑创建
conda create -n car_py2 python=2.7环境。

driver.py

#!/home/up/anaconda3/envs/car_py2/bin/python2
import rospy
import sys
from nav_msgs.msg import Odometry
....
....

然后运行python2 driver.py,因为anaconda中rosout我调用不了,所以尽管roscore可运行,但是roscore依赖rosout。roscore也不能在anaconda中运行。
但是!!
可以在非conda环境的终端通过source /opt/ros/<ROS_VERSION>/setup.bash后,运行ros-noetic的roscore。
非常棒!
这样只有需要py2的程序在conda的终端运行,其他ros命令都可以在非conda环境的终端中运行。包括rosparam load