QtCreator与catkin命令两种方式开发ROS程序(图示加代码)
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所示:
下面就来介绍如何利用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)
uGet+aria2 ↩︎
QtCreator与catkin命令两种方式开发ROS程序(图示加代码)相关推荐
- 两种方案开发小程序动画
在普通的网页开发中,动画效果可以通过css3来实现大部分需求,在小程序开发中同样可以使用 css3 ,同时也可以通过 api 方式来实现. 指路: 小程序animatiom动画API API解读 小程 ...
- Unity2D学习———角色移动两种方式+小怪追随+Unity演示+C#代码
目录 物理学移动 实现角色移动 C# 代码 Unity中操作 实现小怪追主角 C#代码 Unity操作 通过组件的方式去移动 C#代码 物理学移动 我们使用的是刚体受力会移动的物理学观点去实现角色的移 ...
- python钉钉扫码登录程序_钉钉扫码登录网站(两种方式实现)
钉钉扫码登录网站(两种方式实现) 效果: 动手敲代码! 第一步,钉钉后台配置 点击进入钉钉开发者平台 的页面,点击左侧菜单的[移动接入应用-登录],然后点击右上角的[创建扫码登录应用授权],创建用于免 ...
- python循环展示大写字母_python调用大写函数python中字典的循环遍历的两种方式
开发中经常会用到对于字典.列表等数据的循环遍历,但是python中对于字典的遍历对于很多初学者来讲非常陌生,今天就来讲一下python中字典的循环遍历的两种方式. 注意: python2和python ...
- 原生js更改html,原生js更改css样式的两种方式
原生js更改css样式的两种方式 发布时间:2020-08-30 01:46:17 来源:脚本之家 阅读:148 作者:外婆的彭湖湾 下面我给大家介绍的是原生js更改CSS样式的两种方式: 1. 通过 ...
- git本地仓库关联远程仓库的两种方式
git本地仓库关联远程仓库的两种方式: 1.将远程的代码clone到本地仓库 2.将本地的代码关联到远程仓库 1.git clone现有的项目(https | SSH) SSH: 检查你的电脑中是否有 ...
- Http调用第三方接口的两种方式实例《超详细!!!》***
Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...
- 创建安卓模拟器的两种方式及常用Android命令介绍
创建安卓模拟器有以下两种方式: 1>通过图形界面创建,在Eclipse中单击Windows->Android Virtual Device Manager启动图形界面窗口 2>如果用 ...
- python: 多线程实现的两种方式及让多条命令并发执行
一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...
最新文章
- VTK:PolyData之ParametricSpline
- PHP的getimagesize获取图像信息
- 数字后端——布图规划
- oracle 实时查询最耗CPU资源的SQL语句
- jzoj3518-进化序列(evolve)【位运算】
- 机器学习算法之 K-means、层次聚类,谱聚类
- jpa怎么传参到in中_Java中如何处理开关状态的属性字段?
- api laravel 统一返回方法_你写的API接口代码真的烂,难道不能对返回格式统一处理一下吗?...
- 用于创建二维数组的语法
- loj10135. 「一本通 4.4 练习 2」祖孙询问
- 写给想做自动化的我和我们
- [转]自定义UITableView各种函数
- Linux音频驱动-OSS和ALSA声音系统简介及其比较
- wireshark读写pcap文件_pcap文件格式和wireshark解析
- Gauss-Legendre求积公式-高斯型积分公式
- 两种python调包进行拉丁超立方采样(lhs)
- vue,videojs实现hls直播(萤石视频回放)
- 【电脑使用】硬盘无法引导进入系统,无法退出BIOS
- 摄像头对物体进行跟踪kcf算法
- CI2451无线收发2.4Gsoc芯片集成无线收发器和 8 位 RISC(精简指令集)MCU
热门文章
- oracle having(),Oracle HAVING子句
- 微服务主见传递ID还是json_后台管理系统之微服务搭建
- nexbox本地网络调试工具下载_「下载」 Windows 10 WinDBG 分析转储日志和蓝屏日志排查错误原因...
- android 安装卸载应用提醒_Android程序使用代码的安装和卸载!!!
- android+studio2.1+是否不支持感染到了.0,Android studio 2.2.3 升级到2.3遇到的问题
- mysql limit 越大越慢_mysql 优化之14:php mysql limit 分页优化,页面值越大查询越慢...
- qt如何安装python_安装Python QT,PythonQT,的
- java subset_Java TreeSet subSet()方法
- html制作花样链接卡页面_网站404页面怎么做
- java正则表达式笔记_java正则表达式笔记