原型模式詳解及在自動駕駛場景代碼示例(c++代碼實現)

模式定義

原型模式(Prototype Pattern)是一種創建型設計模式,通過克隆已有對象來創建新對象,避免重復執行昂貴的初始化操作。該模式特別適用于需要高效創建相似對象的場景,是自動駕駛感知系統中處理大量重復數據結構的理想選擇。


自動駕駛感知場景分析

在自動駕駛感知系統中,典型的應用場景包括:

  1. 障礙物克隆:快速復制已識別的障礙物模板
  2. 點云分割:高效生成相似的點云聚類實例
  3. 傳感器配置:復用基礎配置模板創建新傳感器實例

本文將重點實現障礙物對象的原型管理模塊。


C++實現代碼(含詳細注釋)

#include <iostream>
#include <unordered_map>
#include <memory>
#include <cmath>// ---------------------------- 抽象原型接口 ----------------------------
class ObstaclePrototype {
public:virtual ~ObstaclePrototype() = default;// 克隆接口(關鍵方法)virtual std::unique_ptr<ObstaclePrototype> clone() const = 0;// 更新狀態(示例方法)virtual void updatePosition(float delta_x, float delta_y) = 0;// 顯示信息(示例方法)virtual void display() const = 0;
};// ---------------------------- 具體原型實現 ----------------------------
// 車輛障礙物原型
class Vehicle : public ObstaclePrototype {
private:float pos_x;        // X坐標float pos_y;        // Y坐標float length;       // 車長float width;        // 車寬std::string type;   // 車輛類型public:Vehicle(float x, float y, float l, float w, std::string t): pos_x(x), pos_y(y), length(l), width(w), type(std::move(t)) {}// 實現克隆方法(關鍵實現)std::unique_ptr<ObstaclePrototype> clone() const override {std::cout << "克隆車輛對象 [" << type << "]" << std::endl;return std::make_unique<Vehicle>(*this); // 調用拷貝構造函數}void updatePosition(float delta_x, float delta_y) override {pos_x += delta_x;pos_y += delta_y;}void display() const override {std::cout << "車輛類型: " << type << " 位置(" << pos_x << ", " << pos_y<< ") 尺寸: " << length << "x" << width << std::endl;}// 特有方法:計算占據面積float calculateArea() const {return length * width;}
};// 行人原型
class Pedestrian : public ObstaclePrototype {
private:float pos_x;float pos_y;float speed;int id;public:Pedestrian(float x, float y, float s, int i): pos_x(x), pos_y(y), speed(s), id(i) {}std::unique_ptr<ObstaclePrototype> clone() const override {std::cout << "克隆行人對象 #" << id << std::endl;return std::make_unique<Pedestrian>(*this);}void updatePosition(float delta_x, float delta_y) override {pos_x += delta_x * speed;pos_y += delta_y * speed;}void display() const override {std::cout << "行人 #" << id << " 位置(" << pos_x << ", " << pos_y<< ") 速度: " << speed << "m/s" << std::endl;}// 特有方法:預測運動軌跡void predictTrajectory(float time) const {std::cout << "預測 " << time << "秒后位置: (" << pos_x + speed * time << ", "<< pos_y + speed * time << ")" << std::endl;}
};// ---------------------------- 原型管理器 ----------------------------
class PrototypeManager {
private:std::unordered_map<std::string, std::unique_ptr<ObstaclePrototype>> prototypes;public:// 注冊原型void registerPrototype(const std::string& key, std::unique_ptr<ObstaclePrototype> proto) {prototypes[key] = std::move(proto);std::cout << "已注冊原型: " << key << std::endl;}// 創建克隆std::unique_ptr<ObstaclePrototype> createClone(const std::string& key) {if (prototypes.find(key) != prototypes.end()) {return prototypes[key]->clone();}std::cerr << "錯誤: 未找到原型 " << key << std::endl;return nullptr;}// 顯示已注冊原型void listPrototypes() const {std::cout << "\n=== 已注冊原型列表 ===" << std::endl;for (const auto& pair : prototypes) {std::cout << "- " << pair.first << std::endl;}}
};// ---------------------------- 場景演示 ----------------------------
int main() {PrototypeManager manager;// 初始化并注冊原型manager.registerPrototype("sedan", std::make_unique<Vehicle>(0, 0, 4.8f, 1.8f, "轎車"));manager.registerPrototype("truck", std::make_unique<Vehicle>(0, 0, 8.5f, 2.5f, "卡車"));manager.registerPrototype("adult", std::make_unique<Pedestrian>(0, 0, 1.2f, 1001));// 顯示可用原型manager.listPrototypes();// 動態創建障礙物實例auto obstacle1 = manager.createClone("sedan");auto obstacle2 = manager.createClone("adult");auto obstacle3 = manager.createClone("truck");// 使用克隆對象if (obstacle1) {obstacle1->updatePosition(10.5f, 3.2f);obstacle1->display();// 類型特定操作(需要向下轉型)if (auto vehicle = dynamic_cast<Vehicle*>(obstacle1.get())) {std::cout << "車輛面積: " << vehicle->calculateArea() << "m2" << std::endl;}}if (obstacle2) {obstacle2->updatePosition(2.0f, 1.5f);obstacle2->display();if (auto ped = dynamic_cast<Pedestrian*>(obstacle2.get())) {ped->predictTrajectory(5.0f);}}return 0;
}

代碼解析

1. 原型接口設計
class ObstaclePrototype {
public:virtual std::unique_ptr<ObstaclePrototype> clone() const = 0;// ...
};
  • 核心克隆方法:強制子類實現對象復制功能
  • 多態支持:統一接口處理各種障礙物類型
2. 具體原型實現
class Vehicle : public ObstaclePrototype {std::unique_ptr<ObstaclePrototype> clone() const override {return std::make_unique<Vehicle>(*this); // 調用拷貝構造函數}// ...
};
  • 深拷貝實現:利用C++的拷貝構造函數確保對象獨立性
  • 特有方法保留:各子類可保持專屬行為特征
3. 原型管理器
class PrototypeManager {std::unordered_map<std::string, std::unique_ptr<ObstaclePrototype>> prototypes;// ...
};
  • 中央注冊表:統一管理所有可用原型
  • 動態擴展:運行時添加/移除原型

運行結果

已注冊原型: sedan
已注冊原型: truck
已注冊原型: adult=== 已注冊原型列表 ===
- sedan
- truck
- adult克隆車輛對象 [轎車]
克隆行人對象 #1001
克隆車輛對象 [卡車]
車輛類型: 轎車 位置(10.5, 3.2) 尺寸: 4.8x1.8
車輛面積: 8.64m2
行人 #1001 位置(2.4, 1.8) 速度: 1.2m/s
預測 5秒后位置: (8.4, 7.8)

模式優勢分析

在自動駕駛中的價值
  1. 性能優化

    • 避免重復初始化復雜對象(如3D點云數據)
    • 快速復制預處理后的標準障礙物模板
  2. 動態配置

    • 運行時添加新障礙物類型(如特殊車輛)
    • 支持OTA更新障礙物識別參數
  3. 狀態保存

    • 克隆歷史幀數據用于軌跡預測
    • 創建障礙物快照用于安全校驗

擴展改進建議

1. 差異克隆控制
// 擴展克隆接口
enum CloneType { FULL, LIGHTWEIGHT };
virtual std::unique_ptr<ObstaclePrototype> clone(CloneType type) const;
2. 原型版本管理
class VersionedPrototype : public ObstaclePrototype {int version = 1;void updateParameters() { /*...*/ version++; }
};
3. 原型池優化
class PrototypePool {std::vector<std::unique_ptr<ObstaclePrototype>> pool;// 實現對象復用邏輯
};

原型模式總結

核心價值

  • 通過對象克隆替代昂貴的新建操作
  • 保持新對象與原型的一致性
  • 支持動態運行時對象類型擴展

適用場景

  • 需要高效創建大量相似障礙物實例的感知系統
  • 需要保存和恢復傳感器數據快照的場景
  • 支持動態加載新障礙物類型的自動駕駛平臺

本實現展示了原型模式在自動駕駛感知系統中的典型應用,通過標準化的克隆接口和統一的原型管理,顯著提升了系統創建障礙物對象的效率和靈活性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77840.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77840.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77840.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在kali中安裝AntSword(蟻劍)

步驟一、下載壓縮包 源碼&#xff1a;https://github.com/AntSwordProject/antSword&#xff0c;下載壓縮包。 加載器&#xff1a;https://github.com/AntSwordProject/AntSword-Loader&#xff0c;根據系統選擇壓縮包&#xff08;kali選擇AntSword-Loader-v4.0.3-linux-x64&…

華為倉頡編程語言基礎概述

第一章&#xff1a;技術演進與誕生背景 1.1 萬物智聯時代的編程挑戰 在5G、物聯網、邊緣計算等技術推動下&#xff0c;全球智能設備數量呈指數級增長。據IDC預測&#xff0c;2025年全球IoT設備將突破550億臺&#xff0c;這對系統級編程語言提出新要求&#xff1a; 異構硬件兼…

【Linux篇】探索進程間通信:如何使用匿名管道構建高效的進程池

從零開始&#xff1a;通過匿名管道實現進程池的基本原理 一. 進程間通信1.1 基本概念1.2 通信目的1.3 通信種類1.3.1 同步通信1.3.2 異步通信 1.4 如何通信 二. 管道2.1 什么是管道2.2 匿名管道2.2.1 pipe()2.2.2 示例代碼&#xff1a;使用 pipe() 進行父子進程通信2.2.3 管道容…

【LeetCode】嚼爛熱題100【持續更新】

2、字母異位詞分組 方法一&#xff1a;排序哈希表 思路&#xff1a;對每個字符串排序&#xff0c;排序后的字符串作為鍵插入到哈希表中&#xff0c;值為List<String>形式存儲單詞原型&#xff0c;鍵為排序后的字符串。 Map<String, List<String>> m new Ha…

2025年最新版 Git和Github的綁定方法,以及通過Git提交文件至Github的具體流程(詳細版)

文章目錄 Git和Github的綁定方法與如何上傳至代碼倉庫一. 注冊 GitHub 賬號二.如何創建自己的代碼倉庫&#xff1a;1.登入Github賬號&#xff0c;完成登入后會進入如下界面&#xff1a;2.點擊下圖中紅色框選的按鈕中的下拉列表3.選擇New repostitory4.進入創建界面后&#xff0…

FPGA開發板這樣做?(一)-像 Arduino 一樣玩 FPGA

這也是一個系列文章&#xff0c;來源之前和粉絲們在評論區討論的國外對于FPGA的開發或者入門所做的努力。 基本一篇文章會介紹一個FPGA開發板&#xff0c;重點在于為開發板準備的開發方式&#xff08;和國內大不相同&#xff09;。 今天的主角-PulseRain M10&#xff1a;像 Ard…

【C++游戲引擎開發】第21篇:基于物理渲染(PBR)——統計學解構材質與光影

引言 宏觀現象:人眼觀察到的材質表面特性(如金屬的高光銳利、石膏的漫反射柔和),本質上是微觀結構對光線的統計平均結果。 微觀真相:任何看似平整的表面在放大后都呈現崎嶇的微觀幾何。每個微表面(Microfacet)均為完美鏡面,但大量微表面以不同朝向分布時,宏觀上會表…

深入理解linux操作系統---第11講 bshell編程

11.1 正則表達式 11.1.1 字符集 正則表達式的字符集包含三類核心要素&#xff1a; 普通字符&#xff1a;直接匹配單個字符&#xff0c;如a匹配字母a范圍字符集&#xff1a;[a-z]匹配所有小寫字母&#xff0c;[0-9A-F]匹配十六進制數字預定義字符集&#xff1a;\d等價于[0-9]…

C++中的引用:深入理解與實用示例

文章目錄 C中的引用&#xff1a;深入理解與實用示例一、引用的基本概念二、引用作為別名的應用三、引用作為函數參數四、指針與引用的區別五、常量引用六、引用與返回值七、總結 C中的引用&#xff1a;深入理解與實用示例 在C編程中&#xff0c;“引用”是一個強大而重要的概念…

C#委托介紹

委托可以將方法作為參數傳遞&#xff0c;同時委托也可以自己作為參數傳遞 委托可分為自定義委托delegate 無返回值的Action 與有返回值的Func委托 也有匿名委托與Lamada 委托支持多播是事件的基礎 用處如在分線程調用主線程的UI invoke public delegate string Say(stri…

Node.js 模塊導入的基本流程

Node.js 模塊導入的基本流程&#xff0c;主要是 CommonJS 模塊加載機制&#xff08;即使用 require()&#xff09;的內部執行步驟。下面我用清晰的結構給你梳理一下這個過程&#xff1a; ? Node.js 模塊導入的基本流程&#xff08;使用 require()&#xff09; const someModu…

n8n 中文系列教程_02. 自動化平臺深度解析:核心優勢與場景適配指南

在低代碼與AI技術深度融合的今天&#xff0c;n8n作為開源自動化平臺正成為開發者提效的新利器。本文深度剖析其四大核心技術優勢——極簡部署、服務集成、AI工作流與混合開發模式&#xff0c;并基于真實場景測試數據&#xff0c;厘清其在C端高并發、多媒體處理等場景的邊界。 一…

【C++ Qt】信號和槽(內配思維導圖 圖文并茂 通俗易懂)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是Qt中的第三章&#xff0c;也是我們理解Qt中必備的點 信號槽&#xff0c;它本質由信號和槽兩個來實現&#xff0c;其中將細致的講述如何自定義信號…

【項目】基于MCP+Tabelstore架構實現知識庫答疑系統

基于MCPTabelstore架構實現知識庫答疑系統 整體流程設計&#xff08;一&#xff09;Agent 架構&#xff08;二&#xff09;知識庫存儲&#xff08;1&#xff09;向量數據庫Tablestore&#xff08;2&#xff09;MCP Server &#xff08;三&#xff09;知識庫構建&#xff08;1&a…

免費將靜態網站部署到服務器方法(僅支持HTML,CSS,JS)

原視頻鏈接&#xff1a;把HTML免費部署到網站上&#xff0c;實現別人也能訪問的教程來啦QAQ_嗶哩嗶哩_bilibili 注意&#xff1a;僅支持HTML、CSS、JS。不支持Vue等框架。 1.打開網站www.wordpress.org 點擊紅框按鈕 點擊紅框按鈕下載wordpress模板文件并解壓。 將自己編寫的…

游戲引擎學習第235天:在 Windows 上初始化 OpenGL

奇怪有問題 之前沒注意到 這個問題是Count 0 GlobalConstants_Renderer_UsedDebugCamer 打開的話會有Bug Count是零的話就不讓排序了 game.h: 查閱 TODO 列表 大家好&#xff0c;歡迎來到 game Hero&#xff0c;這是一檔我們在直播中一起編寫完整游戲的節目。不幸的是&a…

使用eCharts繪制中國地圖

eCharts官網&#xff1a;https://echarts.apache.org/zh/index.html 1. 首先新建一個html頁面&#xff0c;并引入echarts <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-…

Linux與Anaconda環境部署與管理(運維交接)

文章目錄 一、前言二、Linux基礎命令三、進程管理與監控四、后臺任務與服務管理五、Anaconda環境管理六、JAR包的運行與管理七、網絡與端口映射八、安全與權限管理九、故障排查與日志分析十、附錄 一、前言 本文將詳細介紹Linux系統下的常用命令以及Anaconda環境管理&#xff…

php:實現壓縮文件上傳、解壓、文件更名、刪除上傳臨時文件、存入數據庫等操作

一、效果圖 1.上傳文件 2.壓縮包文件 3.itemno1文件 二層結構 或 三層結構 4.上傳到系統路徑\ItemNo 5.更名后的itemno1文件(命名:當天日期+六位隨機數) 二、普通實現 1、內容介紹 含有兩種結構 二層結構:zip->料號文件夾->料號文件三層結構:zip->總文件夾-&g…

基于大語言模型的減肥健身計劃系統設計與實現

基于大語言模型的減肥健身計劃系統設計與實現 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】功能演示與部署指南 【技術棧】 ①&#xff1a;系統環境&#xff1a;Python 3.x Django 4.2 ②&#xff1a;開發環境&#xff1a;Web服務…