ROS2从入门到精通0-4:ROS2核心架构与常用指令大全

news2024/11/17 3:41:38

目录

  • 0 专栏介绍
  • 1 ROS2核心架构
    • 1.1 工作空间
    • 1.2 功能包
  • 2 ROS2常用指令
    • 2.1 功能包相关
    • 2.2 节点运行相关
    • 2.3 话题相关
    • 2.4 参数相关
    • 2.4 录制包、播放包相关
    • 2.5 服务相关
    • 2.6 动作相关
    • 2.7 生命周期相关

0 专栏介绍

本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。

🚀详情:《ROS2从入门到精通》


1 ROS2核心架构

ROS2工程的核心架构如图所示

请添加图片描述

其中的核心概念阐述如下:

1.1 工作空间

工作空间是存放工程开发文件的地方,可能包含多个功能包,其中又细分为四个子空间:

  • 源码空间src:源码空间包含了功能包源代码
  • 编译空间build:编译空间存放编译源码空间产生的缓存信息和中间文件
  • 日志空间log:日志空间存放各种警告、错误、信息等日志;
  • 安装空间install:安装空间存放开发完毕并通过测试的构建目标,如可执行文件和脚本。

工作空间的名称可以自己定义,数量也并不唯一

1.2 功能包

功能包是ROS的基本功能单元,可能包含多个节点,其中包含工程文件主体

  • CMakeLists.txt(用于C++功能包):配置编译规则,比如源文件、依赖项、链接库,注意这里使用ament而非ROS1中的catkinament基于CMake构建系统,开发者可以方便地管理依赖关系、编译选项、安装目标等

    cmake_minimum_required(VERSION 3.8)
    project(node_lab)
    
    if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
      add_compile_options(-Wall -Wextra -Wpedantic)
    endif()
    
    # find dependencies
    find_package(ament_cmake REQUIRED)
    find_package(rclcpp REQUIRED)
    
    add_executable(node_helloworld_class src/node_helloworld_class.cpp)
    ament_target_dependencies(node_helloworld_class rclcpp)
    
    install(TARGETS
      node_helloworld_class
      DESTINATION lib/${PROJECT_NAME})
    
    ament_package()
    
  • package.xml(用于C++与Python功能包):包信息,比如包名、版本、作者

    <?xml version="1.0"?>
    <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
    <package format="1">
      <name>node_lab</name>
      <version>0.0.0</version>
      <description>TODO: Package description</description>
      <maintainer email="winter@winter.com">winter</maintainer>
      <license>TODO: License declaration</license>
    
      <buildtool_depend>ament_cmake</buildtool_depend>
      <test_depend>ament_lint_auto</test_depend>
      <test_depend>ament_lint_common</test_depend>
    
      <export>
        <build_type>ament_cmake</build_type>
      </export>
    </package>
    
  • setup.py(用于Python功能包):包含版权信息,并配置程序入口

    setup(
        name=package_name,
        version='0.0.0',
        packages=[package_name],
        data_files=[
            ('share/ament_index/resource_index/packages',
                ['resource/' + package_name]),
            ('share/' + package_name, ['package.xml']),
            (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
            (os.path.join('share', package_name, 'config'), glob(os.path.join('config', '*.*'))),
            (os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))),
        ],
        install_requires=['setuptools'],
        zip_safe=True,
        maintainer='winter',
        maintainer_email='winter@winter.com',
        description='TODO: Package description',
        license='TODO: License declaration',
        tests_require=['pytest'],
        entry_points={
            'console_scripts': [
            ],
        },
    )
    
  • scripts:存储脚本文件,例如python源码或.sh脚本

  • src: 存储C++源文件

  • include:存储.h头文件

  • launch:存储启动文件,可一次性运行多个节点

  • config:存储配置信息

其中,package.xmlCMakeLists.txt非常重要,前者作为功能包入口声明依赖关系;后者解析.xml并执行具体的查找依赖、链接库等行为,文件缺失或错误配置都会导致编译失败。

2 ROS2常用指令

2.1 功能包相关

  • 查看功能包列表

    ros2 pkg list
    
  • 创建一个新的功能包

    ros2 pkg create --build-type ament_cmake package_name
    
  • 创建功能包时添加依赖项

    ros2 pkg create --build-type ament_cmake package-name --dependencies [deps]
    
  • 编译所有功能包

    colcon build
    
  • 编译指定功能包

    colcon build –packages-select package_name
    

2.2 节点运行相关

  • 查看所有运行节点

    ros2 node list
    
  • 查看某一个节点信息

    ros2 node info node_name
    
  • 节点运行方式1

    ros2 run package_name executable_file
    
  • 节点运行方式2

    ros2 launch package_name node_launch_file (e.g., .py, .launch)
    

2.3 话题相关

  • 查看系统内活跃topic

    ros2 topic list
    
  • 查看topic的消息类型

    ros2 topic type topic_name
    
  • 显示topic内容

    ros2 topic echo topic_name
    
  • 向特定topic发送数据,其中args是实际数据,需要以YAML格式输入

    ros2 topic pub topic_name msg_type 'args' [--once | --rate <num>]
    
    • 例1:发送一次运动指令
      ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
      
      其中--once表示发布一个消息然后退出
    • 例2:以10Hz发送运动指令
      ros2 topic pub --rate 10 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
      
      其中--rate num表示以numHz稳定流发布消息
  • 查看发布数据的帧率

    ros2 topic hz topic name
    

2.4 参数相关

  • 查看节点的子命名空间和参数

    ros2 param list
    
  • 获取当前参数的值

    ros2 param get node_name param_name
    
  • 设置参数的值

    ros2 param set node_name param_name value
    
  • 存储节点所有参数值到本地的node_name.yaml文件

    ros2 param dump node_name
    
  • 存储节点的所有参数值到指定路径

    ros2 param dump node_name --output-dir /path
    
  • 导入本地参数文件

    ros2 run package_name executable_name --ros-args --params-file <file_name>
    

2.4 录制包、播放包相关

  • 查看bag信息
    ros2 bag info bag_name
    
  • 正常播包命令
    ros2 bag play bag_dir_name
    
  • 倍速播包命令
    ros2 bag play bag_dir_name -r 2
    
  • 循环播包命令
    ros2 bag play bag_dir_name -l
    
  • 播放单个topic
    ros2 bag play bag_dir_name --topics /topic_name
    

以上包路径bag_dir_name也可以换成具体的包数据库文件xxx.db3

  • 录制特定topic的包
    ros2 bag record topic_name
    
  • 录制多个topic的包
    ros2 bag record -o new_bag_name topic1_name topic2_name
    
  • 录制所有topic的包
    ros2 bag record -a
    

以上录制完成后会在本地多一个bag_dir_name,其中包含配置.yaml和数据.db3

2.5 服务相关

  • 查看服务列表

    ros2 service list		# 加-t可显示服务消息类型
    
  • 查看服务的数据类型

    ros2 service type service_name
    
  • 查找使用指定数据类型的服务

    ros2 service find type_name
    
  • 通过命令行调用服务

    ros2 service call <service_name> <service_type> <args>
    

    例如

    ros2 service call /spawn turtlesim/srv/Spawn “{x: 2, y: 2, theta: 0.2, name: ‘’}

2.6 动作相关

  • 列出域内可用的动作列表

    ros2 action list	# 加 -t 可显示动作消息类型
    
  • 查看指定action的信息

    ros2 action info action_name
    
  • 模拟客户端手动发起动作请求

    ros2 action send_goal <action_name> <type_name> <goal_data> <--feedback>
    

    --feedback指定是否显示反馈信息,例如

    ros2 action send_goal /crossing_acton duckietown_interface/action/Crossing “{speed: 0.2, direction: ‘right’}--feedback
    

2.7 生命周期相关

  • 查看有哪些lifecycle节点
    ros2 lifecycle nodes
    
  • 查看lifecycle节点所有可行的转换
    ros2 lifecycle list node_name -a
    
  • 获取节点状态
    ros2 lifecycle get node_name
    
  • 设置节点状态
    ros2 lifecycle set node_name configure
    

🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1550649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SD卡备份和烧录ubuntu20.04镜像

设备及系统&#xff1a;nuc幻影峡谷工控机&#xff0c;ubuntu20.04&#xff0c;树莓派4B&#xff0c;SD卡读卡器 一、确定SD卡设备号的两种方法 方法1&#xff1a; 将有ubuntu镜像的SD卡插入读卡器&#xff0c;再将读卡器插入电脑主机&#xff0c;在 工具 中打开 磁盘&#…

Spring Cloud Gateway Server MVC

之前你如果要用spring cloud gateway &#xff0c;就必须是webflux 的&#xff0c;也就是必须是异步响应式编程。不能和spring mvc 一起使用。现在spring cloud 新出了一个可以不用webflux的gateway。 具体使用mvc的gateway步骤如下 普通的Eureka Client的项目 如果你只是想测…

【信号处理】基于DGGAN的单通道脑电信号增强和情绪检测(tensorflow)

关于 情绪检测&#xff0c;是脑科学研究中的一个常见和热门的方向。在进行情绪检测的分类中&#xff0c;真实数据不足&#xff0c;经常导致情绪检测模型的性能不佳。因此&#xff0c;对数据进行增强&#xff0c;成为了一个提升下游任务的重要的手段。本项目通过DCGAN模型实现脑…

全局UI方法-弹窗三-文本滑动选择器弹窗(TextPickDialog)

1、描述 根据指定的选择范围创建文本选择器&#xff0c;展示在弹窗上。 2、接口 TextPickDialog(options?: TextPickDialogOptions) 3、TextPickDialogOptions 参数名称 参数类型 必填 参数描述 rang string[] | Resource 是 设置文本选择器的选择范围。 selected nu…

企业选购USB服务器,有哪些注意事项?

一、前言 随着信息技术的飞速发展&#xff0c;USB服务器在企业日常运营中的作用日益凸显。USB服务器不仅实现了远程USB设备的共享和管理&#xff0c;还提升了企业数据的安全性和管理效率。 然而&#xff0c;面对市场上琳琅满目的USB服务器产品&#xff0c;企业在选购时需要注…

2024年天津财经大学珠江学院退役大学生士兵专升本专业课报名须知

天津财经大学珠江学院2024年高职升本科&#xff08;面向退役大学生士兵&#xff09;职业技能综合考查报考须知 一、报名条件 报考天津财经大学珠江学院2024年高职升本科职业技能综合考查的退役大学生士兵应符合天津市及我院规定的报考资格。考生须完成天津市高职升本科文化考…

【数据结构】Java中Map和Set详解(含二叉搜索树和哈希表)

目录 Map和Set详解 1.二叉搜索树 2.Map常见方法 3.Set常见方法 4.哈希表 Map和Set详解 Map&#xff1a;一种键值对结构&#xff0c;hashMap中键和值均可以为空&#xff0c;hashTable中则不可以存放null值 Set&#xff1a;一种集合&#xff0c;不能存放重复元素&#xff0c…

Docker进阶:Docker-compose 实现服务弹性伸缩

Docker进阶&#xff1a;Docker-compose 实现服务弹性伸缩 一、Docker Compose基础概念1.1 Docker Compose简介1.2 Docker Compose文件结构 二、弹性伸缩的原理和实现步骤2.1 弹性伸缩原理2.2 实现步骤 三、技术实践案例3.1 场景描述3.2 配置Docker Compose文件3.3 使用 docker-…

[Semi-笔记]Switching Temporary Teachers for Semi-Supervised Semantic Segmentation

目录 概要创新一&#xff1a;Dual Temporary Teacher挑战&#xff1a;解决&#xff1a; 创新二&#xff1a;Implicit Consistency Learning&#xff08;隐式一致性学习&#xff09;挑战&#xff1a;解决&#xff1a; 实验结果小结论文地址代码地址 分享一篇2023年NeurIPS的文章…

碳素光线疗法与阳光猪舍

碳素光线疗法与阳光猪舍 生息在地球上的所有动物、在自然太阳光奇妙的作用下、生长发育。太阳光的能量使它们不断进化、繁衍种族。现在、生物能够生存、全仰仗于太阳的光线。太阳光线中、包含有动物健康所需要的极为重要的波长。因此、和户外饲养的动物相比、在室内喂养的观赏动…

动态规划相关题目

文章目录 1.动态规划理论基础2.斐波那契数3.爬楼梯4.使用最小花费爬楼梯5.不同路径6.不同路径 II7. 整数拆分8. 不同的二叉搜索树 1.动态规划理论基础 1.1 什么是动态规划? 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一…

ClickUp、clickupython

文章目录 关于 ClickUp关于 clickupython安装Authentication方法 1: API Key (最快)当前 ClickUpClient 功能TaskListFolderAttachmentsCommentsTeamsChecklistsGoalsMembersTagsSpacesTime Tracking 教程 关于 ClickUp 官网&#xff1a;https://clickup.com/University Cours…

Acer宏碁暗影骑士擎AN515-58笔记本电脑工厂模式原厂Win11系统ISO镜像安装包下载

宏基AN515-58原装出厂OEM预装Windows11系统工厂包&#xff0c;恢复出厂时开箱状态一模一样&#xff0c;带恢复还原功能 链接&#xff1a;https://pan.baidu.com/s/1iCVSYtList-hPqbyTyaRqQ?pwdt2gw 提取码&#xff1a;t2gw 宏基原装系统自带所有驱动、NITROSENSE风扇键盘灯…

【动手学深度学习】深入浅出深度学习之线性神经网络

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 线性回归 &#x1f33b;1.1 矢量化加速 &#x1f33b;1.2 正态分布与平方损失 &#x1f33c;2. 线性回归的从零开始实现 &#x1f33b;2.1. 生成数据集 &#x…

H4020 40V输入EN智能控制 带线补 同步降压控制器芯片

40V输入EN智能控制带线补的同步降压控制器芯片的工作原理涉及多个方面&#xff0c;以下是其关键部分的解释&#xff1a; 输入电压管理&#xff1a;芯片能够接收高达40V的输入电压。这通常需要一个前端电路来处理高电压&#xff0c;比如使用电阻分压、电容器滤波或者其他保护电…

C++:变量和常量(3)

变量 什么是变量&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器。我们通过变量名获取数据&#xff0c;甚至数据可以修改 变量的作用&#xff1a;给指定的内存空间起名&#xff0c;后期通过起的名字就可以调用整个内存空间 定义变量的格式 &a…

LVS负载均衡-DR模式配置

LVS&#xff1a;Linux virtual server ,即Linux虚拟服务器 LVS自身是一个负载均衡器&#xff08;Director&#xff09;&#xff0c;不直接处理请求&#xff0c;而是将请求转发至位于它后端的真实服务器real server上。 LVS是四层&#xff08;传输层 tcp/udp&#xff09;负载均衡…

基于javaweb(springboot)汽车配件管理系统设计和实现以及文档报告

基于javaweb(springboot)汽车配件管理系统设计和实现以及文档报告 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

python--冒泡排序和main函数

1.判断是不是回文数&#xff1a; x int(input("请输入一个正整数&#xff1a;")) x str(x) if x x[::-1]:print("是回文数。") else:print("不是回文数。") 2.冒泡排序 # 冒泡排序: # [30&#xff0c;8&#xff0c;-10&#xff0c; 50&am…

【漏洞复现】网络验证系统getInfo接口处存在SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…