執行測試平台:小強ros機械人
當前ros是只支援python2.7的。python3的支援在ros的計畫中,詳細的可以看這裡。簡單說來就是要到2023年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
git clone
git clone 2
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
>>> 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的支援。這樣會在使用中產生不少問題。
python3在flask中使用mysql報錯
今天在python3 flask中使用mysql 無論怎麼弄都報錯 importerror no module named mysqldb 按照 stack overflow 上 說pip install mysqlclient或者pip install mysql python 結果都安裝不上,最...
在ROS中使用nodelet
nodelet的作用 減少在ros中傳遞資料的延遲。在同乙個程序內,執行多個node,通過指標傳遞資料,使得程序內訊息傳遞時不產生複製成本。下面是乙個使用nodelet原始檔的例子 namespace nodelet tutorial math private virtual void oninit...
在python3中使用pypcd讀取點雲資料
pypcd的原始碼可以在找到。通過下面的指令可以安裝。git clone在這裡 pull 9可以看到解決python3相容問題的乙個方案。將它fetch到本地。cd pypcd git fetch origin pull 9 head python3 git checkout python3執行下列...