前言:
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