ROS入门与实践--3(工作空间和功能包的创建及HelloWorld简单实现)

2023-05-16

ROS入门与实践--3

  • 1 工作空间和功能包
    • 1.1 工作空间定义
    • 1.2 工作空间的创建
    • 1.3 功能包的创建
  • 2 通过指令及编辑器实现HelloWorld
    • 2.1 HelloWorld实现(C++版本)
      • 2.1.1 功能包下新建并编辑cpp源文件
      • 2.1.2 配置CMakeLists.txt文件
      • 2.1.3 catkin_make重新编译工作空间
      • 2.1.4 rosrun执行程序
    • 2.2 HelloWorld实现(Python版本)
      • 2.2.1 Python文件的编写及配置
      • 2.2.2 配置CMakeLists.txt文件
      • 2.2.3 catkin_make重新编译工作空间
      • 2.2.4 rosrun执行程序

1 工作空间和功能包

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

1.1 工作空间定义

简单来说,工作空间就是用来存放开发者的工程开发相关文件的一个文件夹。官方文档给出了两种编译系统,即Catkinrosbuild,在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,所以在后续的教程中,我将会针对每部分的内容同时通过这两种语言来进行演示,同时大家根据自己的基础来选择适合自己的学习方案。
虽然编程语言有所不同,但功能实现的流程基本相似,分为以下几步:

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

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

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文件添加可执行权限

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

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


至此,机器人操作系统(ROS)入门与实践–3的内容全部更新完,下一节我们将进行ROS开发环境搭建及程序运行的教学,同时会安装一些小工具辅助我们后续的工程开发,希望大家支持,本人是自学ROS的研究生小白,主要是根据赵虚左老师的课程、官方的文档以及按照自己的实际操作来写的教程,其中部分内容借鉴了赵虚左老师的方法,在这里给出教程的网址,希望大家一起学习,谢谢大家!!!

参考资料:
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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS入门与实践--3(工作空间和功能包的创建及HelloWorld简单实现) 的相关文章

  • JetBrains软件怎么设置中文?

    etbrains全家桶基本都是英文的 xff0c 有的朋友使用起来很不方便 xff0c 那么jetbrains全家桶怎么汉化呢 xff1f 现在来为大家带来JetBrains软件汉化教程 xff01 下面就以IntelliJ IDEA 20
  • SpringMVC常见面试题总结(超详细回答)

    1 什么是Spring MVC xff1f 简单介绍下你对springMVC的理解 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架 xff0c 通过把Model xff0c View xff0c
  • 微信聊天记录导出

    想把微信记录导出来 xff0c 并保存成txt或者csv格式的文件 xff0c 网上常用的方法是先把手机root xff0c 然后再获取微信聊天记录数据库 xff0c 然后再对数据库破解 有些android手机进行root xff0c 可能
  • iOS开发之NSMethodSignature(方法签名)

    OC中方法调用有三种 xff1a 第一种 xff1a 直接调用 span class token operator span span class token punctuation span span class token keywor
  • ios开发之离屏渲染

    前言 UIView和CALayer关系 UIView继承自UIResponder xff0c 可以处理系统传递过来的事件 xff0c 如 xff1a UIApplication UIViewController UIView xff0c 以
  • ios自定制Tabbar

    这是得物iOS开发一道面试题 xff0c 要求详细描述自定义Tabbar UITabBarController也可以轻松地管理多个控制器 轻松完成控制器之间的切换 xff0c UITabBarController的展现形式就是平时大家手机上
  • ios逆向开发

    对ios逆向开发感兴趣的小伙伴可以查看一下链接内容 xff1a ios逆向开发
  • iOS开发常用加密

    Https加密流程详见博主Https加密流程第十条 其他常用加密方式 一 Base64 Base64加密原理 xff1a 1 原本数据一个字符为8bit xff0c 每3个字符为一组 xff0c 即 xff1a 3 8 2 编码过程中 xf
  • iOS开发细碎知识点总结二

    struct和class的区别 我们先了解栈和堆的区别 1 栈的特点 分配空间小 但是存在栈上的数据访问效率高 2 堆的特点 分配空间相对较大 但是数据访问相对于栈 效率底下 swift中struct与的class的区别 1 class是引
  • iOS开发之相册

    需求一 xff1a 简单的选择一张图片 在iOS开发中如果要调用相机拍取照片或者是直接获取相册中的照片 xff0c 那么调用UIImagePickerController是个不错的选择 UIImagePickerController继承于U
  • 一个小白对微信小程序的理解

    一 小程序开发框架组成介绍 首先介绍一个小程序宿主环境差异 xff0c 其中iOS是基于JavaScriptCore xff0c Android是基于X5内核 xff0c IDE是基于nwjs 1 WXML xff08 WeiXin Mar
  • 池塘里有4只鸭子,4只鸭子在同半圆中的概率(C语言版)

    将原来你是小幸运大佬的Python版代码改写为C语言版代码 xff0c 作为新手练习 原文链接如下 xff1a 4只鸭子在同一个圆圈内游泳 xff0c 问 xff1a 4只鸭子出现在同一个半圆内的概率是多少 xff1f Python解答 原
  • VirtualBox上安装ArchLinux步骤整理

    粗体 xff08 一 xff09 系统安装 从archlinux官网下载linux镜像 xff1a archlinux 2016 12 01 dual iso在virtualbox中加载镜像启动 xff0c 进入root cd dev 下
  • 数据结构设计题大题总结(非代码)

    文章目录 二叉树二叉树遍历孩子兄弟表示法平衡二叉树旋转过程哈夫曼树的构造森林 树与二叉树互转 图邻接矩阵 邻接表与图图的深度搜索与广度搜索Prim算法与Kruskal算法最短路径与AOE网 xff08 Activity on edge ne
  • 轻松通关Flink第24讲:Flink 消费 Kafka 数据业务开发

    在上一课时中我们提过在实时计算的场景下 xff0c 绝大多数的数据源都是消息系统 xff0c 而 Kafka 从众多的消息中间件中脱颖而出 xff0c 主要是因为高吞吐 低延迟的特点 xff1b 同时也讲了 Flink 作为生产者像 Kaf
  • 痛苦的ubuntu 18.043

    文章目录 添加驱动源使用TAB键查看能安装的驱动版本号 刚开始就进不去桌面 xff0c 然后看了教程得在在quite splash 加 nomodeset才能关闭显卡进入桌面 进了系统之后还是跟着https blog csdn net ne
  • Tbox(Can转Tcp),支持有线连接和4G无线连接两种方式

    本司Tbox有如下优点 xff1a 1 支持Can工作模式的远程配置包括波特率 帧类型 过滤ID设置 xff1b 2 tcp支持以太网和无线两种方式 xff0c 无线支持多种网络制式 xff1b 3 采用cotex A7内核处理器 xff0
  • SQL复习

    like 字符匹配 1 xff1a 匹配一个字符 例如 xff1a 查找姓张且名字为三个字的学生信息 select from student where name like 张 2 xff1a 匹配0个或多个字符串 例如 xff1a 查找姓
  • 回溯-切割问题:分割回文串/复原IP地址

    131分割回文串 在代码里什么是切割线呢 xff1f 递归参数需要传入startIndex xff0c 表示下一轮递归遍历的起始位置 xff0c 这个startIndex就是切割线 span class token keyword clas
  • 回溯-子集问题/子集I II/递增子序列

    78 子集 span class token keyword class span span class token class name Solution span span class token punctuation span sp

随机推荐