本文共 7881 字,大约阅读时间需要 26 分钟。
本次试验基于Ubuntu 18.04 LTS(兼容Ubuntu 20.04 LTS),Ubuntu系统库自带的qtcreator并没有ROS插件,需要自己通过ppa方式安装,网上多是基于14.04版本的,且较为繁琐,并不推荐。这里要介绍的是带有ROS插件的Qt Creator安装,链接如下:
官网有两种安装方式:在线和线下。在线安装非常慢,只有十几K,不推荐,建议线下安装,使用Ubuntu的下载工具uGet+aria2,分分钟搞定。 下载文件名为qtcreator-ros-bionic-latest-offnline-installer.run,使用如下命令安装:mkdir /opt/QtCreator && cd /opt/QtCreatormv ~/下载/qtcreator-ros-bionic-latest-offnline-installer.run /opt/QtCreatorsudo ./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的版本进行安装。
为了开发ROS,首先需要创建工作空间,然后创建程序包,接下来根据需要编写消息文件、服务文件,动作文件等资源文件,然后利用catkin_make编译生成相应的编程语言目标文件,最后创建节点、launch文件、机器人模型等。
Qt Creator为开发ROS程序提供了良好的代码编辑、编译、调试工具,在本小节中,我们将介绍如何利用Qt Creator开发一个名为“Hello ROS”的基本节点。首先,打开QtCreator的“New Project”,并选择“Other Project”,选择“ROS Workspace”模板,如图1所示:
图1:选择ROS Workspace创建项目
图2:设置工程名和目录
图3:设置子项目和添加版本控制
图4:ROS工作空间
工程创建完之后,就可以创建程序包了。右键点击图4的src目录,选择“New File”创建程序包,在弹出的界面选择ROS–>Package,然后点击“Choose”,如图5所示:
图5:创建程序包
图6:设置程序报信息
图7:设置项目工作空间和版本控制
接下来创建节点,右键点击程序包example_01下的目录src,选择“Add New”,QtCreator支持基本节点、发布者节点、订阅者节点、服务端节点、客户端节点、launch文件、URDF文件等的创建,并提供了基本的模板。在此我们选择“Basic Node”,点击“Choose”(为节省篇幅,不再重复截图)。
在弹出的新建基本节点界面中,设置文件名为hello.cpp,文件路径默认为/home/simon/ros/catkin_ws/src/example_01/src,如图8所示:图8:设置节点名称和路径
#includeint 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})
节点创建好后,就可以编译工作空间了。先点击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 helloBase path: /home/simon/ros/catkin_wsSource space: /home/simon/ros/catkin_ws/srcBuild space: /home/simon/ros/catkin_ws/buildDevel space: /home/simon/ros/catkin_ws/develInstall 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++编译器配置
catkin_make --cmake-args -G 'CodeBlocks - Unix Makefiles'
至于原因现在也没想明白,总之执行完之后,以后就再也不会出现类似的错误。哪位小伙伴如果搞清楚原因别忘了在下边留言告诉我。
如果编译成功,则点击Qt Creator界面左边栏的扳手项目–>Run,点击运行下添加按钮,选择"ROS Run Configuration",然后在“Add Run Step”中选择“ROS Run Step”,然后点击“详情”,Package选择example_01,target选择hello,同时也可以设置调试信息,debug方法同rosrun,配置界面如图10所示:
图10:添加节点运行及调试配置
source ~/catkin_ws/devel/setup.shrosrun example_01 helloHello Wrold!
至此,使用Qt Creator开发第一个ROS程序就完成了,Qt Creator的可视化编译仅是对ROS命令编译的封装。为便于读者理解ROS命令,下面继续介绍如何利用ROS命令进行工作空间编译。
考虑到cmake具有的跨平台优势,因此catkin使用cmake作为构建工具。cmake可根据CMakelists.txt为不同的平台生成makefile,然后make命令可根据makefile编译出可执行文件。
catkin_make本质上是将cmake、make进行封装后的编译工具,它规范了编译配置路径和生成文件路径等。catkin_make的编译流程如图1所示:下面就来介绍如何利用catkin命令进行编译。
用标准的mkdir命令行去创建一个工作空间,名字为catkin_ws,还需要在工作区目录中创建一个叫做 src 的子目录。这个子目录用于存放源代码。而参数 “-p” 表示mkdir命令会自动创建不存在的目录,然后使用catkin_init_worspace初始化工作空间,它仅创建一个指向cmake的文件的CMakelists.txt。此步也可以省略,由创建包的命令catkin_create_pkg生成cmake文件。
在终端命令中键入(打开终端的快捷键为“Ctrl+Alt+T”)mkdir -p ~/ros/catkin_ws/srccd ~/ros/catkin_ws/srccatkin_init_workspace
通过ROS的命令catkin_create_pkg创建程序包,命名为example_01,并依赖rospy、roscpp、std_msgs,方法如下:
cd ~/ros/catkin_ws/srccatkin_create_pkg example_01 rospy roscpp std_msgs
catkin_create_pkg创建了一个程序包目录example_01,并在这个目录下生成了两个配置文件,分别为清单文件package.xml和编译文件CMakeLists.txt。第一个配置文件package.xml称为清单文件,此外还有include、src目录等。
创建好程序包之后,在example_01/src目录下通过VIM创建程序文件hello.cpp,内容如下:
#includeint main(int argc, char **argv){ ros::init(argc, argv, "hello"); ros::NodeHandle nh; ROS_INFO("Hello world!");}
首先,我们需要声明程序所依赖的其他功能包。对于 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 COMPONENTS roscpp rospy std_msgs)include_directories( ${catkin_INCLUDE_DIRS})add_executable(hello src/hello.cpp)target_link_libraries(hello ${catkin_LIBRARIES})
package.xml定义了程序包配置,如名称、版本、维护者、编译依赖、执行依赖等。依赖库通过使用编译依赖build_depend和运行依赖exec_depend两个关键字实现。具体内容如下:
example_01 0.1.0 example_01 desc simon Apache 2.0 simon catkin roscpp rospy std_msgs roscpp rospy std_msgs
利用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
首先要启动 roscore,程序是一个节点,节点需要一个节点管理器才可以正常运行。启动节点管理器方法如下,使用快捷键ctrl+shift+T打开终端,输入命令:
roscore
启动完节点管理器后,然后再打开一个终端,执行名为 setup.bash 的脚本文件,它是catkin_make在工作区的 devel 子目录下自动生成的。最后输入运行命令即可:
cd ~/ros/catkin_ws/source devel/setup.shrosrun example_01 hello
这个自动生成的脚本文件设置了若干环境变量,从而使 ROS 能够找到你创建的功能包和新生成的可执行文件(也就是将程序注册)。
注意:除非目录结构发生变化,否则你只需要在每个终端执行此命令一次,即使你修改了代码并且用 catkin_make 执行了重编译。
注意:此命令必须在你的工作空间目录运行,否则会出现“没有那个文件或目录”。
至此,使用catkin命令开发ROS程序完成,有问题欢迎留言区讨论。
参考:
1.《机器人ROS开发实践》第三章,开发ROS,无为斋主编著。 2.
转载地址:http://xkvhz.baihongyu.com/