1 前言

本文介绍一种Qt下进行ROS开发的完美方案,使用的是ros-industrial的Levi-Armstrong在2015年12月开发的一个Qt插件ros_qtc_plugin,这个插件使得Qt“新建项目”和“新建文件”选项中出现ROS的相关选项,让我们可以直接在Qt下创建、编译、调试ROS项目,也可以直接在Qt项目中添加ROS的package、urdf、launch,感谢Levi-Armstrong。目前这个插件还在不断完善,有问题或者其他功能建议可以在ros_qtc_plugin的项目主页的讨论区提出。

本文是用的操作系统是ubuntu 14.04 LTS,ROS版本是indigo,Qt版本是Qt5.9。

2 安装Qt和插件ros_qtc_plugin

插件要求Qt 5.5.0以上的版本,下载Qt 5.7.0可以使用apt-get方式安装,Ubuntu14.04 安装指令如下:

$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test
$ sudo add-apt-repository ppa:levi-armstrong/qt-libraries-trusty
$ sudo add-apt-repository ppa:levi-armstrong/ppa
$ sudo apt-get update
$ sudo apt-get install qt57creator-plugin-ros libqtermwidget57-0-dev

出现错误

下列软件包有未满足的依赖关系: qt57creator-plugin-ros : 依赖: libqtermwidget59-0 (>=0.6.1) 但是它将不会被安装 E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

解决办法

$ sudo apt-get update
$ sudo apt install qt59creator
$ sudo apt-get install qt57creator-plugin-ro

然后可以通过win键搜素安装的qt。

之后可以使用qt进行ROS的程序编写与编译。

3 使用ros_qtc_plugin插件新建项目

使用插件的"新建项目"中的"Import ROS Workspace"选项不仅可以新建工作空间还可以导入现有的工作空间,而"新建文件"中的"ROS"下面的"Package"、"Basic Node"等选项可以创建package和和节点、launch文件、urdf文件等。现在创建一个新的catkin工作空间,并且在里面创建一个package。

(1) 新建项目

1) "File"—"New File or Project",选择"Import Project"—"Import ROS Workspace"—"choose"

2) Name和catkin工作空间文件夹名字相同(也可以不同)名为catkin_new,然后选择"Browse"——"创建文件夹"(点击右上角带"+"文件夹),创建一个名为catkin_new的文件夹,如下图,按回车,再选择"Choose"。

3)出现一个对话框,询问新建的工作空间未被初始化,是否执行初始化,选择"yes"

这里相当于执行一次catkin_init_workspace命令,使工作空间初始化。

4) 点击下方的"Generate Project File",再点击"Next" 。

5) 在"Project Management"步骤可以配置版本控制系统,将"Add to version control"中的"Git"修改为"",然后执行"Finish"。

6) 建好的工作空间catkin_new是空的,如下图所示:

(2) 创建package

1) 在catkin_new下面的src上右键单击,选择"Add New...",如下图所示:

2) 然后选择"ROS"——"package"——"choose"

3) 填写package的名字,如test1

填写作者(Authors)和维护者(Maintainers),如果你的Qt环境部没有配置中文支持请不要用中文,否则无法新建package,或者新建的package里面的package.xml会是空文件。

在"Dependencies"下的"Catkin"一栏填写依赖,通常用C++写节点需要添加对roscpp的依赖。

4) 在"Project Management"步骤可以配置版本控制系统,将"Add to version control"中的"Git"修改为"",然后执行"Finish"。

(3) 添加新的节点

1)目前这个package还是空的,没有任何节点。在test1的src文件夹上右键单击,选择"Add New..."。

2) 选择"ROS"——"Basic Node"——"choose",创建一个节点,也就是新建一个.cpp文件。

3) 节点名称写为"node1",则生成一个名为node1.cpp的源文件。

4) 在"Project Management"步骤可以配置版本控制系统,将"Add to version control"中的"Git"修改为"<None>",然后执行"Finish"。

5) 用ROS模板新建的node1.cpp的源文件如下图,是自动生成的一个Hello World程序。

4 编译节点

1) 修改CMakeLists.txt

为了编译成可执行文件,还需要编辑test1的makefile。为test1的CMakeLists.txt加上下面几行,意思是把node1.cpp编译成名为node1的节点。

add_executable(node1 src/node1.cpp)

target_link_libraries(node1

${catkin_LIBRARIES}

)

注意:

上面几行需要放在include_directories后面,在构建项目的时候才会在catkin_new/devel/lib/test1里面生成可执行文件node1.exe,这样后面进行"运行配置"的时候test1包下面才会出现node1节点;如果把上面几行放在include_directories前面会使得构建过程直接在catkin_new/build/test1下面生成可执行文件node1.exe,而devel文件夹下找不到可执行文件,导致后面选择运行节点的时候不会出现这个节点。

2) 编译

修改完CMakeLists.txt之后点击Qt左下角的锤子图标"构建项目catkin_new",点击底边栏的"4 编译输出"可以看到编译结果,如下图:

5 运行节点

1) 运行节点需要修改运行配置,点击左侧栏的"Projects",在"Build Settings"页的"Edit build configuration"一栏选择"Default"。

2) 在下图所示光标处 点击切换到"Run"页,可以看到一个"Add Run Step"的选项,点击出现一个"ROS Step"配置项,可以通过下拉菜单选择package和target(就是该package下的节点),下拉菜单可以通过键入首字母初步定位到你要找的 package位置 。"Add Run Step"的选项其实也是一个下拉菜单,可以选择"Add Launch Step"的选项运行launch文件。

3)点击Qt左下角的小电脑图标,选择"Default"的构建配置,再点击Qt左下角的绿色三角形即可运行"运行设置"页下面配置好的所有Step。

4) 运行结果可以点开底边栏的"ROS Terminals"查看,如下图, 打印了一句 [ INFO] [1470932511.713873863]: Hello world! 如果没有"ROS Terminals",可以在下图鼠标所在位置底边栏有两个上下三角形的地方打开"ROS Terminals"窗口。

6 头文件包含

用插件创建或导入ROS package之后还需要修改.workspace文件,如下图所示:

在<IncludePaths>标签下加入下面这行:

<Directory>/opt/ros/indigo/include</Directory>

这样就可以使得Qt找到ros头文件,比如<ros/ros.h> ,头文件包含语句不再提示找不到文件,输入ros相关函数可以自动补全。

7 修改Qt Creator快捷方式

使从快捷方式启动Qt Creator的同时加载ROS环境变量,否则通过Cmakelists.txt导入的ROS工程运行时出现CMAKE_PREFIT_PATH找不到的错误,如下:

/home/ubuntu/catkin_new/src/ros_tutorials/roscpp_tutorials/CMakeLists.txt:5: error: By not providing "Findcatkin.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "catkin", but CMake did not find one.

打开terminal,输入下面的命令:

$ gedit /home/leon/.local/share/applications/Qt-Creator-ros.desktop

修改 Exec 变量一行,在中间添加 bash -i -c 即改为 Exec=bash -i -c /home/leon/qtc_plugins/qt-creator-build/bin/qtcreator ,注意修改路径,保存并退出。添加 bash -i -c 是为了在通过快捷方式启动Qt Creator的同时加载ROS环境变量(ROS环境变量加载脚本配置在 ~/.bashrc 文件内)。

参考:

SLAM学习笔记-知乎

LeonHuo

张京林要加油

Setup Qt Creator for ROS

github ros-industrial/ros_qtc_plugin项目主页

插件使用问题

ROS学习笔记八:基于Qt搭建ROS开发环境的更多相关文章

  1. Java学习笔记一:三步搭建Java开发环境

    Java开发环境搭建 一:安装JDK: 1.下载地址:http://www.oracle.com/technetwork/java/javase/downloads 非常显眼的下载界面 2.点击下载后 ...

  2. OpenCV2学习笔记02:MSVC2013搭建OpenCV开发环境

    我这里编译的库是通过手动编译的.只是需要注意的是,手动编译一般会产生大量的文件,差不多7个多G的样子,实在是有点浪费硬盘存储呀,其实我们可以删除掉没有用的东西.因为我们在编译的时候指定了一个目录比如我 ...

  3. python之Django学习笔记(一)---搭建Django开发环境和一些基本命令

    1.Django下载 官方下载地址:https://www.djangoproject.com/download/ 2.Django安装 linux/windows安装方法相同,具体有以下俩种 pip ...

  4. 基于eclipse搭建android开发环境-win7 32bit

    基于eclipse搭建android开发环境-win7 32bit 前言:在使用朋友已搭建的Android开发环境时,发现朋友的开发环境版本较低且在update SDk时失败,便决定根据网上文章提示从 ...

  5. 基于Centos搭建 Mono 开发环境

    系统要求: CentOS 7.2 64 位操作系统 安装 Mono 安装前的准备 yum install yum-utils 执行命令添加安装包仓库 rpm --import "http:/ ...

  6. Python3笔记002 - 1.2 搭建python开发环境

    第1章 认识python 1.2 搭建python开发环境 1.2.1 python开发环境概述 python开发环境常见的操作系统: Windows Mac OS Linux 1.2.2 安装pyt ...

  7. 基于Qt搭建ROS开发环境

    参考的博客: http://blog.csdn.net/u013453604/article/details/52186375 http://blog.csdn.net/dxuehui/article ...

  8. OpenCV2学习笔记01:Linux下OpenCV开发环境的搭建

    个人已经厌倦了Windows下的开发方式,于是决定转到Linux平台上来,当然我也知道这个转变会很艰辛,但是我还是要坚持.所以,后面的所有开发我都会基于Linux和Qt,先从开发环境的搭建开始做起,当 ...

  9. Java 学习笔记 第一章:Java语言开发环境搭建

    第一章:Java语言开发环境搭建 第二章:常量.变量和数据类型 第三章:数据类型转换.运算符和方法入门 1.Java虚拟机——JVM JVM(Java Virtual Machine ):Java虚拟 ...

随机推荐

  1. 临远大神,你为啥要建立一个 TASK表。HumanTaskDTO

    临远大神,你为啥要建立一个 TASK表.HumanTaskDTO HumanTask这张表的作用是什么. 为了实现理想中的任务中心.TaskCenter. 首先,工作流可能会完全不包含任何人工节点,全 ...

  2. [React] {svg, css module, sass} support in Create React App 2.0

    create-react-app version 2.0 added a lot of new features. One of the new features is added the svgr  ...

  3. 优化 html 标签 为何能用HTML/CSS解决的问题就不要使用JS?

    优化 html 标签 2018年05月11日 08:56:24 阅读数:19 有些人写页面会走向一个极端,几乎页面所有的标签都用div,究其原因,用div有很多好处,一个是div没有默认样式,不会有m ...

  4. Android反复闹钟(每天)的实现

    MainActivity例如以下: package cc.cc; import java.util.Calendar; import java.util.Locale; import android. ...

  5. Spark调研笔记第3篇 - Spark集群相应用的调度策略简单介绍

    Spark集群的调度分应用间调度和应用内调度两种情况,下文分别进行说明. 1. 应用间调度 1) 调度策略1: 资源静态分区 资源静态分区是指整个集群的资源被预先划分为多个partitions,资源分 ...

  6. IO获取指定目录及其目录下子目录

    一.需求:获取指定目录下,指定扩展名的文件(包含子目录中的) 二.需要用到的方法 1.FilenameFilter :返回抽象路径名的定义中表示此抽象路径名的目录中的文件的数组.  filter.ac ...

  7. md5 js

    js-md5 - npm https://www.npmjs.com/package/js-md5 var rotateLeft = function(lValue, iShiftBits) { re ...

  8. YTU 2598: 编程题B-小平智斗自动售货机

    2598: 编程题B-小平智斗自动售货机 时间限制: 1 Sec  内存限制: 128 MB 提交: 268  解决: 69 题目描述 LYH自动售货机在销售商品时,具有自动找钱功能.但是找零的最小单 ...

  9. POJ - 1422 Air Raid(DAG的最小路径覆盖数)

    1.一个有向无环图(DAG),M个点,K条有向边,求DAG的最小路径覆盖数 2.DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数 3. /* 顶点编号从0开始的 邻接矩阵(匈牙利算 ...

  10. 【转】Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

     一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本 ...