ROS文件系统架构

1.二进制包与源码包区别
sudo apt-get install二进制包=.deb(封装包,内容无法查看)
第三方包需要(get clone方式)下载到工作空间的src下+在工作空间进行编译(可修改代码)
小技巧:
编译或者运行时,提示缺少依赖包,这时试着安装提示依赖包。/再不行google下
2.文件系统级
ROS里边的所有都是由文件(包)构成,重点分成catkin+package(package.xml+CMakefile.txt)+metapackage
2.1Catkin编译系统
make扩充了gcc/g++,而cmake扩充了make,catkin扩充了cmake/编译源码后无需安装即可使用/自动生成find_package()代码...
编译过程:编译之前读取package.xml和CMakefile.txt信息;编译时,先递归方式找到工作空间下的所有包/某个包,然后根据找到的包里面的CMakefile.txt文件生成
makefile.txt中间缓存信息放置build文件,最后make根据中间文件编译生成可执行文件等放置devel文件下
2.2notice
编译后,cd ..回到工作空间, source ~/catkin_ws/devel/setup.bash #将新生成的可执行文件信息告知ROS系统,否则可能找不到文件
2.3package
具有统一的格式,被用来编译的包,一个package下常见的文件、路径有:      
  ├── CMakeLists.txt    #package的编译规则(必须)
  ├── package.xml       #package的描述信息(必须)
  ├── src/              #源代码文件
  ├── include/          #C++头文件
  ├── scripts/          #可执行脚本
  ├── msg/              #自定义消息
  ├── srv/              #自定义服务
  ├── models/           #3D模型文件
  ├── urdf/             #urdf文件
  ├── launch/           #launch文件
2.3.1package.xml
遵循xml标签文本的写法,包括了package的name, description, version, maintainer(s), license,opt. authors, url's, dependencies, plugins, 
etc...的描述信息
<pacakge>               根标记文件  
<name>                  包名  
<version>               版本号  
<description>           内容描述  
<maintainer>            维护者 
<license>               软件许可证  
<buildtool_depend>      编译构建工具,通常为catkin    
<depend>                指定依赖项为编译、导出、运行需要的依赖,最常用
<build_depend>          编译依赖项  
<build_export_depend>   导出依赖项
<exec_depend>           运行依赖项
<test_depend>           测试用例依赖项  
<doc_depend>            文档依赖项
说明:其中1-6为必备标签,1是根标签,嵌套了其余的所有标签,2-6为包的各种属性,7-9为编译相关信息。
2.3.2CMakefile.txt
一套源码到目标文件生成的编译过程规则:调用Catkin的函数/宏;解析package.xml;找到其他依赖的catkin软件包;生成可执行文件,具体规则如下:
cmake_minimum_required() #CMake的版本号 
project()                #项目名称 
find_package()           #找到编译需要的其他CMake/Catkin package
catkin_python_setup()    #catkin新加宏,打开catkin的Python Module的支持
add_message_files()      #catkin新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message()       #catkin新加宏,生成不同语言版本的msg/srv/action接口
catkin_package()         #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library()            #生成库
add_executable()         #生成可执行二进制文件
add_dependencies()       #定义目标文件依赖于其他目标文件,确保其他目标已被构建
target_link_libraries()  #链接
catkin_add_gtest()       #catkin新加宏,生成测试
install()                #安装至本机
2.3.3rosdep
一个较常使用的命令是rosdep install --from-paths src --ignore-src --rosdistro (indigo) -y,用于安装工作空间中src路径下所有package的依赖
                项(由pacakge.xml文件指定)
3.对于为什么会有依赖项的思考
为了节省电脑空间,共享资源-相互调用即可,不需要将每个实现功能都各自拥有包
4.metapacakge中的两个必须文件和普通pacakge不同点
CMakeLists.txt:加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
package.xml:标签将所有软件包列为依赖项,标签中添加标签声明。
metapacakge在我们实际开发一个大工程时可能有用

### ROS2 系统架构组成与工作原理 #### 三标题:ROS2 的系统架构概述 ROS2 是一种分布式机器人操作系统,其核心目标是提供高效的通信机制以及灵活的开发环境。它继承了 ROS1 的许多特性并进行了改进,特别是在实时性和安全性方面做了大量优化[^1]。 #### 三标题:ROS2 架构的主要组成部分 ROS2 的架构主要由以下几个部分构成: - **文件系统** 文件系统定义了 ROS2 工作空间的标准目录结构及其管理方式。这包括 `src` 目录用于存储源码包、`build` 和 `install` 目录分别用于构建和安装过程中的产物存放位置等。通过命令行工具如 `colcon build` 可以方便地管理和编译这些资源[^2]。 - **计算图 (Compute Graph)** 计算图描述的是节点之间的消息传递关系网络。在 ROS2 中,每一个执行单元被称为 Node(节点),它们之间通过 Topics(主题)、Services(服务)或者 Actions 进行数据交换。这种去中心化的 P2P 设计使得整个系统更加健壮可靠[^3]。 - **开源社区支持** 开源社区提供了丰富的库函数和支持文档帮助开发者快速上手项目开发。同时也有助于推动技术进步和技术分享交流活动开展[^4]。 #### 三标题:ROS2 的工作原理解析 从系统实现角度来看,以下是几个关键概念的工作流程解析: - **Launch 系统** Launch 系统允许用户在一个配置文件里启动多个节点以及其他相关组件。这对于复杂的应用场景非常有用,因为它简化了同步初始化的过程。例如,在一个典型的导航任务中,可能需要同时加载地图服务器、激光雷达驱动程序等多个模块才能正常运作[^5]。 - **DDS 技术引入** Data Distribution Service (DDS) 是一种高性能的数据分发协议,被广泛应用于工业自动化领域。在 ROS2 当中采用 DDS 实现底层通讯层的功能替代了原来 TF 的角色,从而提高了跨平台兼容能力和传输效率[^6]。 - **安全飞地集成** 随着物联网的发展趋势日益明显,网络安全成为不可忽视的重要议题之一。为此,ROS2 提出了基于 “enclave” 的设计理念来增强系统的防护能力。具体而言就是把某些特定功能限定到独立的安全区域内运行,即使外部受到攻击也不会影响内部敏感操作继续进行下去[^7]。 ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_publisher') publisher = node.create_publisher(String, 'topic', 10) msg = String() i = 0 def timer_callback(): nonlocal i msg.data = f'Hello World {i}' i += 1 publisher.publish(msg) timer_period = 0.5 # seconds node.create_timer(timer_period, timer_callback) try: while True: rclpy.spin_once(node) except KeyboardInterrupt: pass node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 上述代码展示了一个简单的发布者节点实例,体现了 ROS2 下如何利用 Python API 创建基本的消息发布逻辑[^8]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值