<ROS; Ubuntu14.04下ROS indigo Eclipse开发环境搭建

Posted 小贝也沉默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了<ROS; Ubuntu14.04下ROS indigo Eclipse开发环境搭建相关的知识,希望对你有一定的参考价值。

第三次更新
现在我一直采用的编辑方式,再次更新于此,希望能够和大家分享一下,毕竟合理使用IDE能够极大的提高编码的速度和身心愉悦程度。如果对其他不敢兴趣的话,请直接跳到 1. 目前最优解决方案


非常愧疚, 之前写的内容早就已经不能完成想要达到的效果, 就连ROS官网上面, 都推荐使用catkin的方式来管理ROS包, 而非rosbuild。 而之前的内容仅在rosbuild的环境下可以使用。并且, 越来越多的代码使用C++11标准, 而默认的Eclipse是不支持 C++11 的. 前两部分是最新更新的内容, 关于第三部分的内容, 其实对于大部分人而言, 是可以忽略的了。

今天师兄推荐了一本书, Mastering ROS for Robotics Programming, 大致翻了一下, 感觉内容很不错, 做ROS的同学推荐看一看. 另外, 这本书提到了怎么配置Eclipse作为ROS的IDE, 按照书上的步骤, 下述中第一部分的内容就出来了. 亲测好使, 所以记录下来和大家进行分享. 另外在ROS IDEs中的内容, 包含怎么导入catkin工作空间的方法, 之前也试过, 感觉不怎么好用. 配置到Eclipse中后, Eclipse会有很多错误提示, 但编译是没有问题的. 看到满篇的红线, 真的很让人抓狂!! 第二部分是在之前的工作中一直使用的办法, 解决了错误红线的问题, 可以编辑, 可以编译, 在命令行中也可以运行. 但是附加的工作量就是所有代码写好之后, 将要把代码拷贝到对应的catkin工作空间中. 所以有如下结论:

推荐使用第一种方式进行ROS开发环境配置, 可选使用第二种方式, 第三种方式是在rosbuild方式编译的选择. 而关于 ROS IDEs中catkin的环境配置, 建议直接不看了.

1. 目前最优解决方案

第三次更新内容
留个坑在这儿,切换系统之后配图加文字再进行说明。
仍然是在catkin工作目录下创建包


在之前的工作中, 使用另一种方式, 也成功编译过ROS的代码。 事情是这样的, 代码分了两层, 第一层只依赖于Ubuntu, 我是直接在Eclipse里面新建工程, 完成第一层的工作。 第一层完成之后, 在第一层的基础上, 写了跟ROS相关的代码, 通过配置ROS路径以及各种库, 也成功运行了ROS节点。示例如下。

首先, 新建一个C++ Project, 创建文件gen_msg.h, 内容如下:

class GenMsg 
public:
  int getValue() 
    return ++val_;
  
private:
  int val_;
;

再新建一个main.cpp, 内容如下:

#include <ros/ros.h>
#include <std_msgs/Int64.h>
#include "gen_msg.h"

int main(int arc, char* argv[]) 
  ros::init(arc, argv, "test_ros");
  ros::NodeHandle nh;
  GenMsg gen;
  ros::Rate rate(20);
  std_msgs::Int64 msg;

  ros::Publisher pub = nh.advertise<std_msgs::Int64>("/test_ros/Int64", 1);
  while (ros::ok()) 
    msg.data = gen.getValue();
    pub.publish(msg);
    rate.sleep();
  

  ros::shutdown();

显然, #include <ros/ros.h>, 出现了黄线, 找不到这个头文件。 点击[Project] -> [Properties] -> [C/C++ Build] -> [Settings] -> [GCC C++ Compiler] -> [Inlucdes], 新增下列包含目录:



[GCC C++ Linker] -> [Libraries]中新增库路径以及需要链接的库, 按照上述代码中的需求, 只是链接下图所示的库就足够了。 若是用到了别的库, 那么再新增对应的库名称就好。

roscpp
rosconsole_backend_interface
rosconsole_log4cxx
cpp_common
xmlrpcpp
rostime
roscpp_serialization
rosconsole



点击[OK], 返回主界面, 又可以开开心心的编译了。



这种方式可以在Eclipse中编写代码以及编译代码, 但不能直接在Eclipse中运行。可以直接在命令行中运行。 当然, 首先需要在一个命令行中运行roscore

cd /path/to/your/workspace/test_ros/Debug/
./test_ros

没有任何输出, 没有消息就是最好的消息。 在打开一个命令行, 可以通过rostopic list来查看我们发布的话题/test_ros/Int64是否存在, 或者通过rostopic echo /test_ros/Int64来打印消息。结果如下图所示:



这种方式可以一步一步, 从新建工程, 到完成代码, 都在Eclipse中完成。 但是不能调试, 不能在Eclipse中运行该二进制文件。 具体原因是什么, 我也不太清楚。 但能够编写并编译代码, 已经很开心了。 关于调试的问题, 只能另想办法了, 比如写日志等。所有代码写好之后, 再将代码复制到catkin_ws/src中去, 写好CMakeLists.txt, 一个工程就完成了。

2. 配置已有Catkin包到Eclipse

对于一个程序员来说, 有一个好用的IDE绝对是必要的, 对于写代码能够带来极大的好处。 接触ROS也有好几年了, 之前一直也受到在编辑器里面写代码的困扰。很苦比…

2.1. Global settings in Eclipse IDE

  • [Window] -> [Preferences] -> [C/C++] -> [Build] -> [Settings]中, 选择Discovery标签, 选中CDT GCC Build Output Parser [Shared] 选项, 更改下面的Compiler command pattern为:(.*gcc)|(.*[gc]\\+\\+)|(.*clang), 更改Container to keep discovered entries为最后一个选项: Project(use when settings are the same for all files in the project). 设置过程如图所示:



  • 还是在刚刚的标签页, 选中 CDT GCC Buillt-in Compiler Settings [Shared], 更改下面的选项Command to get compiler specs: $COMMAND -E -P -v -dD -std=c++11 "$INPUTS"



2.2. ROS compile script for Eclipse IDE

在解决使用Eclipse编译代码的问题之前, 首先要解决的就是source /opt/ros/indigo/setup.bash的问题. 在命令行中通过命令catkin_make可以完成编译, 是因为这个脚本已经写入到~/.bashrc中, 打开命令行时已经被source.

打开命令行, 输入: sudo vim /usr/local/bin/eclipsemake, 将下述内容复制到该文件中:

#!/bin/bash
source /opt/ros/indigo/setup.bash
make "$@" VERBOSE=1 -j8

打开命令行, 输入: sudo vim /usr/local/bin/eclipsemake-tests, 将下述内容复制到该文件中:

#!/bin/bash
source /opt/ros/indigo/setup.bash
make "$@" VERBOSE=1 -j8 run_tests

最后, 再更改两个文件的权限: sudo chmod +x /usr/local/bin/eclipsemake*

2.3. Importing the project into Eclipse

完成上述过程, 下面需要将一个工程导入到Eclipse中, 下面的步骤将以ur_modern_driver包作为示例, 当然, 你也可以用自己的catkin工作空间中的包作为导入的工程。 ur_modern_driver包可以通过git clone https://github.com/ThomasTimm/ur_modern_driver.git /path/to/your/catkin_ws/src/ur_modern_driver命令进行下载。
[New Project ] -> [C/C++] -> [MakeFile Project with Existing Code],



如上图所示, 点击Finish, 即可看到Eclipse左侧Project Explorer视图中出现了我们的ur_modern_driver包的工程文件。当然, 我们还需要再配置一下该工程。 [Project] -> [Properties] -> [C/C++ Build],



如上图所示, 更改Build command: eclipsemake, 更改Build location/path/to/your/catkin_ws/build/PROJECT_NAME

[C/C++ Build] -> [Environment] 中添加一个变量VERBOSE, value = 1. 如下图所示:



[C/C++ General] -> [Paths and Symbols] -> [#Symbols]GNU C++添加一个Symbol __GXX_EXPERIMENTAL_CXX0X__, 不设定任何值。 如下图所示:



[C/C++ General] -> [Preprocessor Includes Paths, Macros etc.] -> [Providers] 中选择 CDT GCC Build Output Parser [Shared]CDT GCC Built-in Compiler Settings [Shared], 并且两种都将 Use global provider shared between projects选中。



配置结束后, 就可以开开心心的编译了。* [Project]* ->* [Build Project]*. 你会在Eclipse中看到如下内容:



2.4. Adding run configurations to run ROS nodes in Eclipse

在上面的基础上, 已经是可以开开心心的编写代码, 以及编译代码了。 但是还是不能在Eclipse中运行代码。 一般而言, 个人还是推荐直接在命令行中运行生成的节点, 而不是在Eclipse中运行。当然, 想在Eclipse中运行节点, 也是可以的, 主要也就是配置以下run configurations.

[Run As] -> [Run Configurations], 双击[C/C++ Application], 按下图配置运行的二进制文件。



[Environment]中, 配置ROS_MASTER_URIROS_ROOT两个变量, 如下图所示:



ROS_ROOTROS_MASTER_URI的值可以打开Terminal,输入下述命令,然后复制打印出的值到Value即可.

$ echo $ROS_ROOT # http://localhost:11311
$ echo $ROS_MASTER_URI # /opt/ros/indigo/share/ros



保存后, 点击右下角的[Run]按键即可运行了。当然, 你还需要运行roscore, 运行ur_modern_driver会出现如下输出, 至少证明, 该节点确实被运行起来了。



3. ROSBUILD配置方式

前记:本文主要是翻译http://wiki.ros.org/IDEs中的第一部分关于Eclipse中ROS环境配置.其中需要在Terminal中输入的指令均以’ $ ’ 开头,黑体部分即为指令.由于本人英语能力有限(目前为止四级都还没有过),所以很多自己不太能读懂的地方都是意会,而且有部分内容尚未翻译.

3.1. 安装Eclipse

网上关于Ubuntu下安装Eclipse的帖子非常多,我也就不整理了.总的说来其实就两步,先安装JDK,然后解压Eclipse就OK了.需要的可以百度一下,一抓一大把.

3.2. 创建工程文件

3.2.1 创建ROS工程包并转成Eclipse工程文件

首先,cd到自己的工作空间.创建一个自己的Package,使用下诉命令.

$ roscd
$ cd camera
$ roscreate-pk gusb_cam_pub sensor_msgs std_msgs roscpp

如果对上述命令的文件目录有疑问,可查看上一篇博客. 我的工作空间目录是 ~/workspace/ROS, roscd首先是直接进入该目录.如果你roscd没有进入到你所新建的工作目录,说明你没有执行source ~/workspace/ROS/setup.bash .你也可以打开Terminal,输入 echo $ROS_PACKAGE_PATH .查看输出信息,是否含有你新建的工作目录. 我在工作目录下新建了一个文件夹,即对应教程中的sanbox文件夹.文件夹名是 camera. 所以在第三条命令执行前,我的完整目录应该是 ~/workspace/ROS/camera .执行第三条指令,即在该目录下新建ROS Package.包名是cam_pub(因为下一步工作我准备编写一个获取USB Camera数据然后通过Publish/Subscribe的形式发布出来的节点). 附加依赖包有 sensor_msgs和std_msgs. 然后,执行:

$ cd cam_pub
$ make eclipse-project

3.2.1.1 创建多个Eclipse工程文件

cd到你的package所在目录.按照上述我的工作目录,执行下述指令的目录应该是在 ~/workspace/ROS/camera .在该目录下,保存着之前我所创建的多个工程文件.然后运行

$ rosmake –target=eclipse-project –specified-only *

3.3. 导入工程到Eclipse

现在,开启Eclipse, File(文件) → Import(导入) → Existing projects into workspace(已存在的工程到工作空间),



点击, 然后选择路径到上诉已创建好的工程目录.



此处一定要注意,不能选择[Copy projects into workspace], 复制整个工程到Eclipse工作目录后,编译运行会出现问题. 点击, 完成整个导入过程.

3.4. 实验效果

  1. 现在我们首先尝试将之前已有代码导入Eclipse中.示例代码可以参考http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29, 其中有两个及其简单的ROS Node代码.一个talker,一个listener.安装上述网站顺序,建好代码.在Terminal中尝试运行OK.现在可以按照上诉导入步骤导入到Eclipse中.导入之后没有任何报错.

  2. 如果没有已有Package需要导入,现在尝试第二种可能,就是在按照步骤2中创建好自己的Package,但是没有任何代码.可以看到,Eclipse中src文件夹是空文件夹,没有任何源码文件.现在尝试在Eclipse中创建源码文件,编辑代码. 右键单击src文件夹→New → Source File, 输入文件名talker.cpp,单击Finish.复制1)中网站所给出的talker.cpp代码.复制进来应该是没有任何错误的.但是我在复制之后有很多错误.我Project→ Clean…了一下,然后Project→ Build All,就OK了.没有任何错误.我也不知道为什么.

在下图中可以看到Eclipse中关于导入的节点文件夹中所包含的所有文件夹以及文件.



之前接触过ROS的朋友肯定知道,在写好代码之后均需修改CmakeList.txt,然后在Terminal中make才能编译源码.在Eclipse中同样需要这样.双击选择CmakeLists.txt,在文件末尾添加下述文字.

rosbuild_add_executable(talker src/talker.cpp)
rosbuild_add_executable(listener src/listener.cpp)

现在点击Project→ Build All, 即可编译.在文件夹bin中可以看到生成的可执行文件.一个talker,一个listener.

3.4.1. 在Eclipse中运行ROS可执行文件

在Eclipse中运行和调试ROS代码,最重要的一步是配置launchconfiguration.点击Run→ Run Configuration… → C/C++ Application (双击或者点击New),选择你所要运行的程序.在EnvironmentTab中,新增(至少)

ROS_ROOT
ROS_MASTER_URI



如果你不知道ROS_ROOT或者ROS_MASTER_URI的值是什么.可以打开Terminal,输入下述命令,然后复制打印出的值到Value即可.

$ echo $ROS_ROOT
$ echo $ROS_MASTER_URI



现在打开Terminal,输入$ roscore,然后在Eclipse中分别运行talker,和listener.依次可见到如下效果.说明ROS在Eclipse中环境搭建成功.并且ROSNode运行正常. 运行talker后的输出显示.



运行listener后的输出显示.



以上是关于<ROS; Ubuntu14.04下ROS indigo Eclipse开发环境搭建的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu14.04安装和配置ROS Indigo

Ubuntu14.04安装和配置ROS Indigo

ubuntu14.04下 Kinect V2+Ros接口安装

Kinect for Xbox one(v2) + Ubuntu 14.04 +ROS

ubuntu 14.04 server(amd64) 安装ros indigo

ubuntu14.04 安装Kdevelop 进行ROS开发