好久以前就想学习 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 就算安装好了。