ROSでPython3を使う方法


背景

ROS1は公式にはPython2.7にしか対応していない。
けどいまさらPython2というのはやりづらい。
Web上にはソースからPython3でインストールする例が多いけど、時間がかかるし、なんだかんだうまくいかない。

基本

ここを抑えておけばエラーが起きても対応できるし、応用もできる。

  • ROSのツール類(roscore, roslaunch, rosrun, catkinなど)はやっぱりpython2じゃないとだめ
  • rospyだとかmsgs類(std_msgsとか自作のmsgs)などROSノード実行に必要なものははpython3でも動く
  • ROSのツール類はshebangにより/usr/bin/pythonで起動する
  • 以上からROSツール類は標準のpython2.7(/usr/bin/python)で実行され、python3で書かれた自作ノードは仮想環境上のpython3(/home/xxx/anaconda3/bin/pythonなど)で実行される状態が幸せ

HOW

Install

まず公式の通りにインストールする。
その際に仮想環境(pyenv, conda)等からは抜けておくこと。
ubuntu 18.04の場合python2.7がそもそも入ってなかったりだけど大丈夫。
pythonと打って標準の3.6が起動する状態でOK
http://wiki.ros.org/melodic/Installation/Ubuntu
この時点でpythonコマンドのリンク先がpython2.7になっているはず

環境構築

catkin_wsの作成も公式通り
この場合も仮想環境からは抜けておくこと
http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment

Python3に切り替え

condaなりpyenvなり(私はcondaを使ってます)python3に切り替える。(pythonとうって仮想環境上のpython3が起動する状態)

このときecho $PYTHONPATHすると/opt/ros/melodic./xxx/catkin_ws内のdist-packageが設定されているはず。
この状態でroslaunchなりrosrunなりすると、roslaunch,rosrun自体はpython2.7で実行されるが、ROSノードは仮想環境上pythonで実行される。

当然この状態だとROSノード実行に必要なものがpython3の環境に含まれていないのでエラーが出る(rospkgなど)がpython3のpipでインストールできるのでエラーが無くなるまでpipでインストールする。

その他

この状態だとpython2で書かれたノードもpython3で実行されてしまうけど、仮想環境を抜けるなりpython3に書き直すなりすればOK。

環境

Ubuntu 18.04
python3.7(Anaconda 3.7)
ROS melodic