1. 程式人生 > >在ROS中使用Python3

在ROS中使用Python3

原連結: https://community.bwbot.org/topic/499
當前ROS是隻支援Python2.7的。Python3的支援在ROS的計劃中,詳細的可以看這裡。簡單說來就是要到2019年ROS的N版本才能完全支援Python3。

首先要了解為什麼ROS不能支援Python3.對於純的Python程式碼同時支援Python3和Python2.7是比較容易的,基本上ROS的程式碼也都是支援的。問題在於包含了C++或者C的那部分Python程式碼。Python2.7和Python3的c module程式碼相差很大。一次只能編譯其中的一種版本。而且很多module沒有做好Python3的支援。在Python3環境下也無法編譯。這就是ROS無法支援Python3的原因。目前ROS的核心包都是支援用Python3從原始碼編譯的。但是官方並沒有釋出Python3的軟體包。所以想要使用的話要自己編譯。下面介紹兩種使用Python3的方法。

  1. 使用Python3和Python2.7的混合環境
    原理:使用virtualenv建立一個Python3的環境。然後在這個環境中編譯安裝自己需要的軟體包。在引用軟體包的時候,如果沒有對應的Python3的軟體包,會自動的去Python2.7的環境裡面找。這樣很多軟體包都是可以通用的。當然對於沒有做好Python3支援的軟體包也是沒法用的。

下面以geometry2為例子

sudo apt-get install python3-dev
mkdir catkin_ws # 建立工作空間
cd catkin_ws
mkdir src
cd src 
# 下載geometry和geometry2的原始碼
git clone https://github.com/ros/geometry git clone https://github.com/ros/geometry2 cd .. # 建立虛擬環境 virtualenv -p /usr/bin/python3 venv source venv/bin/activate pip install catkin_pkg pyyaml empy rospkg numpy catkin_make source devel/setup.bash

這樣就能夠成功在Python3下使用tf的相關函數了。

執行Python3程式

Python 3.5.2 (default, Nov 23
2017, 16:37:01) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tf >>> tf.__file__ '/home/xiaoqiang/Desktop/catkin_ws/devel/lib/python3/dist-packages/tf/__init__.py' >>> import tf2_py >>> tf2_py.__file__ '/home/xiaoqiang/Desktop/catkin_ws/devel/lib/python3/dist-packages/tf2_py/__init__.py' >>>

可以看到我們的tf已經是在Python3的路徑下了。

  1. 從原始碼安裝ROS
    首先把ROS都解除安裝乾淨
sudo apt-get purge ros-*
sudo apt-get autoremove

建立ROS工作空間

mkdir ros

建立Python3環境

cd ros
# 把系統預設Python替換成Python3
sudo rm -rf /usr/bin/python
sudo ln -s /usr/bin/python3.5 /usr/bin/python
sudo apt install python3-pip

安裝ros的編譯基礎軟體包

sudo apt-get install python3-rosdep python3-rosinstall-generator python3-wstool python3-rosinstall build-essential
sudo pip3 install catkin_pkg

開始下載相關軟體包

rosinstall_generator desktop --rosdistro kinetic --deps --tar > kinetic-desktop.rosinstall
wstool init -j8 src kinetic-desktop.rosinstall
# 如果上一步有失敗的,執行
wstool update -j 4 -t src

這裡安裝的是kinetic版本。其他版本需要調整對應的引數。

安裝軟體包依賴

rosdep install --from-paths src --ignore-src --rosdistro kinetic -y
sudo apt-get install libtbb-dev python3-pyqt5
sudo pip3 install empy numpy defusedxml netifaces
# 修復 16.04 libboost_python3找不到的問題
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py35.so /usr/lib/x86_64-linux-gnu/libboost_python3.so

編譯工作空間

./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release

如果這個過程中編譯有錯誤,一般是缺少軟體包之類的。需要下載安裝對應的軟體包然後再次編譯。直到全部編譯成功。

新增環境變數

在~/.bashrc裡面新增

source /home/xiaoqiang/Documents/ros/install_isolated/setup.bash

這裡是小強的路徑,你要根據自己的工作空間的位置進行修改。

之後再重新開啟一個終端就可以了。

In [2]: import tf2_ros

In [3]: tf2_ros.__file__
Out[3]: '/home/xiaoqiang/Documents/ros/install_isolated/lib/python3/dist-packages/tf2_ros/__init__.py'

In [4]: 

可以看到現在的ROS使用的Python已經是Python3了。

總結雖然以上兩種方法都可以使用Python3,但是推薦還是使用第一種方法。第二種方法使用起來比較費事,而且一旦使用了Python3就沒辦法使用Pyhon2.7了。有些軟體包並沒有做好Pyhon3的支援。這樣會在使用中產生不少問題。