【智路】智路OS 服务组件开发

news2025/1/9 3:25:08

https://airos-edge.readthedocs.io/zh/latest/dev_guide/service_dev.html

1 总览

1.1 功能

感知服务包含感知的整体pipeline,主要模块包括单相机感知和融合。

单相机感知模块

主要功能为接收IP相机RTSP视频流,解码成RGB图片,通过算法识别出视频中的障碍物,并转换到世界坐标系。智路OS提供了基础的单相机感知组件,包括2D检测、2D跟踪、RoI过滤、回3D。

  • 检测:
    利用深度学习算法,识别出物体类别/2D框/长宽高/朝向角/底面中心点图像坐标等信息。
  • RoI过滤:
    主要功能是过滤掉感兴趣区域外的物体.
  • 2D跟踪:
    主要任务是给定一个图像序列,找到图像序列中运动的物体,识别不同帧的同一个运动物体,给定一个确定准确的ID
  • 回3D:
    根据模型预测的图像坐标系下的底面中心点的图像坐标(u,v),利用地面方程和相机内参计算得到相机坐标系下的底面中心点的3D坐标(X, Y, Z),利用模型预测得到的物体高度h,计算得到物体中心点在相机坐标系下的3D坐标。

多传感器融合模块

主要功能是接收多个传感器(相机或雷达)识别处理的结构化数据,对目标进行融合,从而提供更全面、准确的环境感知。智路OS提供了基础的多传感器融合组件实现。

  • 融合关联部分基于概率分布模型来建立关联矩阵,对于关联融合所需的所有维度的信息(障碍物位置、类别、尺寸、车道信息、轨迹等),通过其概率分布来得到融合概率分布
  • 3D跟踪,一般采用时间和空间相结合的卡尔曼滤波,对同一物体,不同传感器不同时刻的观测值进行滤波跟踪,进一步提升融合精度,开发者可自行实现。

1.2 设计理念

智路OS中,感知服务相关的组件可以由开发者自定实现并升级替换,框架提供了模块相关的抽象类、接口、注册方式,开发者需要根据定义标准实现功能开发并接入智路OS。

单相机检测模块

对于单相机检测模块,智路OS框架提供的输入是从camera视频解码的实时RGB图像数据,模块的输出为智路OS定义的感知障碍物结构化数据,单相机检测模块内部的算法和pipeline可以由开发者自定义。

多传感器融合模块

对于多传感器融合模块,智路OS框架提供的输入是多个传感器检测的感知障碍物结构化数据,模块的输出为智路OS定义的感知障碍物融合结构化数据,内部的相关的算法可以由开发者自定义。

2 类说明

2.1 Camera Perception

BaseCameraPerception

单相机感知的基类,开发者需要继承该类并实现对应的接口,由智路OS框架加载模块后调用。

Init

bool Init(const CameraPerceptionParam &param)

初始化接口,在单相机感知模块初始化时调用,框架在相机配置文件中读取框架配置后,传给开发者的算法使用。

namevaluedescribe
参数param框架传入的配置文件结构,定义如下
返回值bool初始化正常时返回true,初始化失败时返回false
struct CameraPerceptionParam {
  std::string camera_name;    // 相机名称
  std::string sdk_path;       // 算法SDK路径
  std::string conf_path;      // 参数路径
  unsigned int gpu_id = 0;
};

Perception

bool Perception(const base::device::CameraImageData &camera_data, PerceptionObstacles *result,TrafficLightDetection *traffic_light)

单相机感知主逻辑接口,输入为图像数据,输出为感知处理后的结构化数据,包含障碍物信息和视觉检测的信号灯信息,如果不提供信号灯检测能力,可以置为空。

Name

std::string Name()

获取模块的名称

组件输入
struct CameraImageData {
  std::shared_ptr<airos::base::Image8U> image;  ///< 图片指针
  uint32_t device_id;                           ///< 设备ID
  std::string camera_name;                      ///< 相机名称
  std::string camera_manufactor;                ///< 相机厂商
  CameraLensType lens_type;                     ///< 镜头类型
  airos::base::Color mode;                      ///< 图像模式
  uint32_t height;                              ///< 高度
  uint32_t width;                               ///< 宽度
  uint64_t timestamp;                           ///< 时间戳
  uint32_t sequence_num;                        ///< 序列号
};

智路OS规定的传入感知组件的数据格式,开发者实现Perception接口时,根据传入的图像指针和其他信息进行2D目标检测、跟踪等处理最终输出感知数据。

组件输出

相机感知组件输出的结构化数据

PerceptionObstacles

// airos_perception_obstacle.proto
message PerceptionObstacles {
    repeated PerceptionObstacle perception_obstacle = 1;  // An array of obstacles
    optional airos.header.Header header = 2;         // Header
    optional PerceptionErrorCode error_code = 3 [default = ERROR_NONE]; //Error code
    repeated PerceptionObstacle unobserved_obstacle = 4;
}

TrafficLightDetection

// airos_visual_traffic_light.proto
message TrafficLightDetection {
    repeated TrafficLightByDirection traffic_light_by_direction = 1;
    repeated TrafficLightByDirection traffic_light_by_projection = 2;
    repeated TrafficLightByDirection traffic_light_by_detection = 3;
}

2.2 Lidar Perception

BaseLidarPerception

Lidar感知的基类,开发者需要继承该类并实现对应的接口,由智路OS框架加载模块后调用。

Init

bool Init(const LidarPerceptionParam &param)

初始化接口,在Lidar感知模块初始化时调用,框架在Lidar配置文件中读取框架配置后,传给开发者的算法使用。

namevaluedescribe
参数param框架传入的配置文件结构,定义如下
返回值bool初始化正常时返回true,初始化失败时返回false
struct LidarPerceptionParam {
  std::string lidar_name;    // Lidar名称
  std::string alg_path;      // 算法SDK路径
  std::string conf_path;     // 参数路径
};

Perception

bool Perception(const LidarPonitCloud &lidar_data, PerceptionObstacles *result)

Lidar感知主逻辑接口,输入为点云数据,输出为感知处理后的结构化障碍物信息

Name

std::string Name()

获取模块的名称

组件输入

PointCloud

// lidar_data.proto
message PointCloud {
  optional LidarHeader header = 1;
  optional string frame_id = 2;
  optional bool is_dense = 3;
  repeated PointXYZIT point = 4;
  optional double measurement_time = 5;
  optional uint32 width = 6;
  optional uint32 height = 7;
  repeated FusionInfo fusion_info = 8;
}

智路OS规定的传入Lidar感知的数据格式,开发者实现Perception接口时,根据传入的点云进行目标检测、跟踪等处理最终输出感知数据。

组件输出

Lidar感知组件输出的结构化数据

PerceptionObstacles

// airos_perception_obstacle.proto
message PerceptionObstacles {
    repeated PerceptionObstacle perception_obstacle = 1;  // An array of obstacles
    optional airos.header.Header header = 2;         // Header
    optional PerceptionErrorCode error_code = 3 [default = ERROR_NONE]; //Error code
    repeated PerceptionObstacle unobserved_obstacle = 4;
}

2.3 Fusion

BasePerceptionFusion

感知融合基类,开发者需要继承该类并实现对应的接口,由智路OS框架加载模块后调用。
Init

bool Init(const PerceptionFusionParam &param)

初始化接口,在融合模块初始化时调用,框架在相机配置文件中读取自定义配置后,传给开发者的算法使用。

namevaluedescribe
参数param框架传入的配置文件结构,定义如下
返回值bool初始化正常时返回true,初始化失败时返回false
message PerceptionFusionParam {
    repeated SingleInput input = 1;
    required string perception_channel = 2 [default = "/airos/perception_obstacles"];
    optional double output_frequency = 3 [default = 15.0];
    optional int32 viz_mode = 4 [default = 0];
    optional string node_name = 5 [default = "v2x_msf_roadside"];
    optional string alg_name = 6;
    optional string alg_path = 7;
    optional string conf_path = 8;
}

Process

bool Process( const std::vector<std::shared_ptr<const PerceptionObstacles>> &input, PerceptionObstacles *result)

融合主逻辑接口,输入为多个传感器感知处理后的结构化数据,输出为融合后的结构化数据。

Name

std::string Name()

获取模块的名称

组件输入

感知融合组件输入的结构化数据,由相机感知或者Lidar感知输出

PerceptionObstacles

// airos_perception_obstacle.proto
message PerceptionObstacles {
    repeated PerceptionObstacle perception_obstacle = 1;  // An array of obstacles
    optional airos.header.Header header = 2;         // Header
    optional PerceptionErrorCode error_code = 3 [default = ERROR_NONE]; //Error code
    repeated PerceptionObstacle unobserved_obstacle = 4;
}
组件输出

感知融合组件输出的结构化数据与输入结构相同,为PerceptionObstacles结构数据

3 开发流程

3.1 代码及配置修改

创建包

airospkg create -name new_lidar_perception -type lidar_perception

修改源文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在源文件中修改接口注册信息

REGISTER_LIDAR_PERCEPTION(NewPerceptionLidar);

进行编码,Init和Perception须为非阻塞实现
参考组件开发基础修改对应编译脚本。同时需要修改配置供框架加载,例如编译的动态库名为libnew_perception_lidar.so,对应的conf/dynamic_module.cfg需要修改为

lib_name : "libnew_perception_lidar.so"
module_type : "BaseLidarPerception"
module_name : "NewPerceptionLidar"

注意:需要将智路OS-SDK和第三方库之外的依赖库放置到包目录下的lib文件夹中,避免发布或者安装包后,运行出现找不到依赖库的情况。

3.2 编译及运行

airospkg make -name new_lidar_perception -type cmake  #编译
airospkg release -name new_lidar_perception -out new_lidar_perception.tar.gz  # 发布
airospkg install -file /home/airos/projs/new_lidar_perception/new_lidar_perception.tar.gz  # 安装
airospkg run -name new_lidar_perception -type lidar_perception  # 运行

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

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

相关文章

【黑马点评】已解决java.lang.NullPointerException异常

Redis学习Day3——黑马点评项目工程开发-CSDN博客 问题发现及描述 在黑马点评项目中&#xff0c;进行到使用Redis提供的Stream消息队列优化异步秒杀问题时&#xff0c;我在进行jmeter测试时遇到了重大的错误 发现无论怎么测试&#xff0c;一定会进入到catch中&#xff0c;又由…

DRS部署(DM8-DM8)

DRS部署 一、规划端口二、设置环境变量三、开启源数据库的归档和逻辑日志四、配置DDL同步五、创建用户六、 DRS服务部署&#xff08;DM8目的端&#xff09;6.1 部署 drs 服务6.2启动drs服务 七、 DRS 服务部署&#xff08;DM8 源端&#xff09;7.1 部署 DRS服务7.2 启动dmhs服务…

C++第七节课 运算符重载

一、运算符重载 并不是所有情况下都需要运算符重载&#xff0c;要看这个运算符对这个类是否有意义&#xff01; 例如&#xff1a;日期减日期可以求得两个日期之间的天数&#xff1b;但是日期 日期没有意义&#xff01; #include<iostream> using namespace std; clas…

SpringBoot启动成功,但端口启动失败

目录 一、问题展示 二、问题分析 2.1.端口与Tomcat的关系 2.2.问题分析 三、SpringBoot常见知识记录 3.1.SpringBoot项目常用jar包 3.1.1.必要性jar包 3.1.2.选择性jar包 3.2.标签的作用及取值 3.2.1.compile&#xff08;编译范围&#xff09; 3.2.2.provided…

爵士编曲:爵士鼓编写 爵士鼓笔记 底鼓和军鼓 闭镲和开镲 嗵鼓

底鼓和军鼓 底鼓通常是动的音色&#xff0c;军鼓通常是大的音色。 “动”和“大”构成基础节奏。“动大”听着不够有连接性&#xff0c;所以可以加入镲片&#xff01; 开镲 直接鼓棒敲击是开镲音色 闭镲 当脚踩下踏板&#xff0c;2个镲片合并&#xff0c;然后用鼓棒敲击&am…

Koa安装和应用

文章目录 1、Koa21.1 简介1.2 安装1.3 简单使用1.4 使用脚手架创建Koa项目 1、Koa2 1.1 简介 Koa 是一个新的 web 框架&#xff0c;由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async…

rust快速创建Tauri App ——基于create-tauri-app

Tauri App Tauri是一个工具包&#xff0c;可以帮助开发人员使用现有的几乎任何前端框架为主要桌面平台制作应用程序。核心是用Rust构建的&#xff0c;CLI利用Node.js使Tauri成为创建和维护优秀应用程序的真正多语言方法。 cargo install create-tauri-appcreate-tauri-app&am…

多版本node管理工具nvm

什么是nvm&#xff1f; 在项目开发过程中&#xff0c;使用到vue框架技术&#xff0c;需要安装node下载项目依赖&#xff0c;但经常会遇到node版本不匹配而导致无法正常下载&#xff0c;重新安装node却又很麻烦。为解决以上问题&#xff0c;nvm&#xff1a;一款node的版本管理工…

FSFP——专为蛋白质工程设计的少样本学习策略

论文地址&#xff1a;通过小样本学习&#xff0c;以最少的湿实验室数据提高蛋白质语言模型的效率 参考文献&#xff1a;AI蛋白质设计“新引擎”:FSFP驱动大模型超低采样学习,少量数据显著提升蛋白质语言模型的性能 前言介绍&#xff1a;上海交通大学自然科学研究院洪亮教授课…

在STM32工程中使用Mavlink与飞控通信

本文讲述如何在STM32工程中使用Mavlink协议与飞控通信&#xff0c;特别适合自制飞控外设模块的项目。 需求来源&#xff1a; 1、增稳云台里的STM32单片机需要通过串口接收飞控传来的云台俯仰、横滚控制指令和相机拍照控制指令&#xff1b; 2、自制的有害气体采集器需要接收飞…

PCL 曲线点云提取

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 提取曲线点云的方法主要分为两种:参数化与非参数化,其中参数化是指事先直线曲线的形状,反之,非参数化则是不依赖与曲线的参数,通常是一种聚类的行为。这里我们采用非参数方法(TriplClust),将点集划分为一个未…

Java ETL - Apache Beam 简介

基本介绍 Apache Beam是一个用于大数据处理的开源统一编程模型。它允许用户编写一次代码&#xff0c;然后在多个批处理和流处理引擎上运行&#xff0c;如Apache Flink、Apache Spark和Google Cloud Dataflow等。Apache Beam提供了一种简单且高效的方式来实现数据处理管道&…

上海儿童自闭症寄宿制学校,让孩子找到归属感

在探讨自闭症儿童教育的广阔图景中&#xff0c;上海作为一座充满人文关怀的城市&#xff0c;始终致力于为这些特殊的孩子提供更加全面、专业的支持体系。而当我们把这份关注与努力投射到具体实践上&#xff0c;广州的星贝育园自闭症儿童寄宿制学校便成为了这样一个温馨而有力的…

蓝桥杯DS18B20程序源码

蓝桥杯DS18B20程序源码解析 蓝桥杯&#xff0c;作为一项全国瞩目的电子设计竞赛&#xff0c;其核心挑战在于参赛者需深度融合单片机编程与各类电子元件的应用能力。在众多项目中&#xff0c;涉及DS18B20数字温度传感器的程序源码尤为引人注目&#xff0c;它巧妙地将单片机技术…

ollama安装(ubuntu20.04)

Ollama是一款开源的自然语言处理工具&#xff0c;它可以帮助开发者快速构建文本处理应用。 ollama官网: https://ollama.ai/ 一、ollama 自动安装 linux统一采用sh脚本安装&#xff0c;一个命令行搞定。 curl -fsSL https://ollama.com/install.sh | sh二、ollama 手动安装 o…

使用 OpenCV 和 Matplotlib:绘制其彩色直方图以及拓展

如何使用 OpenCV 和 Matplotlib 读取、处理并显示图像。即将为您解答&#xff1a; 绘制其彩色直方图 代码解释 读取图像并转换颜色空间&#xff1a; image cv2.imread(001.jpg) image_rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB)cv2.imread(001.jpg)&#xff1a;从文件中…

C#基于SkiaSharp实现印章管理(7)

印章中的文本主要分为两种&#xff1a;1&#xff09;从左向右水平绘制的文本&#xff1b;2&#xff09;沿指定路径绘制的文本。前者使用SKCanvas的DrawText绘制文本&#xff0c;后者则使用SKCanvas的DrawTextOnPath绘制文本。   针对上述情况&#xff0c;调整SealElement类型…

Python编码系列—Python代理模式:为对象赋予超能力的魔法

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【自学笔记】支持向量机(2)——核函数

引入 核函数的功能是将一组数据映射到更高维的特征空间&#xff0c;这样可以让在低维无法线性分类的数据能够在高维空间下被分类。   可以证明&#xff0c;如果原始数据是有限的维度&#xff0c;那么一定存在一个高维特征空间使得样本线性可分。 文章内容由《机器学习》相关内…

地平线秋招2025

【地平线秋招】 中秋卷起来&#xff01;&#xff01;&#xff01; 内推码 kbrfck 内推码 kbrfck 内推码 kbrfck 投递链接&#xff1a;https://wecruit.hotjob.cn/SU62d915040dcad43c775ec12c/mc/position/campus?acotycoCodekbrfck&recruitType1&isLimitShowPostScope…