QtCreator与catkin命令两种方式开发ROS程序


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

一、Qt Creator安装及开发ROS

1.安装Qt Creator

本次试验基于Ubuntu 18.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

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

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

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

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

图4:ROS工作空间图4:ROS工作空间

2.创建程序包

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

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

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

图7:设置项目工作空间和版本控制
Alt点击“完成”按钮即可完成程序包的创建。创建完成后,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:设置节点名称和路径
alt点击“下一步”按钮作进一步配置,然后点击“完成”将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(注意不要搞错哦),配置可执行文件和目标链接库,可链接到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'

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

5.运行

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

图10:添加节点运行及调试配置
alt然后在新建终端运行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。
在终端命令中键入(打开终端的快捷键为“Ctrl+Alt+T”)

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

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++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。为了给出依赖库,编辑包目录下的 CMakeLists.txt 文件。
CMakeLists.txt定义了编译配置,包括ROS对cmake的最低要求、编译依赖的程序包、消息文件、服务文件、动作文件和头文件等,还定义了编译输出的可执行文件、目标链接库、安装输出、单元测试等。添加内容如下:

cmake_minimum_required(VERSION 2.8.3)
project(example_01)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_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="[email protected]">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/src
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 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章