[ROS] ROS基础,创建工作空间,创建功能包,ros功能包相关命令,Catkin编译系统,catkin_make的编译方式

2023-05-16

1.工作空间

工作空间(work space)是ROS系统中存放工程开发相关的文件夹,其目录结构如下:

src:代码空间(Source Space),用于存放开发代码

build:编译空间(Build Space),catkinCMake)的缓存信息和中间文件

devel:开发空间(Development Space),生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环

境变量

install:安装空间(Install Space)

一个最小的项目结构如图所示

后两个路径由 catkin 系统自动生成、管理,我们日常的开发一般不会去涉及,而主要用到的是src文件夹,我们写的 ROS 程序、网上下载的 ROS 源代码包都存放在这里。 在编译时,catkin 编译系统会递归的查找和编译 src/ 下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示:

 

更加详细的目录结构如下: 

 

1.1 如何创建并编译一个工作空间

创建工作空间

在根目录下创建一个叫catkin_ws的工作空间,并进入到src目录下进行初始化

$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

编译工作空间

catkin_make相当于cmake编译器,ROS对其进行改造(加入CMakeLists.txt进行功能包索引)。一般在修改了src下的程序代码或配置文件后需要进行编译。

$ cd ~/catkin_ws

$ catkin_make 

设置环境变量 

在这里记住一点,但凡编译过工作空间,一定要重新source环境变量,否则代码不会更新。

这里使用的是setup.bash,还有两个文件为setup.sh和setup.zsh,要source哪个文件取决于你的默认解释程序(echo $SHELL)

$ souce ~/catkiin_ws/devel/setup.bash

 

补充:工作空间的覆盖

ROS系统中工作空间存在Overlaying机制,即工作空间覆盖机制,catkin支持包的逐层覆盖, 当前最高,其它依据source的顺序逐层变高, 高层可覆盖低层. ,符合以下规则:

1)工作空间的路径记录在ROS_PACKAGE_PATH环境变量中

2)新设置的路径(source后)会放在ROS_PACKAGE_PATH变量的最前端

3)运行程序时,ROS会优先在靠近前端的工作空间中查找指定的功能包

4)只有当前端工作空间不存在该功能包时才向后查找

如图所示

可以观察到source当前工作空间后,将当前工作空间的绝对路径放到了系统工作空间之前

 

2.功能包

1.Ros功能包简介
 
ROS中的package的定义更加具体,它不仅是Linux上的软件包,更是catkin编译的基本单元,我们调用 catkin_make 编译的对象就是一个个ROS的package,也就是说任何ROS程序只有组织成package才能编译 。所以 package 也是 ROS 源代码存放的地方,任何 ROS 的代码无论是 C++ 还是Python 都要放到 package 中,这样才能正常的编译和运行。
 
一个 package 可以编译出来多个目标文件( ROS 可执行程序、动态静态库、头文件等等)。

 

2.功能包创建方式

ROS里的功能包用于区分某个文件夹下代码的功能,如机器人有移动,导航,视觉等功能,我们为整个机器人创建工作空间,也可称为一个项目,接来要开发它的各个功能,于是我们使用功能包来分隔一类别代码。下面是创建功能包的方式:

下面命令创建了一个叫做test1个功能包,导入了rospy roscpp依赖包,ROS支持python和c++开发,所以导入这两个依赖包让功能包可以通过这两种语言开发。

创建完功能包后需要catkin_make进行编译,编译后需要source当前工作空间,这样就完成了功能包的创建

$ cd ~/catkin_ws/src
$ catkin_create_pkg test1 rospy roscpp
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash

补充:如果是第三方下载的,如需进行catkin_create_pkg,直接执行catkin_make编译即可

 

2.ros功能包的目录结构

如果所示,一个功能包的目录结构如下,CmakeLists.txt和package.xml是必须的,分别定义编译规则和描述信息。

其他类似src、include、scripts这些目录命名都是约定俗成的,并未明确定义,但是ros默认会去这些目录下找相关文件,所以为了标准化,请规范命名

更加详细的描述如下
 
  • CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package
  • 不可少的成分
  • package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成
  • src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Pythonmodule(.py)
  • include/: 存放C++源码对应的头文件
  • scripts/: 存放可执行脚本,例如shell脚本(.sh)Python脚本(.py)
  • msg/: 存放自定义格式的消息(.msg)
  • srv/: 存放自定义格式的服务(.srv)
  • models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae)
  • urdf/: 存放机器人的模型描述(.urdf.xacro)
  • launch/: 存放launch文件(.launch.xml)

 

注意:同一个工作空间不能存在相同名称的功能包,不同工作空间可以存在相同名称的功能包 

 

3.功能包相关命令rospack

rospack 是对 package 管理的工具,命令的用法如下:
 
  • rospack list :列出本机所有package
  • rospack depends [package] :显示package的依赖包
  • rospack find [package] :定位某个package
  • rospack profile :刷新所有package的位置记录

 

4.功能包相关命令roscd

roscd 命令类似与 Linux 系统的 cd ,改进之处在于 roscd 可以直接 cd ROS 的软件包。
 
  • roscd [package]:cd到ROS Package的目录

补充:使用前必须source空间

 

5.功能包相关命令

rosdep 是用于管理ROS package依赖项的命令行工具,用法如下:

 
  • rosdep check [pacakge] :检查package的依赖是否满足
  • rosdep install [pacakge] :安装pacakge的依赖
  • rosdep db :生成和显示依赖数据库
  • rosdep init :初始化/etc/ros/rosdep中的源
  • rosdep keys :检查package的依赖是否满足
  • rosdep update :更新本地的rosdep数据库
 
一个较常使用的命令是 rosdep install --from-paths src --ignore-src --rosdistro=kinetic - y , 用于安装工作空间中 src 路径下所有 package 的依赖项(由 pacakge.xml 文件指定)
 
使用方式形如: rosdep install --from-paths /home/user/catkin_ws/src --ignore-src --rosdistro=kinetic - y

 

3.Catkin编译系统

1.两个文件

一个 Catkin 的软件包( package )必须要包括两个文件:
 
  • package.xml: 包括了package的描述信息,例如name, description, version, maintainer(s), license
  • CMakeLists.txt: 构建package所需的CMake文件,作用为:调用Catkin的函数/宏,解析 package.xml ,找到其他依赖的catkin软件包,将本软件包添加到环境变量

2.catkin编译的工作流程

  • 1. 首先在工作空间 catkin_ws/src/ 下递归的查找其中每一个ROSpackage
  • 2. package中会有 package.xml CMakeLists.txt 文件,Catkin(CMake)编译系统依CMakeLists.txt 文件,从而生成 makefiles (放在 catkin_ws/build/ )
  • 3. 然后 make 刚刚生成的 makefiles 等文件,编译链接生成可执行文件(catkin_ws/devel )
也就是说, Catkin就是将 cmake 与 make 指令做了一个封装从而完成整个编译过程的工具 。 catkin有比较突出的优点,主要是操作更加简单、一次配置,多次使用 、跨依赖项目编译
 
3.使用方式
 
要用 catkin 编译一个工程或软件包,只需要用 catkin_make 指令。一般当我们写完代码,执行一次 catkin_make 进行编译 , 调用系统自动完成编译和链接过程,构建生成目标文件。编译的一般性流程如下:
 
$ cd ~/catkin_ws #进入工作空间,catkin_make必须在工作空间下执行 
$ catkin_make #开始编译 
$ source ~/catkin_ws/devel/setup.bash #刷新坏境

编译之后,catkin_make运行后终端输出文件部分解析

#基本路径

Base path: /home/user/catkin_ws

Source space: /home/user/catkin_ws/src  --SOURCE SPACE 源空间

Build space: /home/user/catkin_ws/build  --BUILD SPACE 编译空间

Devel space: /home/user/catkin_ws/devel  --DEVEL SPACE 开发空间

Install space: /home/user/catkin_ws/install --INSTALL SPACE 安装空间

注意: catkin编译之前需要回到工作空间目录, catkin_make 在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误

 

4.catkin_make可选参数

用ninja或nmake方式编译

  • --use-ninja :用ninja取代make
  • --use-nmake:用nmake取'make --force-cmake 强制cmake,即使已经cmake过

指定源码位置,如果源码不在当前工作空间的src下

  • --source my_src  :my_src为指定的src路径(默认为'workspace_base/src')
  • --build BUILD :build的路径 ,指定编译后build文件存放的位置(默认为'workspace_base/build')
仅编译指定的功能包
  • catkin_make -DCATKIN_WHITELIST_PACKAGES="package1":编译指定的包,仅编译package1

编译所有包

  • catkin_make -DCATKIN_WHITELIST_PACKAGES="":在双引号内不填代表编译所有包
使用install模式
 
  • catkin_make install :使用install模式,编译后的可执行文件将存放在install目录中
 
 
5.install与devel
 
devel模式通常用于代码编写与调试阶段,若是希望上线使用,应使用install模式,且删除devel目录。在source时应source install目录下的setup文件。
 
使用install模式的原因是devel包含源码,而install模式为可执行代码,从而保护了代码安全
 
 
 
下一篇文章: [ROS]CmakeLists.txt 与 Package.xml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[ROS] ROS基础,创建工作空间,创建功能包,ros功能包相关命令,Catkin编译系统,catkin_make的编译方式 的相关文章

  • Simulink建模:一阶滤波模型

    本文研究一阶滤波算法的Simulink模型及其代码生成 文章目录 1 一阶滤波算法2 Simulink建模2 1 对公式的理解2 2 建模过程2 3 模型配置 3 模型更新及代码生成3 1 模型更新3 2 代码生成 4 总结 1 一阶滤波算
  • CubeMX配置:FreeRTOS及串口配置

    本文通过CubeMX配置F103RCT6的FreeRTOS和串口 文章目录 1 引入2 配置过程2 1 配置时钟过程2 2 配置FreeRTOS过程2 3 配置串口过程 3 生成工程代码4 测试串口5 总结 1 引入 拿到一个STM32控制
  • Simulink建模:PID控制-串级PID

    本文研究串级PID控制的概念 应用场景以及Simulink模型实现 文章目录 1 问题引入2 串级PID控制3 Simulink建模3 1 建模前的理解3 2 建模过程3 3 代码生成 4 总结 1 问题引入 在之前的博客 Simulink
  • ROS导航中 的位姿描述

    转载出处 xff1a http blog csdn net u013453604 article details 47320237 补充 xff1a turtlebot包如果没有安装成功或者文件夹做了改动运行不起来需要重装就需要uninst
  • Git托管:将本地项目代码上传(push)到自己的Git repository

    首先下载并安装git版本控制软件 xff0c 我安装的是Git 1 9 2 preview20140411 xff0c 这里是我上传的有需要的可以download然后安装即可 http download csdn net detail u0
  • strstr函数用法小结

    strstr 函数原型 xff1a char strstr char str1 char str2 功能就是找出在字符串str1中第一次出项字符串str2的位置 也就是说字符串sr1中要包含有字符串str2 xff0c 找到就返回该字符串位
  • WebSphere宕机问题解决方法总结

    Websphere参数调整 涉及性能的参数 xff1a 1 数据源连接池连接数 2 线程池 xff1a default 参数 ORB THREAD POOL参数 Webcontainer 参数 3 jvm 堆最大最小值 xff0c 线程池调
  • 使用GreenDao存储list集合数据

    转载请注明出处 xff1a From李诗雨 http blog csdn net cjm2484836553 article details 78279493 不诗意的女程序猿不是好厨师 点击下载Demo源代码 xff1a 源码 不知道为什
  • catkin简析

    题记 xff1a 转载一篇catkin总结不错的原创 xff1a http blog csdn net zyh821351004 article details 50388429 catkin简析 catkin 编译支持传入cmake的宏定
  • Package name is not valid解决

    刚刚新建项目 xff0c 将com打成con xff0c 提示 Package name is not valid xff0c 在eclipse中有些单词不能命名
  • 路由器与交换机

    在工作中 xff0c 不管是办公上网还是设备调试 xff0c 经常都会用到路由器与交换机 xff0c 那他们二者的区别是什么呢 xff1f 笔者之前也没太搞明白 恰好出差周末闲来无事 xff0c 特来梳理一下并共享 xff0c 希望对那些跟
  • 用数据驱动思想来设计游戏

    游戏由两部分组成 xff0c 逻辑和数据 这是一种对游戏的有效划分 逻辑部分定义游戏引擎的核心原则和算法 xff0c 数据部分则提供其内容 和行为的具体细节 在最初的游戏开发的过程中 xff0c 大家总是喜欢将逻辑和数据都写入代码中 xff
  • 架构师之路:一个架构师需要掌握的知识技能

    Java团长 2017 04 15 21 30 没有设计的思想 xff0c 你就不能成为一名架构师 架构师是一个能撸的了一手好代码 xff0c 画的了一个漂亮的UML 原型 xff0c 写的了一篇技术文档 xff0c 更加能解决好项目关键技
  • 【Python】Windows下PyCharm安装Numpy包及无法安装问题解决方案

    step1 打开pycharm安装目录 xff0c 路径如下图 xff1a step2 在上个界面 xff0c 按 shift 43 右键 xff0c 打开命令窗口 xff0c 检查pip版本是否为最新 xff0c 如下图 xff1a st
  • 【python/tensorflow】pycharm 2019,python 3.6.2, win7 64bit系统,安装tensorflow出错,错误如下,解决办法给出!

    D aWork PycharmProjects Pro3 test venv Scripts python exe D aWork PycharmProjects Pro3 test test 1 py Traceback most rec
  • 【C++】基于 OpenCV 的人脸识别(强烈推荐)

    xfeff xfeff 原文网址 xff1a http www jianshu com p 96be2417cc98 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库 它包含成千上万优化过的算法 xff0c 为各种计算机视觉应
  • 【matlab】雷达截面积(Radar Cross Section,RCS)(MATLAB部分仿真+Code)

    xfeff xfeff 一 RCS定义 任何具有确定极化的电磁波照射到目标上时 xff0c 都会产生各个方向上的折射或散射 其中散射波分为两部分 xff1a 一 是由与接收天线具有相同极化的散射波组成 xff1b 二 是散射波具有不同的变化
  • 【Get深一度】自适应波束形成算法 之 算法篇【二】(Adaptive Beamforming Algorithm)

    神器镇楼 xff01 一 自适应波束形成阶段划分 xff1a 自适应阵列信号处理的概念最早由 Van Atta 于 20 世纪 60 年代末提出 本文总结了前30 年的研究成果 xff0c 将自适应阵列信号处理划分为三个阶段 xff1a 6
  • 使用adb指令往机顶盒上安装应用

    转载请注明出处 From李诗雨 https blog csdn net cjm2484836553 article details 82970881 不诗意的女程序猿不是好厨师 已有一个机顶盒端应用的apk 想通过adb指令将其安装到机顶盒
  • 多摄像机标定和去畸变

    Table of Contents xff11 kalibr多摄像机标定 1 1 系统安装 xff0c 环境配置 xff1a 实测Ubuntu 16 04 1 2 多摄像机标定 2 OpenCV双目标定 3 Matlab多摄像机标定 4 利

随机推荐

  • 【Get深一度】信号处理(三)——3db带宽

    1 3db带宽定义 3dB 带宽指幅值等于最大值的二分之根号二倍时对应的频带宽度 这个3分贝是多大呢 xff1f 由10log xff08 1 2 xff09 61 3 0103 xff0c 可知 xff0c 这时的输出功率是输入功率的1
  • Matlab中set-gca函数的使用

    Matlab坐标修改gca 1 坐标轴删除 set gca xtick 去掉x轴的刻度 set gca ytick 去掉y轴的刻度 set gca xtick ytick 同时去掉x轴和y轴的刻度 2 Matlab中 坐标轴刻度 的不同风格
  • 【matlab】函数meshgrid的用法详解(生成网格矩阵)和ndgrid的区别及用法

    meshgrid 函数用来生成网格矩阵 xff0c 可以是二维网格矩阵 exp1 1 生成 二维 网格 xff0c 用法为 xff1a x y 61 meshgrid a b a 和b是一维数组 xff0c 如a 61 1 2 3 b 61
  • 【matlab】./和/ .*和* 有什么区别

    matlab中 与 有什么区别 点运算是处理元素之间的运算直接 在矩阵计算中只能处理符合矩阵运算法则的运算矩阵计算和作图都是点运算在对数值计算时 xff0c 和 其实是没有区别的 例 xff1a 对于矩阵A 61 a b c d xff0c
  • 【matlab】 GMSK的调制与解调【附详尽注释】

    简介code 1 简介 MSK调制是调制指数为0 5的二元数字频率调制 xff0c 具有很好的特性 xff0c 如恒包络 相对窄的带宽 并可以相干检测 MSK 最小频移键控 信号在任一码元间隔内 xff0c 其相位变化为 2 xff0c 而
  • 【matlab】利用matlab在图形中绘制箭头、标注、圈圈 - 很帅很酷炫

    转载声明 xff1a 感谢 xff1a MyBear 尊重原作者劳动 xff1a http www 360doc com content 14 0527 21 1054746 381542462 shtml 一 二维箭头 1 xff0e 调
  • 【杂谈】甘于平凡?还是思索求生?

    前言 不觉然 xff0c 已19年 xff0c 不知不觉 xff0c 求学生涯至此告一段落 有感觉 xff0c 岁月的痕迹开始发酵 xff0c 身体抑或精神 xff0c 今不如往 思考下 xff0c 互联网浪潮之下 xff0c 之后 xff
  • 匈牙利算法-看这篇绝对就够了!

    本文讲述的是匈牙利算法 xff0c 即图论中寻找最大匹配的算法 xff0c 暂不考虑加权的最大匹配 xff08 用KM算法实现 xff09 xff0c 文章整体结构如下 xff1a 基础概念介绍 算法的实现 好的 xff0c 开始 xff0
  • 面试的一般流程及其常见的问题

    又是一年毕业季 xff0c 也要踏上求职之路 xff0c 在这段时间也关注很多求职方面的消息 下面是一些面试的一般流程及其常见的问题 xff1a 面试职位 xff1a XXXX 开始语 xff1a 你好 xff0c 首先祝贺你通过了前几个环
  • 构建库函数(STM32)

    一 定义外设的各基地址 xff0c 参考存储器映射 span class token comment 由存储器的映射可知 xff0c 片上外设基地址0x4000 0000 span span class token macro proper
  • PID控制器原理概述

    PID控制 PID概述 xff1a 控制框图 xff1a 增量式PID和位置式PID特点 xff1a PID控制参数整定口诀 xff1a 注 xff1a 本文部分内容摘自 先进PID控制MATLAB仿真 xff08 第4版 xff09 刘金
  • PyQt5 事件处理机制

    PyQt5 事件处理机制 PyQt为事件处理提供了两种机制 xff1a 高级的信号与槽机制 xff0c 以及低级的事件处理机制 信号与槽可以说是对事件处理机制的高级封装 常见事件类型 xff1a 键盘事件 xff1a 按键按下和松开 鼠标事
  • PyQt5 实现串口接数据波形显示工具

    PyQt5 实现串口接数据波形显示工具 工具简述主程序代码Qt Designer设计UI界面程序运行效果 工具简述 基于PyQt5开发UI界面使用QtDesigner设计 xff0c 需要使用到serial模块 xff08 串口库 xff0
  • ROS CMakeLists.txt的编写学习

    调用ROS中的函数 xff0c cmakelists的编写学习过程 如有错误 xff0c 请留言指教 多谢 A 首先要了解的 CMakeLists txt是CMake的构建系统构建软件包的输入文件 任何兼容的CMake都包含了描述如何构建代
  • 【Node】Buffer 与 Stream

    node 为什么会出现 Buffer 这个模块 在最初的时候 xff0c JavaScript 只运行在浏览器端 xff0c 对于处理 Unicode 编码的字符串很容易 xff0c 但是对于处理二进制以及非 Unicode 编码的数据便无
  • ROS的tf包中坐标变换的方法

    1 setRotation函数的参数 在坐标变换的时候常有这样的写法 xff1a tfTutorialsAdding a frame C 43 43 transform setOrigin span class hljs symbol tf
  • 卡尔曼滤波的理解以及参数调整

    一 前言 卡尔曼滤波器是一种最优线性状态估计方法 xff08 等价于 在最小均方误差准则下的最佳线性滤波器 xff09 xff0c 所谓状态估计就是通过数学方法寻求与观测数据最佳拟合的状态向量 在移动机器人导航方面 xff0c 卡尔曼滤波是
  • ROS自定义msg类型及使用

    一 创建msg消息 参考 xff1a CreatingMsgAndSrv 首先创建一个空的package单独存放msg类型 xff08 当然也可以在任意的package中自定义msg类型 xff09 这里为便于说明 xff0c 建立一个名为
  • WebRTC-集成qsv硬解码实现

    1 Window下QSV硬解码配置 在libavcodec codec list c下添加 amp ff h264 qsv decoder 在ffmpeg generate gni下加入 34 libavcodec h264idct c 3
  • [ROS] ROS基础,创建工作空间,创建功能包,ros功能包相关命令,Catkin编译系统,catkin_make的编译方式

    1 工作空间 工作空间 xff08 work space xff09 是ROS系统中存放工程开发相关的文件夹 xff0c 其目录结构如下 xff1a src xff1a 代码空间 xff08 Source Space xff09 xff0c