QtCreator与catkin命令两种方式开发ROS程序(图示加代码)

  • 一、Qt Creator安装及开发ROS
    • 1.安装Qt Creator
    • 2.使用Qt Creator开发ROS
      • 1.创建工作空间
      • 2.创建程序包
      • 3.创建节点
      • 4.编译
      • 5.运行
  • 二、使用catkin命令开发ROS程序
    • 1.创建工作空间
    • 2.创建程序包
    • 3.在目录src添加程序文件
    • 4.编译配置CMakeLists.txt
    • 5.程序包配置package.xml
    • 6.利用catkin进行编译安装
    • 7.运行

最近学习无为斋主的《机器人ROS开发实践》的ROS编程部分,编译运行遇到了一些麻烦,所以记录下来,以免忘记和方便他人学习。
ROS编译运行有两种方式:1、用IDE开发工具Qt Creator来创建ROS程序;2、通过命令行使用catkin编译工具创建ROS程序。首先介绍第一种方式。

一、Qt Creator安装及开发ROS

1.安装Qt Creator

本次试验基于Ubuntu 18.04 LTS(兼容Ubuntu 20.04 LTS),Ubuntu系统库自带的qtcreator并没有ROS插件,需要自己通过ppa方式安装,网上多是基于14.04版本的,且较为繁琐,并不推荐。这里要介绍的是带有ROS插件的Qt Creator安装,链接如下:
ros-qtc-plugin How to Install (Users)
官网有两种安装方式:在线和线下。在线安装非常慢,只有十几K,不推荐,建议线下安装,使用Ubuntu的下载工具uGet+aria21,分分钟搞定。
下载文件名为qtcreator-ros-bionic-latest-offnline-installer.run,使用如下命令安装:

mkdir /opt/QtCreator && cd /opt/QtCreator
mv ~/下载/qtcreator-ros-bionic-latest-offnline-installer.run /opt/QtCreator
sudo ./qtcreator-ros-bionic-latest-offnline-installer.run

弹出安装界面,按链接中的步骤一步步走即可。

由于Ubuntu 20.04刚刚发布,更新博客前,ros-qtc-plugin插件的官方并没有更新20.04的版本,但是经过博主测试,18.04的版本即qtcreator-ros-bionic-latest-offnline-installer.run文件也可以在20.04上使用。虽然20.04继承了qtcreator,但是并没有对应的ros插件,所以博主还是推荐使用18.04的版本进行安装。

2.使用Qt Creator开发ROS

为了开发ROS,首先需要创建工作空间,然后创建程序包,接下来根据需要编写消息文件、服务文件,动作文件等资源文件,然后利用catkin_make编译生成相应的编程语言目标文件,最后创建节点、launch文件、机器人模型等。
Qt Creator为开发ROS程序提供了良好的代码编辑、编译、调试工具,在本小节中,我们将介绍如何利用Qt Creator开发一个名为“Hello ROS”的基本节点。

1.创建工作空间

首先,打开QtCreator的“New Project”,并选择“Other Project”,选择“ROS Workspace”模板,如图1所示:

图1:选择ROS Workspace创建项目
然后,设置项目名为catkin_ws,设置工作空间路径为~/ros/catkin_ws,其中~代表当前用户目录。ROS版本默认选择Melodic,编译系统选择CatkinMake,设置完成后点击“下一步”。设置工程名和位置如图2所示:

图2:设置工程名和目录

最后,设置GIT、SVN、CVS等版本控制系统,默认无。点击“完成”按钮即可完成工作空间的创建,如图3所示:

图3:设置子项目和添加版本控制

ROS会创建catkin_ws.workspace文件设定ROS版本和编译系统,并创建src目录和工作空间的CMakelists.txt文件,CMakelists.txt文件对catkin编译系统进行了配置,如图4:

图4:ROS工作空间

2.创建程序包

工程创建完之后,就可以创建程序包了。右键点击图4的src目录,选择“New File”创建程序包,在弹出的界面选择ROS–>Package,然后点击“Choose”,如图5所示:

图5:创建程序包
在弹出的窗口中,设置包名及路径,默认为src目录,在所示的Catkin中添加依赖roscpp、rospy、std_msgs,依赖之间用逗号隔开,这意味着该程序包支持C++和Python两种开发语言,并支持ROS标准消息输出,最后点击“Next”,如图6所示:

图6:设置程序报信息

最后弹出工作空间和版本控制界面,程序包“example_01”就会被添加到工作空间catkin_ws中,界面如图7所示:

图7:设置项目工作空间和版本控制

点击“完成”按钮即可完成程序包的创建。创建完成后,ROS会自动地在相应的目录下初始化生成CMakeLists.txt、Package.xml等文件和include、src等目录。
然而,在QtCreator左侧栏看不到新添加的包,但系统中已经存在相应的文件。猜测应该是QtCreator的bug。此时关闭工程,重新导入可解决。

3.创建节点

接下来创建节点,右键点击程序包example_01下的目录src,选择“Add New”,QtCreator支持基本节点、发布者节点、订阅者节点、服务端节点、客户端节点、launch文件、URDF文件等的创建,并提供了基本的模板。在此我们选择“Basic Node”,点击“Choose”(为节省篇幅,不再重复截图)。
在弹出的新建基本节点界面中,设置文件名为hello.cpp,文件路径默认为/home/simon/ros/catkin_ws/src/example_01/src,如图8所示:

图8:设置节点名称和路径

点击“下一步”按钮作进一步配置,然后点击“完成”将hello.cpp文件添加到程序包example_01中。
自动生成的hello.cpp文件仅对ROS进行初始化并创建了一个节点句柄,内容如下:

#include <ros/ros.h>int main(int argc, char **argv)
{ros::init(argc, argv, "hello");ros::NodeHandle nh;ROS_INFO("Hello world!");
}

接下来需要编辑文件example_01/CMakeLists.txt(注意不要搞错哦,不要和catkin_ws/src目录下的CMakeLists.txt混淆),配置可执行文件和目标链接库,可链接到ros/ros.h,可执行文件名为hello,内容如下:

//添加可执行文件
add_executable(hello src/hello.cpp)
//将可执行文件和库文件链接
target_link_libraries(hello${catkin_LIBRARIES}
)

4.编译

节点创建好后,就可以编译工作空间了。先点击Qt Creator左边栏下侧的锤子按钮编译工作空间,然后点击底边栏的编译输出窗口“4 编译输出”查看结果,如下所示:

16:33:34: 为项目catkin_ws执行步骤 ...
16:33:34: 正在启动 "/opt/ros/melodic/bin/catkin_make" --cmake-args -G 'CodeBlocks - Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug[100%] Built target hello
Base path: /home/simon/ros/catkin_ws
Source space: /home/simon/ros/catkin_ws/src
Build space: /home/simon/ros/catkin_ws/build
Devel space: /home/simon/ros/catkin_ws/devel
Install space: /home/simon/ros/catkin_ws/install
####
#### Running command: "cmake /home/simon/ros/catkin_ws/src -G CodeBlocks - Unix Makefiles -DCMAKE_BUILD_TYPE=Debug -DCATKIN_DEVEL_PREFIX=/home/simon/ros/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/simon/ros/catkin_ws/install" in "/home/simon/ros/catkin_ws/build"
####
####
#### Running command: "make -j4 -l4" in "/home/simon/ros/catkin_ws/build"
####
16:10:27: 进程"/opt/ros/melodic/bin/catkin_make"正常退出。
16:10:27: Elapsed time: 00:04.

注意事项:
(1) 若在编译窗口产生错误提醒“Qt Creator needs a compiler set up to build. Configure a compiler in the kit options.”,则需要对C、C++进行编译器配置(这是书作者的提醒,本人未出现)。点击左侧项目扳手图标,在弹出界面点击“Manage Kits…”,弹出以下界面,按图9所示配置即可。

图9:C/C++编译器配置
(2) 若在编译窗口产生错误提醒: Could not start process “catkin_make” --cmake-args -G ‘CodeBlocks - Unix Makefiles’ Error while building/deploying project catkin_ws (kit: Imported Kit) When executing step “CatkinMake Step”。恭喜你,中奖了。当时找了一天才在ROS官方讨论区找到解决办法,ctrl+shift+t打开新终端,将目录切换到当前工作空间~/ros/catkin_ws,执行以下命令:

catkin_make --cmake-args -G 'CodeBlocks - Unix Makefiles'

至于原因现在也没想明白,总之执行完之后,以后就再也不会出现类似的错误。哪位小伙伴如果搞清楚原因别忘了在下边留言告诉我。

5.运行

如果编译成功,则点击Qt Creator界面左边栏的扳手项目–>Run,点击运行下添加按钮,选择"ROS Run Configuration",然后在“Add Run Step”中选择“ROS Run Step”,然后点击“详情”,Package选择example_01,target选择hello,同时也可以设置调试信息,debug方法同rosrun,配置界面如图10所示:

图10:添加节点运行及调试配置
如果这里target找不到hello,是因为你的可执行文件生成到工作空间的build目录中,只有生成在devel目录中才可以找到。此时只需要在example_01/CMakeLists.txt中,在find_package()后面加上catkin_package()即可解决,截图如下:

然后在新建终端运行roscore启动master节点,最后点击Qt Creator界面左边栏的Run按钮运行hello节点。在底边栏“8 ROS Terminal”中可看到如下输出结果:

source ~/catkin_ws/devel/setup.sh
rosrun example_01 hello
Hello Wrold!

至此,使用Qt Creator开发第一个ROS程序就完成了,Qt Creator的可视化编译仅是对ROS命令编译的封装。为便于读者理解ROS命令,下面继续介绍如何利用ROS命令进行工作空间编译。

二、使用catkin命令开发ROS程序

考虑到cmake具有的跨平台优势,因此catkin使用cmake作为构建工具。cmake可根据CMakelists.txt为不同的平台生成makefile,然后make命令可根据makefile编译出可执行文件。
catkin_make本质上是将cmake、make进行封装后的编译工具,它规范了编译配置路径和生成文件路径等。catkin_make的编译流程如图1所示:

Created with Raphaël 2.2.0开始创建并初始化ROS工作空间创建程序包/程序包集(可选)在目录src添加程序文件利用catkin_make编译ROS工作空间利用catkin_make install安装结束

下面就来介绍如何利用catkin命令进行编译。

1.创建工作空间

用标准的mkdir命令行去创建一个工作空间,名字为catkin_ws,还需要在工作区目录中创建一个叫做 src 的子目录。这个子目录用于存放源代码。而参数 “-p” 表示mkdir命令会自动创建不存在的目录,然后使用catkin_init_worspace初始化工作空间,它仅创建一个指向cmake的文件的CMakelists.txt。此步也可以省略,由创建包的命令catkin_create_pkg生成cmake文件。
在终端命令中键入(打开终端的快捷键为“Ctrl+Alt+T”)

mkdir -p ~/ros/catkin_ws/src
cd ~/ros/catkin_ws/src
catkin_init_workspace

2.创建程序包

通过ROS的命令catkin_create_pkg创建程序包,命名为example_01,并依赖rospy、roscpp、std_msgs,方法如下:

cd ~/ros/catkin_ws/src
catkin_create_pkg example_01 rospy roscpp std_msgs

catkin_create_pkg创建了一个程序包目录example_01,并在这个目录下生成了两个配置文件,分别为清单文件package.xml和编译文件CMakeLists.txt。第一个配置文件package.xml称为清单文件,此外还有include、src目录等。

3.在目录src添加程序文件

创建好程序包之后,在example_01/src目录下通过VIM创建程序文件hello.cpp,内容如下:

#include <ros/ros.h>int main(int argc, char **argv)
{ros::init(argc, argv, "hello");ros::NodeHandle nh;ROS_INFO("Hello world!");
}

4.编译配置CMakeLists.txt

首先,我们需要声明程序所依赖的其他功能包。对于 c++程序而言,此步骤是必要的,以确保 catkin 能够向 c++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。为了给出依赖库,编辑包目录example_01下的 CMakeLists.txt 文件。
CMakeLists.txt定义了编译配置,包括ROS对cmake的最低要求、编译依赖的程序包、消息文件、服务文件、动作文件和头文件等,还定义了编译输出的可执行文件、目标链接库、安装输出、单元测试等。添加内容如下:

cmake_minimum_required(VERSION 2.8.3)
project(example_01)find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgs
)include_directories(${catkin_INCLUDE_DIRS}
)add_executable(hello src/hello.cpp)target_link_libraries(hello${catkin_LIBRARIES}
)

5.程序包配置package.xml

package.xml定义了程序包配置,如名称、版本、维护者、编译依赖、执行依赖等。依赖库通过使用编译依赖build_depend和运行依赖exec_depend两个关键字实现。具体内容如下:

<?xml version="1.0"?>
<package format="2"><name>example_01</name><version>0.1.0</version><description>example_01 desc</description><maintainer email="simon@todo.todo">simon</maintainer><license>Apache 2.0</license><author >simon</author><buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>rospy</build_depend><build_depend>std_msgs</build_depend><exec_depend>roscpp</exec_depend><exec_depend>rospy</exec_depend><exec_depend>std_msgs</exec_depend><export></export>
</package>

6.利用catkin进行编译安装

利用catkin_make这个命令进行编译,注意必须从你的工作空间目录运行。默认情况下,catkin_make会编译整个工作空间中的程序包。catkin_make支持Debug、Release、RelWtihDebInfo、MinSizeRel等编译模式,默认为Debug模式。
如果代码量大,编译缓慢,可以通过变量ROS_PARALLEL_JOBS指定编译的CPU核数量,默认为在4个CPU核上启动4个任务,在8个CPU核上启动8个任务进行并行编译,方法如下:

cd ~/ros/catkin_ws/
export ROS_PARALLEL_JOBS='-j8 -l8'
catkin_make

当编译通过后,可以通过install命令完成程序包的安装,默认安装在catkin_ws/install目录,也可以通过变量CMAKE_INSTALL_PREFIX显示指定目录,方法如下:

catkin_make -D CMAKE_INSTALL_PREFIX=/home/simon/melodic install

7.运行

首先要启动 roscore,程序是一个节点,节点需要一个节点管理器才可以正常运行。启动节点管理器方法如下,使用快捷键ctrl+shift+T打开终端,输入命令:

roscore

启动完节点管理器后,然后再打开一个终端,执行名为 setup.bash 的脚本文件,它是catkin_make在工作区的 devel 子目录下自动生成的。最后输入运行命令即可:

cd ~/ros/catkin_ws/
source devel/setup.sh
rosrun example_01 hello

这个自动生成的脚本文件设置了若干环境变量,从而使 ROS 能够找到你创建的功能包和新生成的可执行文件(也就是将程序注册)。

注意:除非目录结构发生变化,否则你只需要在每个终端执行此命令一次,即使你修改了代码并且用 catkin_make 执行了重编译。

注意:此命令必须在你的工作空间目录运行,否则会出现“没有那个文件或目录”。

至此,使用catkin命令开发ROS程序完成,有问题欢迎留言区讨论。

参考:
1.《机器人ROS开发实践》第三章,开发ROS,无为斋主编著。
2.编写第一个ROS(创建工作空间workspace和功能包package)


  1. uGet+aria2 ↩︎

QtCreator与catkin命令两种方式开发ROS程序(图示加代码)相关推荐

  1. 两种方案开发小程序动画

    在普通的网页开发中,动画效果可以通过css3来实现大部分需求,在小程序开发中同样可以使用 css3 ,同时也可以通过 api 方式来实现. 指路: 小程序animatiom动画API API解读 小程 ...

  2. Unity2D学习———角色移动两种方式+小怪追随+Unity演示+C#代码

    目录 物理学移动 实现角色移动 C# 代码 Unity中操作 实现小怪追主角 C#代码 Unity操作 通过组件的方式去移动 C#代码 物理学移动 我们使用的是刚体受力会移动的物理学观点去实现角色的移 ...

  3. python钉钉扫码登录程序_钉钉扫码登录网站(两种方式实现)

    钉钉扫码登录网站(两种方式实现) 效果: 动手敲代码! 第一步,钉钉后台配置 点击进入钉钉开发者平台 的页面,点击左侧菜单的[移动接入应用-登录],然后点击右上角的[创建扫码登录应用授权],创建用于免 ...

  4. python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式

    开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...

  5. 原生js更改html,原生js更改css样式的两种方式

    原生js更改css样式的两种方式 发布时间:2020-08-30 01:46:17 来源:脚本之家 阅读:148 作者:外婆的彭湖湾 下面我给大家介绍的是原生js更改CSS样式的两种方式: 1. 通过 ...

  6. git本地仓库关联远程仓库的两种方式

    git本地仓库关联远程仓库的两种方式: 1.将远程的代码clone到本地仓库 2.将本地的代码关联到远程仓库 1.git clone现有的项目(https | SSH) SSH: 检查你的电脑中是否有 ...

  7. Http调用第三方接口的两种方式实例《超详细!!!》***

    Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...

  8. 创建安卓模拟器的两种方式及常用Android命令介绍

    创建安卓模拟器有以下两种方式: 1>通过图形界面创建,在Eclipse中单击Windows->Android Virtual Device Manager启动图形界面窗口 2>如果用 ...

  9. python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

最新文章

  1. VTK:PolyData之ParametricSpline
  2. PHP的getimagesize获取图像信息
  3. 数字后端——布图规划
  4. oracle 实时查询最耗CPU资源的SQL语句
  5. jzoj3518-进化序列(evolve)【位运算】
  6. 机器学习算法之 K-means、层次聚类,谱聚类
  7. jpa怎么传参到in中_Java中如何处理开关状态的属性字段?
  8. api laravel 统一返回方法_你写的API接口代码真的烂,难道不能对返回格式统一处理一下吗?...
  9. 用于创建二维数组的语法
  10. loj10135. 「一本通 4.4 练习 2」祖孙询问
  11. 写给想做自动化的我和我们
  12. [转]自定义UITableView各种函数
  13. Linux音频驱动-OSS和ALSA声音系统简介及其比较
  14. wireshark读写pcap文件_pcap文件格式和wireshark解析
  15. Gauss-Legendre求积公式-高斯型积分公式
  16. 两种python调包进行拉丁超立方采样(lhs)
  17. vue,videojs实现hls直播(萤石视频回放)
  18. 【电脑使用】硬盘无法引导进入系统,无法退出BIOS
  19. 摄像头对物体进行跟踪kcf算法
  20. CI2451无线收发2.4Gsoc芯片集成无线收发器和 8 位 RISC(精简指令集)MCU

热门文章

  1. oracle having(),Oracle HAVING子句
  2. 微服务主见传递ID还是json_后台管理系统之微服务搭建
  3. nexbox本地网络调试工具下载_「下载」 Windows 10 WinDBG 分析转储日志和蓝屏日志排查错误原因...
  4. android 安装卸载应用提醒_Android程序使用代码的安装和卸载!!!
  5. android+studio2.1+是否不支持感染到了.0,Android studio 2.2.3 升级到2.3遇到的问题
  6. mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...
  7. qt如何安装python_安装Python QT,PythonQT,的
  8. java subset_Java TreeSet subSet()方法
  9. html制作花样链接卡页面_网站404页面怎么做
  10. java正则表达式笔记_java正则表达式笔记