在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的方法。
- 使用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的路徑下了。
- 從原始碼安裝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的支援。這樣會在使用中產生不少問題。