僕が今勤める会社は Chainer, CuPy, Optuna などのPython製オープンソースソフトウェアとして公開しているくらいですから、Pythonistaがたくさんいます。 PythonといえばPython3でしょうという暗黙の了解というか威圧感は否めません(笑)

残念ながらROS1のPythonバージョンの公式サポートは2のままですが、公式パッケージの一部はソースコードビルドすればPython3にも対応しているという噂は昔から囁かれていました。

https://github.com/ros/ros_comm/issues/1208#issuecomment-340605810

Python2自体のメンテナンスは2020年で終わります。残された時間は1年と少しです。それまでに

  1. ROS2のPython3ライブラリに全てのパッケージの実装を置き換える
  2. ROS2のPython3ライブラリでROS1のPython2ライブラリを再実装する
  3. ROS1のPython2ライブラリをPython3対応に修正する

のどれかが実現されなくてはなりません。1は1年では終わらないでしょう。それくらいROSエコシステムは巨大になってきました。現実的には2が進むと思われます。なので僕は3で進めてみましょう。

ソースコードビルド準備

まずは ros_comm をビルドすることを第1目標とします。 rospy がPython3で動くようになります。

  • OS: Ubuntu 18.04
  • ROS: Melodic

環境で進めます。基本的にはソースコードビルドによるインストール手順に従いますが、aptインストールではPython2のライブラリがインストールされてしまうため、pip3インストールして明示的にPython3のライブラリをインストールする必要があります。

http://wiki.ros.org/Installation/Source

sudo -H pip3 install -U trollius
sudo -H pip3 install -U rosdep rosinstall-generator wstool rosinstall
sudo rosdep init
rosdep update
mkdir -p ~/ros/melodic/src
cd ~/ros/melodic
rosinstall_generator ros_comm --rosdistro melodic --deps > melodic-ros_comm.rosinstall

また、公式手順ではrosinstall_generator--tarオプションをつけていますが、それでは以下のようなエラーが出ます。オプションを外しクローンに変更しましょう。

rosinstall_generator ros_comm --rosdistro melodic --deps --tar > melodic-ros_comm.rosinstall
wstool init -j4 src melodic-ros_comm.rosinstall
[catkin] Fetching https://github.com/ros-gbp/catkin-release/archive/release/melodic/catkin/0.7.14-0.tar.gz (version catkin-release-release-melodic-catkin-0.7.14-0) to /home/youtalk/ros/melodic/src/catkin
ERROR [vcstools] Tarball download unpack failed: file could not be opened successfully[/vcstools]
[class_loader] Fetching https://github.com/ros-gbp/class_loader-release/archive/release/melodic/class_loader/0.4.1-0.tar.gz (version class_loader-release-release-melodic-class_loader-0.4.1-0) to /home/youtalk/ros/melodic/src/class_loader
...

ビルド & 動作確認

ROS1が使うPythonのバージョンは環境変数で取得できるようです。一応確認した上で、依存ライブラリをインストール、catkin_makeと進めましょう。

echo $ROS_PYTHON_VERSION
3
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release

無事ビルドできたら後はもう動くはずです。

source ~/ros/melodic/install_isolated/setup.zsh
python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import rospy
>>> rospy.logwarn('Hello Python3')
Hello Python3

ユニットテストはPython2で書かれたままのようでなので、実行はしていません。完全に正常実行できているかどうかは未確認です。

とりあえず最初の一歩は上手くいったので、DockerイメージかDEBパッケージの形で再現実行できるように継続して取り組む予定です。