<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_URI 和 ROS_ROOT两个变量, 如下图所示:
ROS_ROOT 和 ROS_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. 实验效果
现在我们首先尝试将之前已有代码导入Eclipse中.示例代码可以参考http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29, 其中有两个及其简单的ROS Node代码.一个talker,一个listener.安装上述网站顺序,建好代码.在Terminal中尝试运行OK.现在可以按照上诉导入步骤导入到Eclipse中.导入之后没有任何报错.
如果没有已有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下 Kinect V2+Ros接口安装
Kinect for Xbox one(v2) + Ubuntu 14.04 +ROS