Catkin创建工程

2023-05-16

介绍

catin_make编译过程,cmake指令依据你的CMakeLists.txt 文件,生成cmakefiles和makefile文件,make再依据此cmakefiles和makefile文件编译链接生成可执行文件,catkin_make是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径.

一、先确定自己的环境变量是否设置正确

export | grep ROS

若出现如下的,说明是正确的

declare -x ROSLISP_PACKAGE_DIRECTORIES=""
declare -x ROS_DISTRO="indigo"
declare -x ROS_ETC_DIR="/opt/ros/indigo/etc/ros"
declare -x ROS_MASTER_URI="http://localhost:11311"
declare -x ROS_PACKAGE_PATH="/opt/ros/indigo/share:/opt/ros/indigo/stacks"
declare -x ROS_ROOT="/opt/ros/indigo/share/ros"

二、创建一个catkin工作空间

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace

三、打开工作空间,编译这个工作空间,即使工作空间是空的

$ cd ~/catkin_ws/
$ catkin_make

编译命令:

$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

四、查看编译后的目录

可看到“build”和“devel”这两个文件夹,与src文件夹并列
在devel文件夹里,可以看到有几个setup.*sh文件,
通过source命令激活这些文件中任何一个文件都会将这个工作空间覆盖到环境中:

$ source devel/setup.bash

五、确认自己的工作空间是否已经设置正确

echo $ROS_PACKAGE_PATH

如果出现如下的显示,说明设置正确

/opt/ros/kinetic/share

六、工作空间的文件结构

一个catkin的包主要有以下几部分组成:
(1)必须包括一个package.xml文件;
(2)必须包括一个CMakeLists.txt文件;
(3)在每一个文件夹下只能有一个包,且包不允许嵌套。

workspace_folder/        -- WORKSPACE
  src/                   -- SOURCE SPACE
    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
    package_1/
      src
      include
      CMakeLists.txt     -- CMakeLists.txt file for package_1
      package.xml        -- Package manifest for package_1
    ...
    package_n/
      src
      include
      CMakeLists.txt     -- CMakeLists.txt file for package_n
      package.xml        -- Package manifest for package_n

package.xml文件说明

格式1:格式1标准说明是REP-0127
格式2:格式2标准说明是REP-0140

1.在package.xml中主要包含以下信息:

  • 描述信息(比如package的功能描述、维护者等)
  • 依赖信息
  • 元信息(比如作者、网页)
  • package信息(比如版本)

2. 每个package.xml文件必须包含的标签包括:

<package> 最高级tag,属性:format,用于指定格式 
<name> :package名称
<version> :当前版本
<description>:package的基本描述
<maintainer>(至少一个):维护者
<license> (至少一个):协议
<buildtool_depend>(至少一个):一般情况下只需要指定catkin作为编译工具,在需要交叉编译的情况下需要增加目标机器的编译工具。

可选标签包括:

(多个):指定package的网址 (多个):作者 (多个):编译时需要依赖的其它package,适用于静态库 (多个):声明本package与其它ROS package有冲突,不能同时部署 (多个):声明本package是其它package的替换版本 :用于添加额外的信息,比如需要嵌入的其它package的插件,或者一些说明信息。

以及在格式1和格式2有区别的标签:

格式1
<run_depend> (多个):运行时需要依赖的其它package,如动态链接库、可执行文件、Python模块、脚本文件等。
<test_depend> (多个):进行单元测试时的依赖项,如前两个标签中已出现过,则不必再出现
格式2
<build_export_depend>:用于帮助使用本package的其它包传递依赖声明
<buildtool_export_depend>:构建工具的依赖传递声明
<exec_depend>:相当于格式1的run_depend标签。
<depend>: 相当于build_depend + buildtool_depend + exec_depend,避免重复写三个声明。不建议对系统依赖使用,因为会强行依赖development级package。
<doc_depend>:构建文档所需要的依赖,当前没什么用,以后可能会有需要
<test_depend>:进行单元测试时的依赖项,此标签中的package 可以 在其它标签中出现
上述是对package.xml的基本说明,对于用户而言,如果通过catkin_create_package命令生成的包,往往已经自动生成了需要的全部标签,只需要在依赖有所变化的情况下更改(格式1):

<build_depend>
<run_depend>

CMakeList.txt文件说明

catkin基于CMake实现,CMakeList的语句与基本CMake一致,常用的包括:

  • cmake_minimum_required():CMake版本

  • project():工程名

  • find_package():加载外部变量
    加载catkin中的变量,同时添加angles、roscpp、std_msgs的依赖 find_package(catkin REQUIRED COMPONENTS angles roscpp std_msgs)
    加载Boost中的变量 find_package(Boost REQUIRED COMPONENTS thread)

  • include_directories():添加头文件路径
    添加./include、${catkin_INCLUDE_DIRS}为头文件路径,如果有其它外部路径也在这里添加 include_directories(include ${catkin_INCLUDE_DIRS}) Boost_INCLUDE_DIRS环境变量在上面find_package中加载 include_directories( ${Boost_INCLUDE_DIRS})

  • add_library():生成库
    生成库文件,可传入多个源文件 add_library(your_library libsrc1.cpp libsrc2.cpp libsrc_etc.cpp )

  • add_executable():生成可执行文件
    生成可执行文件,可以传入多个源文件 add_executable(my_node src0.cpp src1.cpp src2.cpp )

  • add_subdirectory():一般情况下,我们的项目各个子项目都在一个总的项目根目录下,但有的时候,我们需要使用外部的文件夹,怎么办呢?add_subdirectory命令,可以将指定的文件夹加到build任务列表中。

  • add_dependencies():添加依赖项,在使用ROS的message、service、action时注意添加,如下:
    添加对其它package消息的依赖,前提是已经通过find_package()引入了这个package add_dependencies(my_target ${catkin_EXPORTED_TARGETS}) # 添加对本package消息的依赖 add_dependencies(my_target ${ ${PROJECT_NAME}_EXPORTED_TARGETS})

  • target_link_libraries():链接库
    为可执行文件或库添加链接库 target_link_libraries(my_node ${catkin_LIBRARIES}
    ROS基本库 ${Boost_LIBRARIES} # Boost库 )

  • install():安装
    默认情况catkin会为每个package在./devel中建立目录,存放目标文件
    目标文件可以直接通过rosrun和roslaunch访问
    如需制定其它安装位置,则需通过install()命令 install(TARGETS my_node0 my_node1 ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )

  • 除此之外,catkin还为ROS设计了一些独有语句,包括:
    add_message_files(), add_service_files(), add_action_files()
    用于添加自定义的message、service和action文件。基本语法为:
    以message为例,service、action类似 add_message_files( # 目录名 DIRECTORY msg # 文件名 FILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg )

  • generate_messages()
    用于生成所有定义的message、service、action文件,需要添加本文件需要依赖的message文件包。
    一般情况下需要依赖std_msgs,如果用到了其它类型的msg,也要在这声明。如下:
    generate_messages(DEPENDENCIES std_msgs)

  • catkin_package()
    catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
    必须在声明add_library()或add_executable()前调用
    有5个可选参数:
    INCLUDE_DIRS - 声明给其它package的include路径
    LIBRARIES - 声明给其它package的库
    CATKIN_DEPENDS - 本包依赖的catkin package
    DEPENDS - 本包依赖的非catkin package
    CFG_EXTRAS - 其它配置参数
    比如:
    catkin_package( INCLUDE_DIRS include LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS roscpp nodelet DEPENDS eigen opencv)

创建一个catkin_ws工作空间

一、使用catkin_create_pkg脚本去创建一个新的安装包”beginner_tutorials”,这个包依赖于 std_msgs, roscpp, and rospy:

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

这个将会创建一个 beginner_tutorials文件夹,包含了package.xml and a CMakeLists.txt.

在创建的beginner_tutorials文件夹下可以看到package.xml和CMakeLists.txt。catkin_create_pkg要求您给出包的名字,及选择性的给出所创建的包依赖于哪一个包。他的使用方法如下:

catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

这样,我们的一个包就创建好了,我们可能会需要对包之间的依赖性做一下解释。我们可以使用rospack命令来查看包之间的依赖关系。查看直接依赖关系:

rospack depends1 beginner_tutorials 

可以看到,返回的结果正是我们使用catkin_create_pkg时,所使用的参数。我们还可以直接在beginner_tutorials包下的package.xml中查看包的依赖关系。使用命令:

roscd beginner_tutorials
cat package.xml

二、编译

使用 catkin_make
catkin_make 是一个命令工具用来简化catkin的标准工作流程的,你可以想象一下catkin_make工具可以调用cmake和make来完成编译。
用法:

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

Catkin创建工程 的相关文章

  • Nvidia Jetson TX2刷机过程

    近来 xff0c 项目需要 xff0c 实验室配置了TX2 xff0c 有幸能够接触使用 xff0c 下面简单介绍刷机过程 写在前面 a 使用VM虚拟机Ubuntu14 04成功刷机 xff0c 不过听说有的会出现连接不稳定的情况 xff0
  • 梯度向量、Jacobian矩阵、Hessian矩阵

    这里 xff0c 讨论三个概念 xff1a 梯度向量 Jacobian矩阵 Hessian矩阵 xff1b 由自变量x 61 x1 x2 xn T 因变量 xff1a 为一维f x 时 xff0c 此时其一阶导数构成的向量为梯度向量g x
  • 匿名飞控位置估计笔记

    摸着石头过河 xff0c 一边看一边学 感谢两位博主的文章 xff1a 1 px4位置估计 inav 2 根据两点的经纬度求方位角和距离 主要过程如下 1 机体加速度转换2 GPS测量值与推测值误差3 通过测量值与推测值的误差求NED坐标系
  • bmi055六轴传感器获取数据

    BMI055的加速度计和陀螺仪的地址是分开的 xff0c 在读取的时候要分开读取 xff0c 我是用的iic的方式读取的 define ACC ADDRESS 0X18 加速度计的地址 define GYRO ADDRESS 0X68 陀螺
  • 使用arecord、aplay命令实现音频的采集和播放

    arecord和aplay是alsa utils一部分 我们在Linux系统下进行音频开发时经常使用 xff0c 非常方便 先简单介绍一下 arecord 采集原始音频 arecord r 8000 t raw c 1 f S16 BE t
  • centos7安装docker与删除容器实例和镜像

    doker简介 docker是一个开源的应用容器引擎 xff0c 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中 xff0c 然后发布到任何流行的linux机器或者windows机器上 xff0c 也可以实现虚拟化 容器是完全使用
  • 刘韧:记者的数字力量

    本文写于2003年09月04日 真正到了收拾物品离开报社的那一刻 xff0c 他才确切感到空落来得如此地具体 从明天起 xff0c 他的稿件将不能再见诸本报 xff1b 从明天起 xff0c 他将失去本报读者 xff1b 从明天起 xff0
  • 刘韧:此时使用文字 只因为文字简练

    以下文字写于2007年 一 此时使用文字只因为文字简练 1 博士说他的女儿有阅读障碍 我说 xff0c 我10多岁的时候 xff0c 也有阅读障碍 我爸让我读杂志上的一篇文章 xff0c 读完 xff0c 问我这篇文章在讲什么 xff0c
  • 刘韧:角色、扮相、知识与历史

    以下文字皆写于2008年1月 一 角色与扮相的欺骗 1 当编辑时 xff0c 最怕向名家约稿 xff0c 名家赏脸写的稿子 xff0c 质量不高 xff0c 不能用 2 喜欢李白的人 xff0c 千万不要买 李白全集 xff0c 全集里有许
  • 刘韧:和人物共同创作人物故事

    编者按 xff1a 本文为DoNews编辑部内训课实录 xff0c 创作于2011年 由传媒见闻谭缘于2020年4月根据录音整理 我从1997年开始人物写作 xff0c 一直写到2003年 5年间 xff0c 无论刮风下雨 xff0c 还是
  • 刘韧马杰花总:诗歌小说电影游戏都是元宇宙

    时间 xff1a 2021年10月31日晚 访谈 xff1a 花总 xff08 网络红人 xff0c 被 华盛顿邮报 称为 在风险中推动变革的博客 代表 xff09 嘉宾 xff1a 刘韧 xff08 中国著名IT记者 xff09 马杰 x
  • 刘韧:怎样做记者

    编发按 xff1a 2021年11月27日 xff0c CSDN刘韧写作班第一期课后 xff0c 潜山同学说 xff1a 2001年 xff0c 我爸说你给他们培训 xff0c 主题是 怎样做记者 xff0c 他把你当时培训的内容打印出来
  • 尤雨溪Vue登榜GitHub之路看似不难

    本文完成于2022年3月6日 xff0c CSDN首发 xff0c 将在 新程序员 杂志刊登 采访撰稿 xff1a 刘韧 谷磊 林兴陆 李彤等 录音整理 xff1a 谷磊 周扬 林兴陆 鲁飞龙 编辑校对 xff1a 田玮靖 萧少聪 王雪艳
  • ROS:关于xacro模型在gazebo的加载

    ROS xff1a 关于xacro模型在gazebo的加载 这个模型加载问题折磨了我好几天 xff0c 今天总算是找到问题所在 我还一直以为是新版本的问题 xff0c 结果却是自己的问题 不够仔细 因此记录下来 xff0c 引以为戒 1 问
  • 刘韧:元宇宙不需要普通人

    作者 xff1a 刘韧 编辑 xff1a 谷磊 1 躲进小楼成一统 xff0c 我理解是 xff0c 躲进小圈子的小宇宙 xff0c 这个小宇宙基础如果是Web3 0 xff0c 那么就叫元宇宙了 自嘲 鲁迅 运交华盖欲何求 xff1f 未
  • 开源时代:刘韧对话任旭东崔宝秋章文嵩蒋涛

    来源 xff1a 1024程序员节 之 技术英雄会 主题 xff1a 开源英雄共话 我们的开源时代 时间 xff1a 2022年 10月 24日 主持嘉宾 刘韧 xff1a 云算科技董事长 知识英雄 作者 DoNews创始人 对话嘉宾 任旭
  • 刘韧工作手册(2023年版)

    刘韧于2022年9月22日为云算科技做内部演讲 由谭缘整理成文 xff0c 李欣欣编辑 xff0c 朱芳文审定 一 认知篇 01 干中学 xff0c 重复做 学 是为了 习 xff0c 学到的东西是为了下一次习的时候 xff0c 做得更好
  • 个人大于集体

    詹姆斯库克大学新加坡校舍正门 我依旧记得高中时发的一条朋友圈 xff1a 一个人的价值是由他周围的人决定的 十五岁时 xff0c 我一个人离开家乡 xff0c 来到新加坡 半年后 xff0c 把第一所学校的语言班老师骂退休了 xff0c 我
  • Foresight对话:刘韧对谈王建硕、曾映龙、Joy Xue

    Foresight 2023论坛现场 自 2022年 11月上线以来 xff0c OpenAI研发的ChatGPT一度风靡全球 面对这波 AI浪潮 xff0c 有些人拥抱了新趋势 xff0c 有些人则担心会被取代 xff0c 另一些人发掘其
  • 贾扬清开源 AI 框架 Caffe | 开源英雄

    编者按 在开源与人工智能的灿烂星河里 xff0c 贾扬清的名字都格外地耀眼 因为导师 Trevor Darrell 教授的一句 你是想多花时间写一篇大家估计不是很在意的毕业论文 xff0c 还是写一个将来大家都会用的框架 xff1f xff

随机推荐

  • 一个程序员的连续套现

    Fishman xff0c 吴锡桑 28岁 xff0c 中国软件行业协会理事 xff0c 1995年毕业于暨南大学计算机系 致力于多媒体和互联网软件的开发多年 xff0c 著作的软件曾获广东省 34 高校杯 34 软件比赛第一名 xff1b
  • 雷军留名

    影响中关村的50个人 知识英雄 Wednesday December 26 2001 3 29 PM 刘韧 雷军 xff0c 1969年2月16日出生于湖北省仙桃市 xff1b 1991年 xff0c 毕业于武汉大学计算机系 xff1b 1
  • docker load 是个什么东西?

    docker load 是个什么东西 xff1f docker load 是一个用于将 Docker 镜像加载到本地 Docker 环境中的命令 通常 xff0c 我们将 Docker 镜像从 Docker Hub 或者其他镜像仓库中下载到
  • Git同步一直转的解决方法

    之前遇到的一个问题 xff1a 使用VScode软件的Git同步不管怎样都无法拉取推送 xff08 左下角会一直转 xff0c 而且没有报错提示 xff09 但是在对应项目的文件目录下 xff0c 使用控制台就可以 在VSCode的控制台输
  • ROS:关于节点和节点句柄以及命名空间

    ROS xff1a 关于节点和节点句柄以及命名空间 参考资料 xff1a ROS官方文档 首先 xff0c 我们需要明确的是 节点 和 节点句柄 是不同的 一般而言 xff0c 一个cpp文件只能启动一个ROS节点 xff0c 但作为该节点
  • 【操作系统】生产者消费者问题

    生产者消费者模型 文章目录 生产者消费者模型 64 toc 一 生产者消费者问题二 问题分析三 伪代码实现四 代码实现 xff08 C 43 43 xff09 五 互斥锁与条件变量的使用比较 一 生产者消费者问题 生产者消费者问题 xff0
  • VScode中使用git终端,无法识别命令

    提示 xff1a vscode中使用git终端 xff0c 无法识别输入的命令 xff1a vscode版本 xff1a VSCodeUserSetup x64 1 60 1 exe git版本 xff1a 2 32 0 windows 2
  • Ubuntu18.04 VINS-Mono & Fast-Planner

    Ubuntu18 04 VINS Mono amp Fast Planner 官方GIthub 安装依赖 span class token comment 额外ros包 span span class token function sudo
  • Autoware Docker 安装

    1 Ubuntu20 04 Docker 官方教程安装 Docker 官方教程安装 2 安装 nvidia container runtime Access an NVIDIA GPU 官方参考 span class token comme
  • 卡尔曼滤波公式理解

    卡尔曼滤波 卡尔曼滤波适用于线性高斯系统 xff0c 即系统满足叠加性 齐次性 xff0c 噪声满足正态分布 其使用上一次的最优结果预测当前的值 xff08 先验估计 xff09 xff0c 同时使用观测值修正当前值 xff0c 得到最优结
  • 学习编程,API很重要么?

    学习编程 xff0c API的重要性几何 xff1f 在培训中 xff0c 很多人问到了 xff0c 学习Java xff0c 是否需要学习那些大量API的用法 xff0c 从而成为一个精通Java编程开发的coder xff1f 首先 x
  • App 后台架构设计方案 设计思想与最佳实践

    CSDN 2016博客之星评选结果公布 系列直播 零基础学习微信小程序 xff01 我的2016 主题征文活动 博客的神秘功能 App 后台架构设计方案 设计思想与最佳实践 标签 xff1a App后台架构设计用户验证方案后台架构的演进架构
  • 语音信号处理算法

    EQ DRC AEC NS
  • uIP与LWIP的区别

    uIP是专门为8位和16位控制器设计的一个非常小的TCP IP栈 完全用C编写 xff0c 因此可移植到各种不同的结构和操作系统上 xff0c 一个编译过的栈可以在几KB ROM或几百字节RAM中运行 uIP中还包括一个HTTP服务器作为服
  • C++基础用法—冒号的用法

    C 43 43 基础用法 冒号的用法 一 用法一 xff1a 继承1 1用法 xff1a 用在class或struct后面1 2示例代码 二 用法二 xff1a 赋值1 1用法 xff1a 用在成员函数 构造函数后面1 2示例代码1 2 1
  • 路由器相关开发流程

    路由器相关开发流程 宽带上网已经不是什么新鲜事 情 xff0c 人们对相关的网络器件已经不再陌生 xff0c 比如说常见的路由器 对于一般的网络用户 xff0c 他们能知道怎样使用路由器来上网 玩游戏等就已经感到很满足了 xff0c 通常情
  • 将Ubuntu终端的输出信息保存到log中

    参考website xff1a http www linuxidc com Linux 2011 04 34543 htm 执行以下命令 xff0c 开启保存 xff1a sudo script screen log 之后你在终端输入的相关
  • 《芯片介绍系列》之MT7628芯片详细介绍(MT7628平台处理器)

    有的家庭路由器拆开 xff0c 里面最显眼的芯片型号是 xff1a MT7628KN MT7628系列产品是新一代2T2R 802 11n Wi Fi AP 路由器 系统单芯片 xff08 摘自百度 xff09 更多介绍见此 xff1a M
  • python:函数传参是否会改变函数外参数的值

    参考链接 xff1a https blog csdn net u012614287 article details 57149290 https blog csdn net qq915697213 article details 66972
  • Catkin创建工程

    介绍 catin make编译过程 xff0c cmake指令依据你的CMakeLists txt 文件 生成cmakefiles和makefile文件 make再依据此cmakefiles和makefile文件编译链接生成可执行文件 ca