ROS 下如何编译并运行 C++ 文件? 您所在的位置:网站首页 routeros版本 ROS 下如何编译并运行 C++ 文件?

ROS 下如何编译并运行 C++ 文件?

#ROS 下如何编译并运行 C++ 文件?| 来源: 网络整理| 查看: 265

1 工作空间和功能包

通过上节的学习,我们在ROS文件系统的结构图中了解到了工作空间和功能包,下面我们将详细介绍工作空间的定义,工作空间及功能包的创建流程

1.1 工作空间定义

简单来说,工作空间就是用来存放开发者的工程开发相关文件的一个文件夹。官方文档给出了两种编译系统,即Catkin和rosbuild,在Hydro版本后,很少使用rosbuild系统来进行功能包的创建和编译了,感兴趣的同学可以通过文章末尾的官网链接进行了解,这里不做赘述。 一个基本的Catkin编译系统创建的工作空间结构如下所示:

workspace_folder/ -- WORKSPACE src/ -- SOURCE SPACE -- 开发过程中最常用文件夹,用来储存所有ROS功能包的源码文件 CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin package_1/ CMakeLists.txt -- CMakeLists.txt file for package_1 package.xml -- Package manifest for package_1 ... package_n/ CMakeLists.txt -- CMakeLists.txt file for package_n package.xml -- Package manifest for package_n build/ -- BUILD SPACE -- 用来储存工作空间编译过程中产生的缓存信息和中间文件 devel/ -- DEVELOPMENT SPACE -- 用来放置编译生成的可执行文件

一个基本的Catkin编译系统创建的工作空间实际界面如下图所示:

工作空间实际界面

工作空间中还有一个不常用的“install:安装空间(INSTALL SPACE),不过这个空间不是很常用,基本看不到,这里不做赘述。

1.2 工作空间的创建

在终端输入下面的命令并按下回车键,我们将创建并编译一个catkin工作空间:

mkdir -p ~/catkin_ws/src 创建一个子目录src,上一级目录是工作空间名称'catkin_ws' cd ~/catkin_ws/ 进入创建的工作空间目录 catkin_make 对创建的工作空间进行编译

下面我们进行实操演示:

创建工作空间

工作空间编译完成界面:

工作空间编译完成界面

通过鼠标进入主目录,可以看到我们创建的工作空间,双击打开工作空间,可以看到build、devel、src三个文件夹,工作空间即为创建并编译成功。

编译完成的工作空间

工作空间编译完成后,在devel子目录下创建了一个与你通常在/opt/ros/$ROSDISTRO_NAME下看到的目录结构类似的结构。 要将这个工作空间添加到ROS环境中,你需要source一下生成的配置文件,通常有两种方式可以进行source操作。 方式一:打开一个新的终端,在终端下输入:echo "source ~/你要source的工作空间名字/devel/setup.bash" >> ~/.bashrc 方式一:在主目录下,按快捷键Ctrl+H显示出隐藏的文件夹,找到.bashrc文件,通过gedit编辑器打开,在文档末尾加入:source ~/你要source的工作空间名字/devel/setup.bash,保存退出即可。 下面进行实操演示:

找到.bashrc文件修改.bashrc文件1.3 功能包的创建

通过如下命令可以在你创建的catkin工作空间中创建一个新的功能包:

cd ~/catkin_ws/src 重新打开终端,可以使用此命令进入src目录 cd src 已经位于工作空间目录,可以使用此命令进入src目录 catkin_create_pkg test01 std_msgs rospy roscpp 创建一个名为test01的新功能包,这个功能包依赖于std_msgs、roscpp和rospy

功能包依赖roscpp表示可以使用C++实现功能的库、rospy表示可以使用Python实现功能的库、std_msgs则是标准消息库,在创建一个新的功能包时,功能的实现一般都依赖这三个库实现。 下面进行实操演示:

功能包创建完成界面

通过cd指令进入我们创建的功能包,通过ls指令查看功能包下的文件及文件夹,上图即为正常的功能包结构。

2 通过指令及编辑器实现HelloWorld

在ROS中,工程开发使用的编程语言主要为C++和Python,所以在后续的教程中,我将会针对每部分的内容同时通过这两种语言来进行演示,同时大家根据自己的基础来选择适合自己的学习方案。 虽然编程语言有所不同,但功能实现的流程基本相似,分为以下几步:

首先创建一个新的工作空间;然后创建一个新的功能包;编辑程序源文件;编辑配置文件;编译工作空间并执行程序。

下面我们将围绕这个步骤来进行初步的学习。

2.1 HelloWorld实现(C++版本)2.1.1 功能包下新建并编辑cpp源文件

根据之前学习过的知识,src目录下存放的是功能包的源码文件,所以我们需要在src目录下功能包的src目录下新建我们的源码程序。新建一个源文件的方法有两种: 方式一:在src目录下鼠标右键新建一个文档,将文件名字修改为helloworld.cpp; 注:如果右键没有新建文档选项,可以找到主目录下的模板文件夹,右键在终端中打开,输入sudo gedit命令,输入密码,这时会弹出一个空白文档,保存即可,这时候再右键即可看到新建文档选项。

右键无新建文档

空白文档弹出

新建文档

右键新建文档出现

右键新建文档出现

方式二:通过touch指令在src目录下新建源文件

touch指令新建文件

新建完成的源文件,我们可以通过gedit指令在终端打开并编辑,也可以直接在目录下双击打开编辑

gedit指令打开文件

在文档中输入以下代码,然后保存退出

#include "ros/ros.h" int main(int argc, char *argv[]) { //初始化 ROS 节点 ros::init(argc,argv,"hello"); //创建节点句柄 ros::NodeHandle n; //控制台输出 hello world! ROS_INFO("hello world cpp!"); return 0; } 2.1.2 配置CMakeLists.txt文件

源文件代码已经完成,接下来我们进行文件配置,进入test01功能包目录,找到CMakeLists.txt文件,双击打开

CMakeLists.txt文件

找到下面的两部分内容,第一部分从133行开始,第二部分从148行开始,将两部分的配置内容取消注释,添加上与源文件相关的内容,文中我们将相关内容修改成了和我们新建的cpp源文件的名称一致的内容。然后保存退出。

## Declare a C++ executable 声明一个C++可执行文件 ## With catkin_make all packages are built within a single CMake context ## The recommended prefix ensures that target names across packages don't collide # add_executable(${PROJECT_NAME}_node src/test01_node.cpp) add_executable(cpp源文件的名称 src/cpp源文件的名称.cpp) add_executable(helloworld src/helloworld.cpp) ========================================================================================= ## Specify libraries to link a library or executable target against 指定库来链接库或可执行目标 # target_link_libraries(${PROJECT_NAME}_node # ${catkin_LIBRARIES} # ) target_link_libraries(cpp源文件的名称 ${catkin_LIBRARIES} ) target_link_libraries(helloworld ${catkin_LIBRARIES} )2.1.3 catkin_make重新编译工作空间

接下来新打开一个终端,通过 cd catkin_ws命令进入工作空间目录下,输入catkin_make命令重新编译工作空间

重新编译工作空间

上图即为编译成功的界面。

2.1.4 rosrun执行程序

当工作空间重新编译成功后,我们就可以来执行这个程序。 1.重新打开一个命令行,输入roscore启动ROS核心 2.再打开一个命令行,通过下列指令来执行程序

cd 工作空间名字 source ./devel/setup.bash 若之前在.bashrc文件中设置过可以免去这步,后续在新的工作空间下运行需要执行这步 rosrun 功能包包名 cpp源文件名字helloworld cpp程序运行

由上图我们可以看出,命令行成功输出hello world cpp!内容,说明我们的程序运行成功。

2.2 HelloWorld实现(Python版本)

Python版本中实现helloworld输出到终端的步骤和C++版本基本类似,不同之处在于需要先新建一个scripts目录来存放Python文件,并为Python文件添加执行权限,程序才能正常被编译运行,下面我们来详细介绍操作流程。

2.2.1 Python文件的编写及配置

1.创建scripts目录 通过下面的指令我们在功能包的src目录下新建一个scripts目录来存放Python文件。

cd catkin_ws/src/test01/ mkdir scripts ls创建scripts目录

2.创建Python文件并编辑 创建python文件方式同创建cpp源文件方式相同,这里我通过指令创建

创建python文件

通过下面的指令打开python文件并写入代码

gedit helloworld.py #! /usr/bin/env python #Python 解释器路径 import rospy if __name__ == "__main__": rospy.init_node("Hello") rospy.loginfo("Hello World Python!")

3.为python文件添加可执行权限 通过下列指令可以为python文件添加可执行权限

chmod +x python文件名.py2.2.2 配置CMakeLists.txt文件

Python文件能否执行同样需要配置CMakeLists.txt文件,他和cpp配置的CMakeLists.txt文件为同一个文件,打开CMakeLists.txt文件,找到168行,把my_python_script修改为python文件名,效果同下,然后保存退出。

## Mark executable scripts (Python etc.) for installation ## in contrast to setup.py, you can choose the destination # catkin_install_python(PROGRAMS # scripts/my_python_script # DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} # ) catkin_install_python(PROGRAMS scripts/python文件名.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) catkin_install_python(PROGRAMS scripts/helloworld.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )2.2.3 catkin_make重新编译工作空间

终端下输入 cd catkin_ws命令进入工作空间目录下,输入catkin_make命令重新编译工作空间

重新编译工作空间

上图即为编译成功的界面。

2.2.4 rosrun执行程序

由于在上一节运行cpp程序时,我们已经启动了roscore,所以我们在这里直接执行python文件 打开一个命令行,通过下列指令来执行程序

cd 工作空间名字 source ./devel/setup.bash 若之前在.bashrc文件中设置过可以免去这步,后续在新的工作空间下运行需要执行这步 rosrun 功能包包名 python源文件名.pyhelloworld Python程序运行

由上图我们可以看出,命令行成功输出hello world Python!内容,说明我们的程序运行成功。

参考资料:

http://www.autolabor.com.cn/book/ROSTutorials/

http://wiki.ros.org/ROS/Concepts

http://wiki.ros.org/cn/catkin/Tutorials/create_a_workspace

http://wiki.ros.org/cn/catkin/Tutorials



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有