ROS中使用Python3的注意事项

1 所有操作步骤

1.1 首先,强烈建议搭建一个只包含Python3虚拟环境,这样不会有各种各样的导入包产生的报错,也可以避免把你的ROS搞挂,roscore运行不起来。这一步请参考:

Python–Virtualenv简明教程

1.2 其次,安装一系列ROS用到的包的Python3版本,这里包括catkin,rospkg,tf等等。这些是非常常用的包,一般写ROS程序都会用到,所以肯定是要装的。当然,各位在开发过程中肯定还会遇到一些不支持Python3的ROS包,那么同理也需要安装其对应的Python3版本。详细可参考:

在ROS中使用Python3

 
 % 注意tf包需要从源码重新编译,下面是编译步骤 
 % 编译得到的Python包存放在devel/lib/python3/dist-packages/里面,注意要将这个路径写到PYTHONPATH变量中 
 mkdir catkin_ws % 创建工作空间 
 cd catkin_ws 
 mkdir src 
 cd src 
 git clone https://github.com/ros/geometry %下载geometry和geometry2的源代码 
 git clone https://github.com/ros/geometry2 
 cd .. 
 source venv/bin/activate %激活你的虚拟环境 
 pip install catkin_pkg pyyaml empy rospkg numpy 
 catkin_make %在虚拟环境下编译的 
 source devel/setup.bash

1.3 第三,在Pycharm里面运行ROS的程序。很简单,三步。第一步,在shell中source ROS的路径,然后在这个shell里打开Pycharm,这样才能在Pycharm里运行ROS节点。第二步,设置虚拟环境中的python作为解释器。第三步,设置python包的搜索路径。详细方法参考:

在Pycharm中写ROS代码
ROS与Python入门教程-搭建开发环境(PyCharm)
PyCharm添加Python解释器及添加package路径

1.4 最后,也是最关键的一点。你一定要搞清楚的是PYTHONPATH这个环境变量。遇到的很多导入包的错误都是因为PYTHONPATH没有设置好。例如,要运行roscore会需要导入yaml这个python包,如果你PYTHONPATH没有设置Python2的路径,就会导致roscore引入Python3的yaml的包,造成错误,如下。总而言之,一定要搞清楚PYTHONPATH怎么设置,需要用到哪些路径,不需要用到哪些路径,哪些路径放在前面,哪些放在后面。PS:因为貌似只要一搜索到名字相同的包,系统就会直接引入,不管是版本2还是3;所以如果一个软件包既有2也有3的版本,那么一定要考虑好路径的排列顺序。

Traceback (most recent call last):
  File "/opt/ros/kinetic/bin/roscore", line 69, in <module>
    import roslaunch
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/__init__.py", line 51, in <module>
    from . import param_dump as roslaunch_param_dump
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/param_dump.py", line 40, in <module>
    import roslaunch.config
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/roslaunch/config.py", line 45, in <module>
    import rospkg.distro
  File "/usr/lib/python2.7/dist-packages/rospkg/distro.py", line 44, in <module>
    import yaml
  File "/usr/local/lib/python3.5/dist-packages/yaml/__init__.py", line 284
    class YAMLObject(metaclass=YAMLObjectMetaclass):
                              ^
SyntaxError: invalid syntax