autoware中ROS2学习笔记

文章目录

  • 一、学习资料:
      • 1.1、说明
      • 1.2、Autoware Documentation
      • 1.3、Autoware Universe Documentation
      • 1.4、总结
  • 二、概述
  • 三、ros2--节点组件
    • 什么是组件容器
    • 组件的实现原理
    • 可组合节点--节点组件
      • 什么是节点组件
      • 为什么需要可组合节点
      • 创建可组合节点时构造函数为什么需要rclcpp::NodeOption的参数
    • 可组合节点的实现
      • 1,创建可组合节点功能包
      • 2,添加节点对象构造参数
      • 3,去main,注册可组合节点
      • 4,修改可组合节点CMakeLists.txt
    • component_container工具
      • 作用
    • launch启动组件
      • luanch文件定义

一、学习资料:

ros2官网文档:http://docs.ros.org/en/humble/
autoware官网文档:https://autowarefoundation.github.io/autoware-documentation/main/
autoware.universe官网文档:https://autowarefoundation.github.io/autoware.universe/main/

1.1、说明

autoware的文档分为2部分,一部分是通用的部分,一部分是详细介绍Universe的实现细节。
Autoware Documentation 主要是一些通用部分,例如安装、使用、设计文档等。
Autoware Universe Documentation 主要是介绍自动驾驶功能模块,例如定位、感知、规划、控制的实现等

1.2、Autoware Documentation

Installation 页面解释了Autoware和相关工具的安装步骤。
Tutorials 页面解释了安装后您应该尝试的几个教程。
How-to guides 页面解释了您在习惯 Autoware 后应该阅读的高级主题。
Design 页面解释了Autoware的设计理念.
Contributing 页面解释了如何为 Autoware 做出贡献.
Datasets 页面包含有关可与 Autoware 一起使用的数据集的信息.
Support 页面解释了一些支持资源.
Competitions 页面解释了与 AWF 相关的持续挑战

1.3、Autoware Universe Documentation

Common 存放一些公共模块
Control 控制模块
Evaluator 评测模块,用于评测自动驾驶一些场景
Launch 启动模块,用于启动自动驾驶的各个模块
Localization 定位模块,用于输出定位信息
Map 地图模块,支持Lanelet2地图格式
Perception 感知模块,用于检测障碍物
Planning 规划模块,用于输出规划轨迹
Sensing 传感器模块,用于接入传感器的消息
Simulator 仿真模块,用于自动驾驶仿真
System 系统模块
Tools 工具模块
Vehicle 车辆模块,提供车辆的转向、动力、制动的控制接口

1.4、总结

总结一下如何看autoware的文档。

autoware是基于ros的,如果想要了解ros和工具,可以参考ros的文档;如果想了解autoware如何安装和使用,可以参考Autoware Documentation;如果想了解autoware自动驾驶各个模块的具体实现,可以参考Autoware Universe Documentation。

二、概述

三、ros2–节点组件

参考ros2官网:https://docs.ros.org/en/galactic/Tutorials/Intermediate/Composition.html#unloading-components

什么是组件容器

在不同的进程中运行多个节点。这样可以使不同的进程独立开。一个崩溃其他可以正常运行。也更方便调试各个节点。
在同一个进程中运行多个节点。这样可以使得通信更加高效。
组件容器功能就是用来实现将多个包中的多个节点放于同一个进程中执行。

组件容器本质上也是一个包中的一个可执行文件而已,这个可执行文件会启动所有加载到这个组件容器中的节点。

ros2 run rclcpp_components component_container

组件的实现原理

单进程运行所有节点。

可组合节点–节点组件

什么是节点组件

将节点对象(插件)使用rclcpp_components库中的宏RCLCPP_COMPONENTS_REGISTER_NODE()进行注册到一个组件中,最后通过cmake构建将这个组件生成共享库;在通过component_container容器工具就可以使用这个组件,component_container容器工具可以自动加载共享库,并启动装在共享库中的组件的节点。

为什么需要可组合节点

为了单进程通信,提高通信效率。

创建可组合节点时构造函数为什么需要rclcpp::NodeOption的参数

节点对象包含了很多可配置的属性,包括节点名称、命名空间、参数等,这些选项可以在运行时根据需要进行动态调整。通过将rclcpp::NodeOption作为构造函数的参数,我们可以在创建节点时,为其指定特定的选项。

在定义可组合节点时,使用rclcpp::NodeOption构造参数也是为了运行创建节点时指定节点的参数。

可组合节点的实现

1,创建可组合节点功能包

ros2 pkg create custom_talker --build-type ament_cmake --dependencies rclcpp rclcpp_components --destination-directory src --node-name talker

2,添加节点对象构造参数

Talker::Talker(const rclcpp::NodeOptions & options): Node("talker", options), count_(0){           pub_ = create_publisher<std_msgs::msg::String>("chatter", 10); timer_ =   create_wall_timer(1s, std::bind(&Talker::on_timer, this));
}

3,去main,注册可组合节点

#include "custom_talker/talker.hpp"
#include <chrono>
#include <iostream>
#include <memory>
#include <utility>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals;namespace custom_talker{Talker::Talker(const rclcpp::NodeOptions & options): Node("talker", options), count_(0){  pub_ = create_publisher<std_msgs::msg::String>("chatter", 10);  timer_ = create_wall_timer(1s, std::bind(&Talker::on_timer, this));
}void Talker::on_timer(){  auto msg = std::make_unique<std_msgs::msg::String>();msg->data = "Hello World: " + std::to_string(++count_);  RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", msg->data.c_str());  std::flush(std::cout);  pub_->publish(std::move(msg));
}}  // namespace custom_talker
#include "rclcpp_components/register_node_macro.hpp"
RCLCPP_COMPONENTS_REGISTER_NODE(custom_talker::Talker)

RCLCPP_COMPONENTS_REGISTER_NODE()
中的参数指定----命名空间::类;

4,修改可组合节点CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(custom_talker)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()
#1--添加依赖包
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(rclcpp_components REQUIRED)include_directories(include)#2--将组件生成共享库
#add_executable(talker src/talker.cpp)替换
add_library(talker_component SHARED src/talker.cpp)
target_include_directories(talker_component PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>)
target_compile_features(talker_component PUBLIC c_std_99 cxx_std_17)  # Require C99 and C++17
ament_target_dependencies(talker_component"rclcpp""std_msgs""rclcpp_components"
)
#3--必须注册组件
rclcpp_components_register_nodes(talker_component "custom_talker::Talker")#4--安装组件所在动态库
# install(TARGETS talker
#   DESTINATION lib/${PROJECT_NAME})
install(TARGETStalker_componentARCHIVE DESTINATION libLIBRARY DESTINATION libRUNTIME DESTINATION bin)if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()

rclcpp_componets_register_nodes()
第一个参数:

是组件的名称,和生成的共享库同名。

第二个参数:

被注册到组件中的插件对象,也就是类对象,如果对象存在于命名空间中,需要指定命名空间。

rclcpp_components_register_nodes(talker_component "custom_talker::Talker")

注意:生成的库一定要加上SHARED生成共享库。

component_container工具

作用

1,启动组件容器工具

ros2 run rclcpp_components component_container

2,查看容器是否成功运行

$ ros2 component list

出现:

/ComponentManager

则成功运行。
3,将包中的插件对象加载到组件容器中

ros2 component load /ComponentManager custom_talker custom_talker::Talker

加载成功会返回成功加载的组件的索引。
在这里插入图片描述
参数:

custom_talker-----组件所在包的名称;

custom_talker::Talker—指定的包中的插件的插件名称,也就是类对象名称;

(这个命令并没有指定组件名称,博主猜测应该是通过插件的名称去加载指定的组件到组件容器中。)

组件名称:talker_component

rclcpp_components_register_nodes(talker_component "custom_talker::Talker")

4,使用组件id从容器中卸载组件

ros2 component unload /ComponentManager 1 2

1 2表示卸载两个组件。

launch启动组件

luanch文件定义

1,定义launch文件:

import launch
from launch_ros.actions import ComposableNodeContainer
from launch_ros.descriptions import ComposableNodedef generate_launch_description():"""Generate launch description with multiple components."""#--------第一层--定义容器对象--------------#container = ComposableNodeContainer(name='my_container',namespace='',package='rclcpp_components',executable='component_container',#-------------定义节点组件描述对象------------------#composable_node_descriptions=[#------定义所有需要在一个进程中使用的节点组件--------#ComposableNode(package='composition',plugin='composition::Talker',name='talker'),ComposableNode(package='composition',plugin='composition::Listener',name='listener')],output='screen',)return launch.LaunchDescription([container])

容器对象的name:

就是启动容器后,容器的名称:
在这里插入图片描述
2,安装launch目录

所有的launch功能包在创建launch文件之后,cmake中只需要install launch目录即可:

cmake_minimum_required(VERSION 3.8)
project(component_launch)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)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# comment the line when a copyright and license is added to all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# comment the line when this package is in a git repo and when# a copyright and license is added to all source filesset(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()#只需要加这个指令即可
install(DIRECTORY launchDESTINATION share/${PROJECT_NAME}
)ament_package()

描述了组件需要启动的所有节点,之后就可以一个指令运行组件,不再需要一步一步启动容器,加载节点组件:

ros2 launch component_launch talker_listener.launch.py

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三级_网络技术_27_计算机网络环境及应用系统的安装与调试

1.对于频繁改变位置并使用DHCP获取PP地址的DNS客户端&#xff0c;为减少对其资源记录的手动管理&#xff0c;可采取的措施是()。 允许动态更新 使用反向查找区域 增加别名记录 设置较小的生存时间 2.下列Windows 2003系统命令中&#xff0c;可以清空DNS缓存(DNScache)的是…

svn文件定时全量备份

在win11操作系统中&#xff0c;使用定时任务脚本的方式实现对SVN文件的定时备份 SVN备份脚本 1 创建脚本simpleBackup.bat 该脚本主要用于实现备份过程的信息展示 echo 正在备份版本库%1...... md %BACKUP_DIRECTORY%\%2 %SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_D…

mongodb连表查询,postman使用

要实现与SQL类似的查询&#xff0c;你需要使用聚合框架&#xff08;Aggregation Framework&#xff09; SELECT b.name, a.* FROM user a LEFT JOIN order b ON a.id b.id WHERE b.name LIKE %acd%; 从MongoDB 3.2版本开始&#xff0c;引入了聚合框架中的$lookup阶段&#xf…

AI人工智能 卷积神经网络(CNN)

AI人工智能 卷积神经网络&#xff08;CNN&#xff09; 卷积神经网络与普通神经网络相同&#xff0c;因为它们也由具有可学习的权重和偏差的神经元组成。 普通的神经网络忽略了输入数据的结构&#xff0c;所有的数据在送入网络之前都被转换为一维数组。 该过程适合常规数据&…

【Java日志系列】Log4j日志框架

目录 前言 一、Log4j简介 二、Log4j组件介绍 1. Loggers 2. Appenders 3. Layouts 三、快速入门 1. 入门代码 2. 日志级别 四、配置文件的使用 五、自定义日志输出格式 六、配置不同的Appender 1. 输出到文件 2. 输出到数据库 七、自定义Logger配置 总结 前言…

超简单理解LSTM和GRU模型

目录 参考资料 RNN在反向传播时容易遭受梯度消失的问题&#xff0c;而梯度是用于更新神经网络权重的关键因子&#xff0c;梯度消失描述的是梯度在时间序列反向传播中逐渐减小的情况。 若梯度过小&#xff0c;它对于网络的学习贡献甚微。结果是&#xff0c;在RNN中&#xff0c;梯…

unity游戏开发003:深入理解Unity中的坐标系

Unity游戏开发 “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发深入理解Unity中的坐标系前言1. 坐标轴2. 左手坐标系3. 世界坐标系 vs. 局部坐标系4. 坐标变换5. 注意事项 总结 深入理解Unity中…

基于STM32开发的智能家居温控系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭智能温控办公室环境监测常见问题及解决方案 常见问题解决方案结论 1. 引言 智能家居温控系统通过整合温度传感器、湿度传感器、风扇和加热器等硬件&#xf…

【数据结构进阶】哈希的应用

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; C || 数据结构 目录 &#x1f308;前言&#x1f525;位图位图的概念位图的实现位图的变体 &#x1f525;布隆过滤器布隆过滤器的概念布隆过滤器的插入布隆过滤器的查找布隆过滤器的删除布…

Windows 10/11和Linux双系统用户请勿安装最新更新 否则将无法启动

据蓝点网报道&#xff0c;Windows 10/11 最新累积更新存在已知问题&#xff0c;如果你同时安装了 Linux 双系统则会在更新后导致系统无法正常启动。 启动时会出现如下报错&#xff1a; Verifiying shim SBAT data failed: Security Policy Violation.Something has gone serio…

Python 绘图入门

数据可视化的概念及意义 数据可视化有着久远的历史&#xff0c;最早可以追溯至10世纪&#xff0c;至今已经应用和发展了数百年。不知名的天文学家是已知的最早尝试以图形方式显示全年当中太阳&#xff0c;月亮和行星的位置变化的图。 图1 数据可视化的发展历程 什么是数据可视…

顶级期刊TMI论文解读┆PLHN: 用于DCE-MRI影像中乳腺肿瘤分割的原型学习引导混合网络

一、论文简介 本推文详细介绍了一篇上海理工大学健康科学与工程学院医学信息工程研究所&#xff08;以下简称为医信所&#xff09;周雷副教授课题组的最新论文《Prototype Learning Guided Hybrid Network for Breast Tumor Segmentation in DCE-MRI》&#xff0c;该论文发表在…

【Rust】使用开源项目搭建瓦片地图服务

本文通过获取在线和离线地图数据&#xff0c;使用开源Rust项目搭建瓦片地图服务&#xff0c;并使用DevExpress的MapControl控件使用自建地图服务 获取地图数据 获取地图数据有很多种方式&#xff0c;这里分别用在线和离线地图数据举例说明 在线下载瓦片地图 打开在线瓦片地…

搭建内网开发环境(一)|基于docker快速部署开发环境

引言 最近因需要搭建一套简易版的纯内网的开发环境&#xff0c;服务器采用 centos8.0&#xff0c;容器化技术采用 docker 使用 docker-compose 进行容器编排。 该系列教程分为两大类&#xff1a; 软件安装和使用&#xff0c;这类是开发环境常用的软件部署和使用&#xff0c;涉…

Oracle VM VirtualBox虚拟机内存不够用的解决方案

一、 前言 在使用Oracle VM VirtualBox虚拟机的过程中&#xff0c;随着时间的推移&#xff0c;我们会感觉我们的内存越来越不够用&#xff0c;今天就来给大家分享一下我们如何解决虚拟机内存不够用的问题。 二、解决方法 1.虚拟机碎片化整理 我们第一步要做的是碎片整理&…

VScode找python环境 (conda)

CtrlshiftP 会弹出如下框&#xff1a; 框里输入&#xff1a; Python:Select Interpreter 会得到&#xff1a;

24/8/15算法笔记 dp策略迭代 价值迭代

策略迭代&#xff1a; 策略迭代从某个策略开始&#xff0c;计算该策略下的状态价值函数。它交替进行两个步骤&#xff1a;策略评估&#xff08;Policy Evaluation&#xff09;和策略改进&#xff08;Policy Improvement&#xff09;。在策略评估阶段&#xff0c;计算给定策略下…

模电实验3 - 单电源集成运放交流耦合放大器

实验目标 学习集成运放的单电源使用。掌握交流耦合单电源集成运放放大器的测试方法。了解交流耦合单电源集成运放放大器的特点。 实验器材 ADALM2000 1kΩ 电阻 (1/4 W) x 1 10 kΩ 电阻 (1/4 W) x 1 100kΩ 电阻 (1/4 W) x 3 0.1μF电容 x 1 1μF电容 …

【深度学习】单层神经网络

单层神经网络 神经元感知机 1943年&#xff0c;心理学家McCulloch和数学家Pitts共同发表了神经网络的开山之作A Logical Calculus of the Ideas Immanent in Nervours Activity1&#xff0c;提出了神经网络的第一个数学模型——MP模型。该模型也成为了人工神经网络的基础。 神经…

7 数据存储单位,整型、浮点型、字符型、布尔型数据类型,sizeof 运算符

目录 1 数据类型的分类 2 数据存储单位 2.1 位 2.2 字节 2.3 其余单位 3 整数类型 3.1 基本介绍 3.2 整型的类型 3.2.1 整数类型多样性的原因 3.2.2 整型类型之间的相对大小关系 3.3 整型注意事项 3.4 字面量后缀 3.5 格式占位符 3.6 案例&#xff1a;声明并输出…