在 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 就算安装好了。