autoware中ROS2学习笔记

news2024/11/14 16:46:42

文章目录

  • 一、学习资料:
      • 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(TARGETS
  talker_component
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME 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 files
  set(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 files
  set(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 ComposableNode
 
 
def 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 files
  set(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 files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()
 
#只需要加这个指令即可
install(
  DIRECTORY launch
  DESTINATION share/${PROJECT_NAME}
)
 
ament_package()
 

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

ros2 launch component_launch talker_listener.launch.py

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

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

相关文章

Android 12系统源码_屏幕设备(一)DisplayManagerService的启动

前言 DisplayManagerService是Android Framework中管理显示屏幕相关的模块&#xff0c;各种Display的连接、配置等&#xff0c;都是通过DMS和来管理控制。 在DMS模块中&#xff0c;对显示屏幕的描述分为物理显示屏(physical display)和逻辑显示屏(logical display)&#xff0c…

您知道有哪些主流的大模型LLM开源项目吗?

随着人工智能技术的飞速发展&#xff0c;大模型LLM&#xff08;Large Language Models&#xff09;已成为自然语言处理领域的一股不可阻挡的潮流。从早期的探索到今天的广泛应用&#xff0c;LLM在理解、生成和处理人类语言方面取得了令人瞩目的成就。本文旨在提供一个全面的视角…

【网络安全】密码重置中毒漏洞解析

未经许可 不得转载。 文章目录 概述重置密码的正常流程如何构造密码重置投毒攻击悬垂标记攻击概述 密码重置投毒是一种技术,攻击者利用该技术操纵易受攻击的网站,使其生成指向其控制域的密码重置链接。此行为可被用来窃取重置任意用户密码所需的秘密令牌,并最终盗取其帐户。…

最新级联文生图技术,StableCascade模型部署

Stable Cascade是 Stability AI 开发的一款先进的文生图&#xff08;Text-to-Image&#xff09;生成模型。 Stable Cascade由三个模型组成&#xff1a;Stage A、Stage B 和 Stage C&#xff0c;它们分别处理图像生成的不同阶段&#xff0c;形成了一个“级联”&#xff08;Casc…

TCP/UDP实现网络通信

TCP实现网络通信 1.服务端 #include<myhead.h>//1服务端定义:端口号\id号 #define SER_PIPR 6666 #define SER_IP "196.168.111.186" //通过ifconfig查看ip int main(int argc, const char *argv[]) {//1创建套接字int sfd socket(AF_INET,SOCK_STREAM,0);…

AI绘画大模型-StableDiffusion最强模型sd3(本地安装方法)

​ 前言/introduction Stable Diffusion 3&#xff08;简称SD3&#xff09;是Stability AI最新推出的文本到图像生成模型。相比前代模型&#xff0c;SD3在生成质量、细节表现以及运行效率上有了显著提升&#xff0c;尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型…

旅游展示系统2024(代码+论文+ppt)

旅游展示系统2024(代码论文ppt),编号:sp013 代码经过修正,确保可以运行,下载地址在文末 技术栈: springbottvuemysql 展示: 下载地址: https://download.csdn.net/download/hhtt19820919/89642334 备注: 专业承接各种程序java,c,c,python,cuda,AI 运行有问题请私信我,私…

深兰科技创始人陈海波入选“2024先锋科创家?硬科技商业先锋榜”

8月14日&#xff0c;2024先锋科创家系列榜单揭晓&#xff0c;深兰科技创始人、董事长陈海波先生凭借创新精神和商业洞察力成功入选&#xff0c;荣登“2024先锋科创家•硬科技商业先锋榜”。 该榜单评选由财联社《科创板日报》联合上海科学技术情报研究所(ISTIS)共同发起&#x…

ImagePicker插件的用法

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择视频文件"相关的内容&#xff0c;本章回中将介绍如何混合选择图片和视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

网页版IntelliJ IDEA部署

在服务器部署网页 IntelliJ IDEA 引言 大家好&#xff0c;我是小阳&#xff0c;今天要为大家带来一个黑科技——如何在云端部署和使用WEB版的IntelliJ IDEA&#xff0c;让你在任何地方都可以随心所欲地进行Java开发。这个方法特别适合那些用着老旧Windows电脑&#xff0c;部署…

基于springboot的医药管理系统

TOC springboot194基于springboot的医药管理系统 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大&#xff0c;人为计算方面才是一个巨大的短板&#xff0c;所以发明了各种计算设备&#xff0c;从结绳记事&#xff0c;到算筹&#xff0c;以及算盘&#xff0c;到如今的…

系统架构设计师 - 软件工程(1)

软件工程 软件工程&#xff08;13-22分&#xff09;非常重要软件开发方法原型法【需求阶段】结构化法面向对象方法面向服务的方法其他软件开发方法 软件开发模型瀑布模型 SDLC增量与迭代螺旋模型V 模型 和喷泉模型构件组装模型 CBSD统一过程 UP敏捷方法 逆向工程需求工程需求定…

无障碍服务屏蔽_关闭无障碍服务快捷方式

问题描述&#xff1a; 1&#xff09;部分app 存在无障碍服务功能&#xff0c;需要关闭 2&#xff09;对于客户自研App&#xff0c;自己具备系统签名自己直接开启了无障碍服务并且打开了无障碍服务快捷方式&#xff0c;如何关闭无障碍服务快捷开关 文章目录 问题现象问题描述 屏…

直流电机(二)

直流电机重要参数 直流电机作为一个电磁装置&#xff0c;对于用户来说要哪些参数是他们关注的呢。• 额定功率PN&#xff1a;电机在铭牌规定的额定状态下运行时电机的输出功率(W/kW)• 额定电压UN&#xff1a;电机出线端额定电压(V )• 额定电流IN&#xff1a;电机出线额定电流…

python unittest高级特性!

1. 测试套件 (Test Suites) 测试套件允许你组合多个测试用例&#xff0c;并且能够以不同的方式组织和运行这些测试。这是对测试进行分组和控制测试执行顺序的有效手段。 import unittestclass TestStringMethods(unittest.TestCase): def test_upper(self): self.a…

C语言生成常见波形数据

最近无聊&#xff0c;研究上C语言的一些程序&#xff0c;感觉波形生成还是挺有用的 这里主要生成了正弦&#xff0c;方波&#xff0c;三角波 &#xff0c;锯齿波&#xff0c;指数波形等 首先看看效果&#xff0c; 这里把生成的数据用python画了出来&#xff0c;程序在最后 …

适合母亲节的SVG模版

宝藏模版 往期推荐&#xff08;点击阅读&#xff09;&#xff1a; 趣味效果&#xff5c;高大上&#xff5c;可爱风&#xff5c;年终总结&#xff08;一&#xff09;&#xff5c;年终总结&#xff08;二&#xff09;&#xff5c;循环特效&#xff5c;情人节&#xff08;一&…

[Datawhale AI 夏令营]多模态大模型数据合成赛事-Task2

简单按照datawhale给的task2的文档学习了一下,主要还是学习了Data-Juicer相关的知识。 1.Data-juicer 初探 简单理解一下&#xff0c;Data juicer就是提供给你许多数据处理方法&#xff0c;包括Formatter、Mapper、Filter、Deduplicator和Selector&#xff0c;涉及图像、文本、…

73、 dockerfile

一、dockerfile 自定义镜像---------通过docker创建镜像。 1.1、创建镜像的方式&#xff1a; 1、dockerfile最基的方式&#xff0c;最常用的方式。 2、docker pull 拉取的是最基础的镜像&#xff0c;只有基础功能&#xff0c;没有定制化的功能。 3、基于基础镜像&#xff…

每天五分钟计算机视觉:人脸识别如何解决一次学习的问题?

本文重点 人脸识别技术作为当前计算机技术的重要分支,广泛应用于公共安全、智能家居、金融商业等多个领域。然而,尽管该技术取得了显著进展,但在实际应用中仍面临诸多挑战,其中一次学习问题(One-Shot Learning Problem)尤为突出。 一次学习问题的定义 我们人类是具有快…