ROS Package 程序框架结构

ROS学习手记 - 1了解并安装ROS+创建ROS_Package ROS学习手记:   先看了《ROS操作系统的入门资料(2015修订)》,了解了ROS的基本概念。   1. ROS 的安装, 具备了虚拟机使用经验的同学可以搜“Ubuntu for ROS”进行下载 .iso 文件在虚拟机里安装。笔者使用的是VirtualBox作为虚拟机工具。这里就不多说了。 官方Tutorial里的Installing and Configuring Your ROS 阅读详情

ROS 的编程教程虽然详细但是有些零散,总结一下编写的ROS程序的程序框架结构,参考资料会放在后面。

假设我们要编写一个这样的ROS package:

  1. 有一个C++的lib库 libA,可以提供给其他包和自己使用
  2. 有在package中自定义的message,msgA,
  3. 有一个C++结点 node1,依赖于本package中自定义的msgA和libA,以及外部的库
  4. 有一个Python module,pymodA ,可以提供给其他包使用
  5. 有一个python 的脚本 pynodeA,可以通过rosrun和roslaunch进行执行,依赖于ModA

整个package的文件目录结构如下

.
├── CMakeLists.txt
├── include
│   ├── libA
│   │   └── libA.h
│   └── nodeA
│       └── nodeA_class.h
├── launch
│   └── test.launch
├── msg
│   └── msgA.msg
├── nodes
│   └── nodeA.cpp
├── package.xml
├── script
│   └── pynodeA_pub.py
├── setup.py
├── src
│   ├── libA
│   │   └── libA.cpp
│   ├── nodeA
│   │   └── nodeA_class.cpp
│   ├── pymodA
│   │   ├── hello.py
│   │   └── __init__.py
│   └── pymodB
│       ├── hello.py
│       └── __init__.py
└── tree.txt

下面来详细的进行各个部分的介绍

include 文件夹

include文件夹主要存放创建的lib以及和node相关的头文件的路径,为了结构清晰,在include文件夹下面建子目录来存放相关文件,比如libA和nodeA两个文件夹

msg文件夹

存放自定义的message

nodes文件夹

存放可执行的node的C++文件

script文件夹

存放python的可执行脚本

src文件夹

存放lib的源文件以及C++可执行文件的源文件

setup.py

根据 ROS rospy 教程中所说,setup.py可以使得你的project中的python脚本使用你在该project中自定义的包,比如上面pynodeA_pub.py可以使用pymodA和pymodB中的函数,在pynodeA_pub文件中只需要添加 

import pymodA
import pymodB

需要对cmake文件进行相应的修改,后面会进行介绍,注意setup.py文件要和package的cmakelist文件在同一目录下,setup.py文件主要就是给cmake使用的配置文件

其他参考资料:ROS Handling of setup.py

cmakelists.txt

这个文件是最最重要的,接下来会详细的介绍cmakelist的结构和参数

首先ROS 的package的编译有两种模式,一种直接使用catkin_make ,这是develop模式,生成devel文件夹,一种是使用catkin_make install , 安装package,这个主要是为了你的包给别人使用。那么我们就分两种模式来看

catkin_make

首先可以明确使用这个命令在devel文件夹里面能够得到哪些:

  1. include 文件夹下的包名目录下只有msgA.h一个文件
  2. lib文件夹下的包名目录下有可执行文件nodeA,以及动态链接库libA.so,但是没有libA.h这个头文件
  3. lib/python/dist-packages目录下有包目录package/,里面有msg/目录,存放所有的生成的msg的python model. python的module目录pymodA/和pymodB/

你在project里面可以直接使用:

# 对C++ 源文件,可以使用
# include "nodeA/nodeA_class.h"
# include "libA/libA.h"
# include "package/msgA.h"

# 对 python 脚本,可以
import pymodA
import pymodB
from package.msg import msgA

想要实现这些,cmakelist文件的对应语句如下:

1.首先是生成消息模板的部分,直接参考 ROS CreatingMsgAndSrv

2.生成了消息之后,要使得其能够在project内部使用,所以cmakelist文件中有

include_directories(
  include ${catkin_INCLUDE_DIRS} # 将头文件include进去
)

3.生成lib和可执行文件

add_library(libA src/libA/libA.cpp) 
target_link_libraries(libA
  ${catkin_LIBRARIES}
)
add_dependencies(libA ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
FILE(GLOB_RECURSE SOURCE_FILES src/*.cpp) # 抓取子目录对应源文件,我这里用到了src 里面的所有

add_executable(nodeA
  nodes/nodeA.cpp ${SOURCE_FILES} # add all relative cpp files
)
add_dependencies(nodeA ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(nodeA
  libA 
  ${catkin_LIBRARIES}
)

这里面除了带有我们自己命名的那些是自定义之外,其余都是默认的值,一般不需要进行改动

写了这些语句,那么catkin_make基本没问题了,如果想要其他包使用,要进行install,下面还有补充的几点注意:

  • devel 下编译得到的只有libA.so和msgA.h,所以其他的包只能用到msg.h,想要使用libA需要Cmake进行install
  • 对于python,如果有依赖的包建议使用requirements.txt来安装Python文件中依赖的包,虽然ros有通过package.xml定义的方法来解决,但是没法设置参数,所以不是很方便

catkin_make install

这个主要得到install文件夹,这个和devel文件夹几乎一个结构模式,不同的是里面的内容比devel文件夹多的多。

install文件夹中主要有

1.include 文件夹的package目录下有msgA.h,libA文件夹和nodeA文件夹,分别存放libA.h和nodeA.h

2.lib/package文件夹下有可执行文件nodeA以及pynodeA_pub.py可执行脚本

3.lib/python/dist-packages目录下和devel相同

cmakelist文件中的相应的参数设置如下

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
install(PROGRAMS  # python 可执行脚本
  script/pynodeA_pub.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html

install(TARGETS nodeA  # 可执行文件
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

## Mark libraries for installation 库文件
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
install(TARGETS libA
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} # .so
)

## Mark cpp header files for installation 头文件
install(DIRECTORY include/
  DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
  FILES_MATCHING PATTERN "*.h"
  PATTERN ".svn" EXCLUDE
)

# launch 文件
install(DIRECTORY launch/
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
  PATTERN ".svn" EXCLUDE)

执行完catkin_make install 之后,会在工作空间目录得到install 文件夹,当你需要在其他地方使用是,使用source install/setup.bash

 

 

 

 

 

关于source后ROS_PACKAGE_PATH没有包含的解决方案 有时可能大家在source后发现ROS_PACKAGE_PATH和自己想象中不一样 【提出问题】在执行下面的命令后 source devel/setup.bash ROS_PACKAGE_PATH丢失之前的部分路径 【场景举例】 当前我们执行 echo ROS_PACKAGE_PATH 输出结果为 /opt/ros/indigo/share:/opt/ros/indigo/s... 阅读详情

相关推荐

ROS学习-创建一个Package包

Package由什么组成? 每一个Package中都必须包括以下两个文件: package.xml 能够提供当前Package包的描述(元)信息 CMakeLists.txt 如果它是一个catkin元包,它必须具有相关的样板文件CMakeLists.txt文件。 此外,每个Package包必须有其自己的文件夹,这就意味着没有嵌套的包,也不存在多个package包共享同一个文件夹。 最简单的package包可能结构如下所示: my_package/ CMakeLists.txt pack

晓晨的博客 9042

cmake 学习 cmake-package(7)

cmake-packages(7)install foreach 使用 configure_file使用foreach 使用说明

liu-yonggang的专栏 1418

ROS学习笔记(1)——如何创建一个ROS PACKAGE

Written By Asou, 4/22/2018 简介:本文将使用catkin来创建package,并且使用rospack来显示package中的依赖关系。参考文章:ROSwiki 1. catkin package的组成 每个package都必然包含package.xml和CMakeLists.txt两个文件。每一个package都必须拥有其独有的源文件夹,即不同的pac...

啦啦啦啦啦 5732

setuptools include_package_data

MANIFEST.in在package外,所以路径是相对于MANIFEST.in而不是相对于package的 graft ./package/data

Claroja 1436

ROS机器人——ROS Package, Nodes, Topics, Messages的理解和应用

参考资料 ROS Wiki Package 概述:ROS工程中的软件组织单元,包含了库、可执行文件、脚本等 package.xml文件将给出package的大致信息 $ rospack find [package_name] // 返回库所在路径,如/opt/ros/kinetic/share/roscpp $ roscd [locationname[/subdir]] // 直接跳转到pack...

guikunchen的博客 1221

在ROS中workspace和Package的创建

ROS古月居学习总结:空间workspace和包创建记录 分块目录ROS古月居学习总结:空间workspace和包创建记录ROS启动总结创建workspace1.创建工作空间的方法:2.创建完之后编译3。在写完程序后`catkin_mak`e之后,还要更新环境在workspace中创建自己的包在包中编写属于自己的程序写完程序之后对程序的编译c++文件的操作:2.py文件的操作:记录一下c++代码和py代码的开头格式总结 ROS启动总结 1,总的来说就是节点与节点之间的通信,节点代表机器人的某种功能,多个节点

qq_41090487的博客 705

ros自带package在哪里_ROS知识(3)----功能包package编译的两种方式

ROS的包编译有两种方法(我知道的),一种是用rosmake,这种方法简单;另一种是用catkin_make,这种方法更方便包的管理和开发。这两种方法都是先建立工作空间workspace(类似于vs下的解决方案,用来管理很多的项目),然后建立包package(类似于vs下的项目),最后利用rosmake或者catkin_make进行编译和运行。学会第一种方式,再去学习第二种就很简单了。源码附在每个...

weixin_30310149的博客 1178

ROS 中的Package软件包

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

Alex的博客 1054

CMake 和 CMakeLists.txt 使用

Q1:Could not find a package configuration file By not providing "FindNLOPT.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "NLOPT", but CMake did not find one. Could not find a package con

weixin_41469272的博客 7564

Ch0. 如何在ROS中创建一个自己的package

笔者检索网络上 ROS 创建 workspace 的教程,发现很多并不完整,对于像我一样完全不懂 ROS 和 Ubuntu 系统的初学者来说总会在一些地方卡壳,遂自己动手写一篇基础教程。

qq_51533303的博客 1130

十二、Yocto集成ROS2 app程序(package)

yocto系统中集成ros app应用程序

TNT的博客 1371

Cmake中 set、include、find_package 、add_definitions语句解析

cmake 中set、include、find_package 、add_definitions语句解析

wanglei_11的博客 990

Windows11 下 Detectron2 的安装与配置全攻略

本文提供了在Windows11系统下安装和配置Detectron2的完整教程。详细介绍了从环境准备、创建虚拟环境、安装PyTorch与CUDA,到修改源码、编译安装以及运行验证Demo的全过程,帮助开发者克服Windows平台上的常见问题,成功部署这一强大的计算机视觉库。

weixin_29081703的博客 244

[ROS](02)创建&编译ROS软件包Package

packages是在ROS中整理和组织的主要单元,是在ROS中能建立及分享的最小单元。

CynalFly的博客 3391

别再只盯着CXL协议了,聊聊CXL.mem里那个能动态调优内存性能的‘QoS遥测’到底怎么用

本文深入解析CXL.mem协议中的QoS遥测功能,探讨如何通过DevLoad指标动态调优内存性能。文章详细介绍了QoS遥测的核心机制、多QoS类别设备的实战配置,以及AI训练、金融交易和视频处理场景中的优化案例,帮助数据中心实现高效内存资源管理。

weixin_33725722的博客 436

Metal ECO实战:如何在不修改底层掩模的情况下修复芯片时序问题

本文深入探讨了Metal ECO技术在芯片设计中的应用,这是一种在不修改底层晶体管掩模的前提下,仅通过调整金属连线和替换预置填充单元来修复时序问题的“微创手术”。文章详细解析了其原理、适用场景、关键操作流程与命令,并分享了实战中的高级技巧与常见陷阱,为面临流片前时序违例的工程师提供了宝贵的修复指南。

wdx0123456的博客 430

ROS程序设计系列 - 2.ROS Package

关于包的顶层设计依赖关系,里程碑节点,维护人员,版本(Alpha/Beta/Debug/Release)等都需要很好的进行安排协调,其。在前面介绍的时候,提及Node之间的交互采用ROS消息进行消息解耦。ROS包采用CMake进行工程管理方式,相关的编译选项、源代码文件、目标交付件名称都在这里进行定义。IDE环境有很多,笔者也不喜欢Eclipse,其实整个包组成知道,一个Notepad也能解决问题。简单介绍了下ROS中间件的一些基本概念,对已有示例进行了最基本的构建和运行等基本操作。就是这个文件的维护。

lida2003的专栏 1247

深入解析以太网接口中的BOB Smith电路设计

本文深入解析以太网接口中的BOB Smith电路设计,详细介绍了其在共模噪声抑制、浪涌防护和EMI优化中的关键作用。通过实际案例和设计要点,帮助工程师正确选择75Ω电阻和高压电容等元件,优化PCB布局,解决电压型与电流型PHY的设计差异,以及千兆与百兆以太网的特殊考量。

weixin_28339967的博客 684

ROS总结——ROS程序包(一)

创建ROS程序包本博客是对http://wiki.ros.org/上ROS教程的学习总结,欢迎大家交流学习。1.catkin程序包组成 程序包要想称为catkin程序包必须符合以下要求: 该程序包必须包含catkin compliant package.xml文件 ,这个package.xml文件提供有关程序包的元信息。 程序包必须包含一个catkin 版本的CMakeLists.txt文件,而C

YongqiangGao的专栏 3588

SAP-QM-质检操作

SAP-QM-质检操作

yanzibing99的博客 8176

【基础-单选】Row组件中有两个Text组件,如果使用justifyContent对齐方式,下面哪个属性可以实现左右两端对齐:

Row组件中有两个Text组件,如果使用justifyContent对齐方式,下面哪个属性可以实现左右两端对齐

江拥羡橙的博客 1302

ROS2文档翻译总结(4)——创建package

背景 1 What is a ROS 2 package?

juveacheron1的博客 2012

ADBMS1818芯片

 可测量多达18串电池电压 3 mV最大总测量误差 内置isoSPI接口 使用单根双绞线,长达100米 290 μs内可完成系统中所有单体电池电压测量。

m0_61973119的博客 4271

ROS入门之package

什么是package package:功能包,是ros软件的基本组成形式,是catkin编译的基本单元。一个package可以包含多个可执行文件。 package只有有这两个文件,才能被编译系统认为是package。 CmakeListt.txt CmakeListt.txt规定编译规则。源文件,依赖,目标文件等。。。 在创建package时候,会生成模板,然后来改就好。 package.xm...

野生蘑菇菌的博客 1248

《Autosar从入门到精通-实战篇》总目录_培训教程持续更新中...

欢迎大家订阅《Autosar从入门到精通-实战篇》,下方整理了相关博文的目录(单击蓝色字体即可跳转),方便大家获取。 本专栏旨在:扫除Autosar工具链配置过程中的障碍,加深对Autosar理论的理解。 温馨提醒: 如有疑问,可在博文的“评论区”给小编留言,进行技术交流(评论区开启了验证功能,审核通过后,会显示); 如有疑问,也可以通过博文中的第一个图片联系小编,获取专栏/博文的实时状态; 由于工作限制,仅做个人技术交流。添加好友时,请备注您的“姓名-公司-职务...

「汽车电子助手」的博客 12万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ros自带package在哪里_roschina/教程/创建Package

Note: This tutorial assumes that you have completed the previous tutorials: navigating the ROS filesystem. Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't f...

weixin_39596720的博客 427

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: VScode python代码提示:添加自定义的寻找路径
下一篇: 拯救者Y7000P 安装Ubuntu16.04问题解决
hacker_G
博客等级 码龄9年 75粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值