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
,保存退出即可。
下面进行实操演示:
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
目录下新建源文件
新建完成的源文件,我们可以通过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
文件,双击打开
找到下面的两部分内容,第一部分从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源文件名字
由上图我们可以看出,命令行成功输出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
2.创建Python
文件并编辑
创建python文件方式同创建cpp源文件方式相同,这里我通过指令创建
通过下面的指令打开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
文件添加可执行权限
cd scripts 进入到scripts目录下
chmod +X *.py 添加可执行权限
ll 查看可执行权限文件目录
下图即为执行权限添加成功
2.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源文件名.py
由上图我们可以看出,命令行成功输出hello world Python!
内容,说明我们的程序运行成功。
至此,机器人操作系统(ROS)入门与实践–3的内容全部更新完,下一节我们将进行ROS开发环境搭建及程序运行的教学,同时会安装一些小工具辅助我们后续的工程开发,希望大家支持,本人是自学ROS的研究生小白,主要是根据赵虚左老师的课程、官方的文档以及按照自己的实际操作来写的教程,其中部分内容借鉴了赵虚左老师的方法,在这里给出教程的网址,希望大家一起学习,谢谢大家!!!文章来源:https://www.toymoban.com/news/detail-753261.html
参考资料:
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文章来源地址https://www.toymoban.com/news/detail-753261.html
到了这里,关于ROS入门与实践--3(工作空间和功能包的创建及HelloWorld简单实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!