在 Fedora 26 上編譯安裝 ROS (lunar)

好久以前就想學習 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

  • 桌面徹底安裝,會安裝 ROS,rqtrviz,泛機器人庫,2D/3D 仿真器,導航和 2D/3D 視景。
  • 桌面安裝,會安裝 ROS,,rqtrviz,泛機器人庫。
  • ROS 通訊(骨架安裝),會安裝 ROS 包,構建和通訊庫,不安裝圖形界面工具。

其中,第二種是推薦的安裝方式,我也採用這種方式。經過下面的命令,獲取源碼包,這將費時數分鐘。翻譯

$ 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

搜索到以下信息:

https://stackoverflow.com/questions/40262928/error-compiling-opencv-fatal-error-stdlib-h-no-such-file-or-directory

經過添加 -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 就算安裝好了。

相關文章
相關標籤/搜索