目录
1. 引言
目前有比较多的开发环境可以配置并支持ROS,在ROS wiki:http://wiki.ros.org/IDEs中有简单的介绍。这篇文章主要介绍在QtCreator以及在Eclipse中配置ROS开发环境的方法。作者之前一直使用的开发环境是QtCreator,但是由于QtCreator本身对重构的支持实在太弱了,而近期我对重构的需求很大,Eclipse集成了完备的重构以及单元测试工具,所以决定转用Eclipse来作ROS开发。但是目前搜索到的教程都是比较老的Eclipse版本,软件安装完成后有很多问题,所以决定采用最新的Eclipse 2020.03来进行整个环境的配置。
2. QtCreator配置ROS环境
QtCreator配置ROS的开发环境是非常简单的,只需要安装一个ROS的插件就可以了。详情请参考zhuoyueljl的博客。关于这一部分我就不再展开了,当时选择用QtCreator做ROS开发也是看中了配置过程简单这一点。
3. Eclipse
相对而言Eclipse的配置要复杂一些。先说一下环境,Ubuntu14.04/Ubuntu16.04 64bit,Eclipse2020.03,ROS indigo/kinetic,配置的eclipse版本是2020.03。我在这两个环境下验证了以下流程的可行性。
3.1 安装Eclipse
Eclipse2020.03安装是比较容易的,首先从官网https://www.eclipse.org/downloads/下载安装包。下载之后解压安装包,在安装包下有一个可执行文件eclipse-inst。右击这个文件选择Run(运行)即可打开Eclipse安装界面。如果运行程序报如下图所示的错误说明你需要先配置一下jdk-8。
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo update-alternatives --config java
sudo update-alternatives --config javac
上面的第四条命令是选择当前默认使用哪个版本的jdk,openjdk-8-jdk对应的编号就可以了。经过以上操作配置好openjdk-8-jdk,输入如下命令验证当前的版本是不是1.8。
java -version
如果配置没有问题,以上命令的输出类似于:
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1~14.04-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
配置完成后再次运行上面的程序应该就正常了。
由于我们是做ROS开发,因此在安装界面中选择Eclipse IDE for C/C++ Developers,之后点击INSTALL进行软件安装,软件安装速度是比较快的,一般几分钟就可以装完。
为了以后启动方便,我们创建一个快捷方式,在控制台输入以下命令:
gedit .local/share/applications/eclipse.desktop
在打开的文件中输入以下内容:
[Desktop Entry]
Name=Eclipse
Type=Application
Exec=/home/USERNAME/eclipse/cpp-2020-03/eclipse/eclipse
Terminal=false
Icon=/home/USERNAME/eclipse/cpp-2020-03/eclipse/icon.xpm
Comment=Integrated Development Environment
NoDisplay=false
Categories=Development;IDE;
Name[en]=Eclipse
可以把这个文件拷贝到桌面,这样以后启动eclipse就会方便很多。
3.2 ROS环境配置
配置ROS环境前我们需要有一个现成的ROS工作空间,作为测试,你可以建立一个空的工作空间,里面添加一个hello world的包,先编译一下确认你的工作空间和包可以正常编译。具体怎么创建工作空间这里就不介绍了,请参照ros wiki。
完成了上面的操作之后打开控制台cd到工作ROS的工作空间目录执行以下操作:
catkin_make --force-cmake -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_ECLIPSE_MAKE_ARGUMENTS=-j8
其中--force-cmake表示强制编译,编译工具用的CDT4,这个命令会对工作空间进行编译并在build目录下生成两个 .project隐藏文件,在eclipse中会用到。
打开eclipse,在菜单中选择File-->New-->Project...打开工程创建窗口,在窗口中选择C/C++-->Makefile Project with Existing Code,点击Next进入下一步。在这里我们选择之前创建的工作空间目录,Toolchain选择Linux GCC,如下图所示。之后选择Finish完成导入。
前面的过程结束之后ROS的项目就导入到了eclipse中了,但是还需要做一些配置才能编译运行。在工程的根节点右击选择最下面的Properities进入工程项目配置窗口。从左侧栏单击C/C++ Build,在这个页面中修改编译目录,选择Builder Settings标签页,在Build location的位置后面添加一个build,如下图所示。
从左侧栏选择C/C++ Build-->Environment。在这个页面添加两个环境变量。如下图所示。
接下来浏览到C/C++ General-->Paths and Symbols。在这个页面我们要添加一下ROS的头文件目录,选择Includes标签页下的GNU C++,点击Add,在弹出的窗口中选择File system从文件系统中选择ros的目录,添加完后如下图所示。
添加完成后点击Apply and Close退出工程属性配置。
以上我们配置了编译相关的属性,下面配置运行相关内容。在工程根节点右击选择Run As-->Run Configurations...弹出运行配置窗口,双击左侧栏中的C/C++ Application添加一个运行配置,选中这个运行配置。
在Main标签页下C/C++ Application中填写要运行的可执行文件。这里我们添加的是一个名为hello的ROS Node的路径,注意这里需要添加可执行文件的名称而不仅仅是它所在的目录。添加完后如下图所示。
之后切换到Environment标签页同样添加两个环境变量如下图所示。
完成以上操作后点击Apply应用这些修改,之后关闭配置窗口,至此ROS的环境配置就完成了。在工程根节点右击选择Build Project编译工程看能否通过。之后点击工具栏运行看hello节点能否正常运行。
提示:关于符号无法解析的问题为后期补充,因此界面主题发生了变化。
注意即使编译和运行没有问题了代码页面可能还是会报符号无法解析的错误,代码提示也没有,特别是一些C++标准库解析即使你等很久依然无法解析。我觉得原因是头文件的解析还没有结束,另外当前的配置不支持解析C++的一些高级语言特性。我在网上搜索了很多的解决方案,最终只有一种方法是可用的,那就是在工程根节点右击选择Properties,选择C/C++ Build-->Settings,找到这个页面下的Tool Settings标签页进行配置,但是你打开这个页面发现根本没有这个标签页!不要着急,没有这个页面是因为一个配置项。点击C/C++ Build,这里有一个Makefile generation的配置。勾选Generate Makefiles automatically,这是你发现下面的Build directory路径不对了而且不能修改,先不用管,点击Apply保存配置,如下图所示。
这时你再打开C/C++ Build-->Settings,发现已经有Tool Settings标签页了,选中这个标签页,然后选中GCC C++ Compiler下的Dialect。在Language standard选择需要配置的C++版本,我这里选的是C++14,如下图所示。
完成配置后点击Apply and Close保存配置并退出。之后你要触发Indexer更新索引。在菜单栏选择Window-->Preferences-->C/C++-->Indexer。在这个页面勾选Index source and header files opened in editor,点击Apply and close。这时eclipse开始重新解析索引,等一段时间后发现无法解析的问题解决了。但是还有最后一个问题,你需要把刚才Makefile generation的配置里Generate Makefiles automatically再取消勾选,不然编译路径就不对了。不用担心,即使取消了勾选也不会再出现无法解析的问题。
3.3 配置eclipse
eclipse2020.03功能非常强大,前面配置ROS的环境仅限于能用而已,为了让我们开发更舒服,在这里介绍一些eclipse插件的配置过程。
3.3.1 主题与风格
首先就是主题,在深色主题下代码编写更舒适所以我们先安装一个深色主题。在eclipse菜单栏选择Help-->Eclipse Marketplace...这里可以进行插件安装,在搜索框输入theme回车,你会搜到Darkest Dark Theme with DevStyle这个插件,安装它就可以让你的eclipse变成深色主题了。等待插件安装完成重启eclipse。在重启时会自动进入DevStyle的配置,在其中选择Darkest主题即可,Editors可以选择IntelliJIDEA Dark。后面如果你想修改主题可以到Window-->Preferences-->DevStyle中进行修改。
其次我们需要安装cmake编辑器,不然cmake文件无法高亮。依然是在Help-->Eclipse Marketplace...里面搜索cmake,搜索结果中安装CMake Editor 1.14.0。注意cmake编辑器安装完后它的语法高亮可能与黑色主题冲突,有些颜色看不清楚,你可以在菜单栏Window-->Preferences-->CMakeEd中对相应的颜色进行修改。
然后我们配置一下字体,在Window-->Preferences-->General-->Colors and Fonts中选择Basic下面的Text Font即可对所有编辑器的字体大小,类型进行配置,选中Text Font,点击右侧的编辑即可编辑字体类型与大小。我选择的字体类型是Monospace,字体大小为12。
在编写代码是我们比较推崇的是写doxygen风格注释,doxygen本身是有一些关键字的,我们希望这些关键字能够区别于普通的注释颜色,这样也方便我们判断当前关键字书写是否有误。这里我们需要配置一下才能让doxygen关键字高亮。在Window -> Preferences -> C/C++ -> Editor找到Workspace Default,选择Doxygen这样代码中一旦出现doxygen注释,就会按照对doxygen注释的高亮规则来显示这些注释,你可以在Window-->Preferences-->C/C++-->Editor-->Syntax Coloring页面修改doxygen注释的颜色。在这个页面选择Doxygen下面的子项目,对颜色进行修改。完成这些修改后点击Apply and Close就可以保存这些修改了,这时候你去看一下你的doxygen注释应该已经高亮了关键字。
3.3.2 代码检查与格式化
CppStyle这个插件用于代码风格的自动调整以及代码检查。在Help-->Eclipse Marketplace...搜索cppstyle,安装这个插件。之后在Window-->Preferences-->C/C++-->CppStyle下对这个插件进行配置。在这个页面Clang-format用于进行代码格式化,它可以按照一定的风格对你的代码的格式进行修改。Cpplint是一个静态代码检测工具,它会提示你你的代码有哪些潜在的问题。clang-format和cpplint都需要先安装,之后才能在这里进行配置。
安装clang-format,在控制台输入如下命令查看可以安装的clang-format版本:
sudo apt-cache search clang-format
输出结果类似于:
clang-format-3.3 - Tool to format C/C++/Obj-C code
clang-format-3.4 - Tool to format C/C++/Obj-C code
clang-format-3.5 - Tool to format C/C++/Obj-C code
clang-format-3.6 - Tool to format C/C++/Obj-C code
clang-format-3.8 - Tool to format C/C++/Obj-C code
clang-format-3.9 - Tool to format C/C++/Obj-C code
在其中选择一个版本进行安装:
sudo apt install clang-format-3.9
安装完成后输入如下命令查看clang-format安装位置:
whereis clang-format*
在输出结果中找到你安装的clang-format可执行文件路径,这个后面要用。
接下来我们安装一下cpplint,你可以去github上下载cpplint的源码:https://github.com/google/styleguide,下载完之后解压放到某个目录下。
然后就可以在eclipse中配置clang-format和cpplint了,在Window-->Preferences-->C/C++-->CppStyle页面把clang-format的路径添加进去,然后把cpplint的目录指向刚才下载的styleguide目录下的cpplint/cpplint.py就可以了。勾选下面的Enable cpplint,Run clang-format on file save,然后点击Apply and Close保存修改并退出。如下图所示。
这些配置完之后每次我们保存文件的时候会触发clang-format进行代码格式化,触发cpplint进行代码检查,检查结果将显示在eclipse下方的Console中。注意clang-format运行时可能会报以下错误:
Cannot find .clang-format or _clang-format configuration file under any level parent directories of path (/home/gavin/source/ros_ws/src/hello/src/hello.cpp).
Clang-format will default to Google style.
这是因为clang-format找不到配置文件,所以默认选择Google style对代码进行格式化。因为我比较习惯与llvm的代码格式,所以我们需要生成一个llvm的配置文件,为了方便我选择在根目录也就是“/”目录下来生成这个配置文件,cd到根目录,进行如下操作:
cd /
sudo su
clang-format-3.9 -style=llvm -dump-config > .clang-format
这样clang-format就可以找到这个配置文件并使用llvm对代码进行格式化了。还有一点cpplint的规则检查十分严苛,没几行代码就能检查出一堆问题,有些问题我们可能觉得不是问题,所以需要对这些规则进行一些配置。你可以在Window-->Preferences-->C/C++-->Code Analysis中找到cpplint的配置选项,在这里把一些你认为不重要的选项取消掉就可以了。当然你也可以直接去改cpplint.py。
3.3.3 自动补全
有时候我们希望把一些常用的代码段或者注释段保存起来,在需要的时候通过敲几个字母把一大段内容插入进来,这个功能在eclipse中叫做模板。在Window-->Preferences-->C/C++-->Editor-->Templates中你可以定义自己的模板,这里面已经有一些内置好的木板,我们在编辑代码时,输入这些模板的名字,然后按Ctrl+Space就可以触发补全操作。你可以在Window-->Preferences-->Keys中修改快捷键,在这个页面搜索Content Assist,修改这个项目对应的快捷键就可以了。
关于eclipse的配置到这里基本就结束了,上一张最终的效果图:
参考文献
在作者完成环境配置的过程中参考了大量的资源,这里就不再一一列出了,感谢各位的指点,如果哪里侵犯了网友的知识产权还望海涵并联系作者删贴。
[1]. http://ubuntuhandbook.org/index.php/2016/01/how-to-install-the-latest-eclipse-in-ubuntu-16-04-15-10/
[2]. https://blog.csdn.net/jinking01/article/details/80372445