ROS架构详细分析

ROS架构详细分析ROS RobotOperati 机器人操作系统 中的计算图 ComputationG 是一个核心概念 它描述了 ROS 节点之间的数据流动和通信方式

大家好,欢迎来到IT知识分享网。

ROS文件系统

1.ROS的系统架构

ROS(Robot Operating System,机器人操作系统)的系统架构可以大致分为三个主要层次:OS层、中间层和应用层。

  1. OS层:ROS并不是一个传统意义上的操作系统,无法像Windows、Linux一样直接运行在计算机硬件之上,而是需要依托于Linux系统。
  2. 中间层:Linux是一个通用系统,并没有针对机器人开发提供特殊的中间件,因此ROS在中间层做了大量工作。其中,最为核心的是基于TCPROS/UDPROS的通信系统。ROS的通信系统基于TCP/UDP网络,并在此之上进行了再次封装,形成了TCPROS/UDPROS。此外,中间层还实现了ROS的核心通信机制以及众多机器人开发库。
  3. 应用层:在应用层,ROS需要运行一个管理者——Master,负责管理整个系统的正常运行。这一层次确保了功能节点的正常运行。

从系统实现的角度来看,ROS的架构还可以分为文件系统、计算图和开源社区三个层面。计算图代表了ROS内部的处理流程和数据流动,文件系统则关注于ROS的文件结构、组织方式和相关工具命令,而开源社区则是ROS得以持续发展和完善的重要支撑。

1.1 ROS文件系统

ROS文件系统指的是在硬盘上ROS源代码的组织架构,其架构如下

在这里插入图片描述

WorkSpace --- 自定义的工作空间 |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。 |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。 |--- src: 源码 |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成 |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件 |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml) |-- scripts 存储python文件 |-- src 存储C++源文件 |-- include 头文件 |-- msg 消息通信格式文件 |-- srv 服务通信格式文件 |-- action 动作格式文件 |-- launch 可一次性运行多个节点 |-- config 配置信息 |-- CMakeLists.txt: 编译的基本配置 
1.1.1package.xml

该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。

<?xml version="1.0"?> <!-- 格式: 以前是 1,推荐使用格式 2 --> <package format="2"> <!-- 包名 --> <name>demo01_hello_vscode</name> <!-- 版本 --> <version>0.0.0</version> <!-- 描述信息 --> <description>The demo01_hello_vscode package</description> <!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="">Jane Doe</maintainer> --> <!-- 维护人员 --> <maintainer email="">xuzuo</maintainer> <!-- One license tag required, multiple allowed, one license per tag --> <!-- Commonly used license strings: --> <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> <!-- 许可证信息,ROS核心组件默认 BSD --> <license>TODO</license> <!-- Url tags are optional, but multiple are allowed, one per tag --> <!-- Optional attribute type can be: website, bugtracker, or repository --> <!-- Example: --> <!-- <url type="website">http://wiki.ros.org/demo01_hello_vscode</url> --> <!-- Author tags are optional, multiple are allowed, one per tag --> <!-- Authors do not have to be maintainers, but could be --> <!-- Example: --> <!-- <author email="">Jane Doe</author> --> <!-- The *depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use depend as a shortcut for packages that are both build and exec dependencies --> <!-- <depend>roscpp</depend> --> <!-- Note that this is equivalent to the following: --> <!-- <build_depend>roscpp</build_depend> --> <!-- <exec_depend>roscpp</exec_depend> --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>message_generation</build_depend> --> <!-- Use build_export_depend for packages you need in order to build against this package: --> <!-- <build_export_depend>message_generation</build_export_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use exec_depend for packages you need at runtime: --> <!-- <exec_depend>message_runtime</exec_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <!-- Use doc_depend for packages you need only for building documentation: --> <!-- <doc_depend>doxygen</doc_depend> --> <!-- 依赖的构建工具,这是必须的 --> <buildtool_depend>catkin</buildtool_depend> <!-- 指定构建此软件包所需的软件包 --> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <!-- 指定根据这个包构建库所需要的包 --> <build_export_depend>roscpp</build_export_depend> <build_export_depend>rospy</build_export_depend> <build_export_depend>std_msgs</build_export_depend> <!-- 运行该程序包中的代码所需的程序包 --> <exec_depend>roscpp</exec_depend> <exec_depend>rospy</exec_depend> <exec_depend>std_msgs</exec_depend> <!-- The export tag contains other, unspecified, tags --> <export> <!-- Other tools can request additional information be placed here --> </export> </package> 
1.1.2CmakeLists.txt

文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。

cmake_minimum_required(VERSION 3.0.2) #所需 cmake 版本
project(demo01_hello_vscode) #包名称,会被 ${PROJECT_NAME} 的方式调用

 Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

 Find catkin macros and libraries
 if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
 is used, also find other catkin packages
#设置构建所需要的软件包
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

 System dependencies are found with CMake's conventions
#默认添加系统依赖
# find_package(Boost REQUIRED COMPONENTS system)


 Uncomment this if the package has a setup.py. This macro ensures
 modules and global scripts declared therein get installed
 See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# 启动 python 模块支持
# catkin_python_setup()


 Declare ROS messages, services and actions 
 声明 ROS 消息、服务、动作... 


 To declare and build messages, services or actions from within this
 package, follow these steps:
 * Let MSG_DEP_SET be the set of packages whose message types you use in
   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
 * In the file package.xml:
   * add a build_depend tag for "message_generation"
   * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
     but can be declared for certainty nonetheless:
     * add a exec_depend tag for "message_runtime"
 * In this file (CMakeLists.txt):
   * add "message_generation" and every package in MSG_DEP_SET to
     find_package(catkin REQUIRED COMPONENTS ...)
   * add "message_runtime" and every package in MSG_DEP_SET to
     catkin_package(CATKIN_DEPENDS ...)
   * uncomment the add_*_files sections below as needed
     and list every .msg/.srv/.action file to be processed
   * uncomment the generate_messages entry below
   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)

 Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

 Generate services in the 'srv' folder
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

 Generate actions in the 'action' folder
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

 Generate added messages and services with any dependencies listed here
# 生成消息、服务时的依赖包
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )


 Declare ROS dynamic reconfigure parameters 
 声明 ROS 动态参数配置 


 To declare and build dynamic reconfigure parameters within this
 package, follow these steps:
 * In the file package.xml:
   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
 * In this file (CMakeLists.txt):
   * add "dynamic_reconfigure" to
     find_package(catkin REQUIRED COMPONENTS ...)
   * uncomment the "generate_dynamic_reconfigure_options" section below
     and list every .cfg file to be processed

 Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )


 catkin specific configuration 
 catkin 特定配置

 The catkin_package macro generates cmake config files for your package
 Declare things to be passed to dependent projects
 INCLUDE_DIRS: uncomment this if your package contains header files
 LIBRARIES: libraries you create in this project that dependent projects also need
 CATKIN_DEPENDS: catkin_packages dependent projects also need
 DEPENDS: system dependencies of this project that dependent projects also need
# 运行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo01_hello_vscode
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)


 Build 


 Specify additional locations of header files
 Your package locations should be listed before other locations
# 添加头文件路径,当前程序包的头文件路径位于其他文件路径之前
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

 Declare a C++ library
# 声明 C++ 库
# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/demo01_hello_vscode.cpp
# )

 Add cmake target dependencies of the library
 as an example, code may need to be generated before libraries
 either from message generation or dynamic reconfigure
# 添加库的 cmake 目标依赖
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

 Declare a C++ executable
 With catkin_make all packages are built within a single CMake context
 The recommended prefix ensures that target names across packages don't collide
# 声明 C++ 可执行文件
add_executable(Hello_VSCode src/Hello_VSCode.cpp)

 Rename C++ executable without prefix
 The above recommended prefix causes long target names, the following renames the
 target back to the shorter version for ease of user use
 e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
#重命名c++可执行文件
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

 Add cmake target dependencies of the executable
 same as for the library above
#添加可执行文件的 cmake 目标依赖
add_dependencies(Hello_VSCode ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

 Specify libraries to link a library or executable target against
#指定库、可执行文件的链接库
target_link_libraries(Hello_VSCode
  ${catkin_LIBRARIES}
)


 Install 
 安装 


# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

 Mark executable scripts (Python etc.) for installation
 in contrast to setup.py, you can choose the destination
#设置用于安装的可执行脚本
catkin_install_python(PROGRAMS
  scripts/Hi.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 ${PROJECT_NAME}_node
#   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 ${PROJECT_NAME}
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )

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

 Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )


 Testing 


 Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_demo01_hello_vscode.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

 Add folders to be run by python nosetests
# catkin_add_nosetests(test)

1.5.2 ROS文件系统相关命令

ROS 的文件系统本质上都还是操作系统文件,可以使用Linux命令来操作这些文件,不过,在ROS中为了更好的用户体验,ROS专门提供了一些类似于Linux的命令,这些命令较之于Linux原生命令,更为简介、高效。

catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包

sudo apt install xxx === 安装 ROS功能包

sudo apt purge xxx ==== 删除某个功能包

rospack list === 列出所有功能包

rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径

roscd 包名 === 进入某个功能包

rosls 包名 === 列出某个包下的文件

apt search xxx === 搜索某个功能包

rosed 包名 文件名 === 修改功能包文件

执行

roscore 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。

rosrun 包名 可执行文件名 === 运行指定的ROS节点

roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件

1.2 ROS计算图

1.2.1计算图简介

ROS(Robot Operating System,机器人操作系统)中的计算图(Computation Graph)是一个核心概念,它描述了ROS节点之间的数据流动和通信方式。计算图不仅仅是一个通信网络,它更反映了ROS设计哲学的核心——灵活性、模块化和可重用性。

具体来说,ROS的计算图是由多个处理单元(节点)以及这些单元之间的通信链接(主题、服务和动作)构成的网络。每个节点代表ROS中运行的一个进程,负责处理数据并完成特定的任务,如感知环境、控制机器人部件或执行决策算法。节点之间通过预定义的接口相互通信,这些接口包括主题(Topics)、服务(Services)等。

为了更直观地了解计算图的运行情况,ROS提供了一个实用的工具——rqt_graph。rqt_graph能够创建一个显示当前系统运行情况的动态图形,以点的网络形式表现数据交互过程,从而帮助开发者更好地理解和优化ROS系统中的数据流动和通信方式。

1.2.2计算图安装

运行命令:

rosrun rqt_graph rqt_graph

在这里插入图片描述

如果没有安装,输入安装命令

$ sudo apt install ros-noetic-rqt $ sudo apt install ros-noetic-rqt-common-plugins 
1.2.3 演示

运行小海龟 demo

再运行计算图工具,可以看到当前活跃的节点之间的关系拓扑结构

在这里插入图片描述

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/137718.html

(0)
上一篇 2025-06-18 15:26
下一篇 2025-06-18 15:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信