好久以前就想學習 ROS,在官網 (http://wiki.ros.org) 上看過一些文檔。但也只是解了下結點 (Node) 、話題 (Topic) 、消息 (Message) 之類的。看到後面的一些東西就以爲很抽象,仍是裝一個 ROS 邊學邊操做纔好。node
個人電腦上裝了雙系統,win10+Fedora26。ROS 目前好像只爲 Ubuntu 和 Mac OS X 提供預編譯的軟件包。我不想再安裝一個 Ubuntu,也沒錢買 Mac,只好在 Fedora 上從源碼編譯安裝了。ROS 的官網提供了相關的教程,我是照着下面這個來操做的。ROS 版本是最新的 Lunar 。python
http://wiki.ros.org/lunar/Installation/Sourcelinux
下面作個簡單的翻譯:c++
1.一、安裝一些工具和依賴bash
$ sudo dnf install python-rosdep python-rosinstall_generator python-wstool python-rosinstall @buildsys-build
1.二、初始化 rosdep工具
$ sudo rosdep init $ rosdep update
2.一、建立 catkin 工做空間學習
$ mkdir ~/ros_catkin_ws $ cd ~/ros_catkin_ws
有三種安裝方式:ui
其中,第二種是推薦的安裝方式,我也採用這種方式。經過下面的命令,獲取源碼包,這將費時數分鐘。翻譯
$ rosinstall_generator desktop --rosdistro lunar --deps --tar > lunar-desktop.rosinstall $ wstool init -j8 src lunar-desktop.rosinstall
在開始編譯以前,確保安裝了全部依賴:orm
$ rosdep install --from-paths src --ignore-src --rosdistro lunar -y
開始編譯:
$ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
一共要編譯190個包。在這個過程當中,沒有問題是不可能的,有問題纔是正常的。
首先,在編譯到第27個包 opencv3 時,遇到了以下錯誤:
/usr/include/c++/7/cstdlib:75:15: 致命錯誤:stdlib.h:No such file or directory #include_next <stdlib.h> ^~~~~~~~~~ 編譯中斷。 make[2]: *** [modules/highgui/CMakeFiles/pch_Generate_opencv_highgui.dir/build.make:64:modules/highgui/precomp.hpp.gch/opencv_highgui_Release.gch] 錯誤 1 make[1]: *** [CMakeFiles/Makefile2:3734:modules/highgui/CMakeFiles/pch_Generate_opencv_highgui.dir/all] 錯誤 2
搜索到以下信息:
經過添加 -DENABLE_PRECOMPILED_HEADERS=OFF 選項,禁用預編譯頭文件。繼續。
$ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release -DENABLE_PRECOMPILED_HEADERS=OFF
而後,編譯到第69個包 qt_gui_cpp,在其編譯到88%時,出現以下錯誤:
File "/home/fly/ros_catkin_ws/install_isolated/share/python_qt_binding/cmake/sip_configure.py", line 19, in __init__ 'qt_archdata_dir': qtconfig['QT_INSTALL_DATA'], KeyError: 'QT_INSTALL_DATA' make[2]: *** [src/qt_gui_cpp_sip/CMakeFiles/libqt_gui_cpp_sip.dir/build.make:90:sip/qt_gui_cpp_sip/Makefile] 錯誤 1 make[1]: *** [CMakeFiles/Makefile2:375:src/qt_gui_cpp_sip/CMakeFiles/libqt_gui_cpp_sip.dir/all] 錯誤 2 make: *** [Makefile:141:all] 錯誤 2 <== Failed to process package 'qt_gui_cpp': Command '['/home/fly/ros_catkin_ws/install_isolated/env.sh', 'make', '-j4', '-l4']' returned non-zero exit status 2
找到 ros_catkin_ws/install_isolated/share/python_qt_binding/cmake/sip_configure.py 文件,打開。能夠看到:
class Configuration(sipconfig.Configuration): def __init__(self): env = copy(os.environ) env['QT_SELECT'] = '5' qtconfig = subprocess.check_output( ['qmake', '-query'], env=env, universal_newlines=True) qtconfig = dict(line.split(':', 1) for line in qtconfig.splitlines()) pyqtconfig = { 'qt_archdata_dir': qtconfig['QT_INSTALL_DATA'], 'qt_data_dir': qtconfig['QT_INSTALL_DATA'], 'qt_dir': qtconfig['QT_INSTALL_PREFIX'], 'qt_inc_dir': qtconfig['QT_INSTALL_HEADERS'], 'qt_lib_dir': qtconfig['QT_INSTALL_LIBS'], 'qt_threaded': 1, 'qt_version': QtCore.QT_VERSION, 'qt_winconfig': 'shared', } if sys.platform == 'darwin': pyqtconfig['qt_framework'] = 1 sipconfig.Configuration.__init__(self, [pyqtconfig]) macros = sipconfig._default_macros.copy() macros['INCDIR_QT'] = qtconfig['QT_INSTALL_HEADERS'] macros['LIBDIR_QT'] = qtconfig['QT_INSTALL_LIBS'] macros['MOC'] = 'moc-qt5' self.set_build_macros(macros)
這個程序經過命令 qmake -query 獲取QT相關的環境變量。在個人電腦上運行這個命令,什麼也沒有輸出。查看 qmake 的版本,竟然是qt 3.3的。
$ qmake -query $ qmake -v Qmake version: 1.07a (Qt 3.3.8b) Qmake is free software from Trolltech ASA.
我以前安裝的明明是 qt5!查看 qmake 的位置,發現有兩個。一個是 qt3.3 的,一個是 qt5 的。qt5 的那個 qmake 是能夠正常輸出環境變量的。
$ whereis qmake qmake: /usr/bin/qmake /usr/lib64/qt-3.3/bin/qmake $ ls -l /usr/bin/qmake lrwxrwxrwx. 1 root root 18 9月 3 12:30 /usr/bin/qmake -> /usr/bin/qmake-qt5 $ /usr/bin/qmake -query QT_SYSROOT: QT_INSTALL_PREFIX:/usr/lib64/qt5 QT_INSTALL_ARCHDATA:/usr/lib64/qt5 QT_INSTALL_DATA:/usr/share/qt5 QT_INSTALL_DOCS:/usr/share/doc/qt5 QT_INSTALL_HEADERS:/usr/include/qt5 QT_INSTALL_LIBS:/usr/lib64 QT_INSTALL_LIBEXECS:/usr/lib64/qt5/libexec QT_INSTALL_BINS:/usr/lib64/qt5/bin QT_INSTALL_TESTS:/usr/lib64/qt5/tests QT_INSTALL_PLUGINS:/usr/lib64/qt5/plugins QT_INSTALL_IMPORTS:/usr/lib64/qt5/imports QT_INSTALL_QML:/usr/lib64/qt5/qml QT_INSTALL_TRANSLATIONS:/usr/share/qt5/translations QT_INSTALL_CONFIGURATION:/etc/xdg QT_INSTALL_EXAMPLES:/usr/lib64/qt5/examples QT_INSTALL_DEMOS:/usr/lib64/qt5/examples QT_HOST_PREFIX:/usr/lib64/qt5 QT_HOST_DATA:/usr/lib64/qt5 QT_HOST_BINS:/usr/lib64/qt5/bin QT_HOST_LIBS:/usr/lib64 QMAKE_SPEC:linux-g++ QMAKE_XSPEC:linux-g++ QMAKE_VERSION:3.0 QT_VERSION:5.7.1
再查看一下搜索路徑:
$ echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/fly/.local/bin:/home/fly/installs/bin:/home/fly/.local/bin:/home/fly/installs/bin
原來是由於 qt3.3 的 qmake 覆蓋了 qt5 的 qmake 。找到 /etc/profile.d/ 目錄,將qt.sh和qt.csh兩個文件重命名。
$ cd /etc/profile.d # mv qt.sh qt.sh.bak # mv qt.csh qt.csh.bak
用 sourc /etc/profile 好像不能使改變馬上生效。只好用最笨的方法,重啓電腦了。
而後,再次輸入以前的命令繼續編譯。這以後就一路暢通,一直到編譯完成。
若是後面還有問題,多是有依賴沒有安裝。好比 python-qt5-devel 之類的。
最後,運行個小例子。
打開三個終端,每一個終端裏都要先運行以下命令,以添加ROS搜索路徑。
$ source ros_catkin_ws/install_isolated/setup.bash
在第一個終端裏執行以下命令,啓動 roscore。
$ roscore
在第二個終端裏執行如下命令,運行 turtlesim_node 結點。
$ rosrun turtlesim turtlesim_node
會打開一個窗口,出現以下圖的畫面。
在第三個終端裏執行以下命令,啓動操做節點。
$ rosrun turtlesim turtle_teleop_key
而後在第三個終端裏面,就能夠經過鍵盤來控制小烏龜運動了。左右鍵是轉向,上下鍵是前進或後退。
到此 ROS 就算安裝好了。