【toolschain algorithm cpp ros】cpp工厂模式实现--后续填充具体规划算法,控制器版的已填充了算法接入了仿真器

news2025/2/3 12:47:47

写在前面

现在局势危机,于是想复习一下之前写的设计模式,之前提到,做过一个闭环仿真器(借用ros),见https://blog.csdn.net/weixin_46479223/article/details/134864123我的控制器的建立遵循了工厂模式(多态、工厂、客户订阅)。 目前按照之前的设计,把规划器也改写成类似的模式。未来接入我的闭环仿真器械中。

本篇文章只设计框架的搭建,具体算法lattice搭建完毕填充以及其他算法为看时间缓慢的更新吧。

有错误和问题 还请大大们指点阿

基本结构

在这里插入图片描述
最外面是我的ros节点(目前刚建立没有接入ros以及控制器 用while先测试了

然后包一个planner的调度器(scheduler:planner.cpp)
传建一个基类然后动态多态的方式实现不同规划器的注册,把根据类型注册的规划器放入到一个哈希map,实现增删。(这里临时固定)。控制器和规划器的这个架构原来的设想是根据不同的场景可以有一个判断器自动实现合适的控制器和规划器的切换(也就是自动驾驶行泊一体啦)

对外接口是run和init和update,基本每行代码都有注释。

参数使用yaml管理

跑起来的样子

之前跑起来的并且接入了我的闭环无敌可进化仿真器的视频。我的git也放了一版。
这里不能贴视频。
仿真器想表现车辆追随一段轨迹,前面是轨迹(预瞄)。后面是我的车实不断更新的位置。(实现了闭环)
在这里插入图片描述
0 1 2 3 4 是假设的控制类型,这里先跑0.

部分重要代码

代码在git上

origin git@github.com:HerrQQ/MPotherSet.git (fetch)
origin git@github.com:HerrQQ/MPotherSet.git (push)
第一版如此
未来不断调整

工厂类

#ifndef _PlannerFactory_H_
#define _PlannerFactory_H_

#include "planner_A.h"
#include "planner_B.h"
#include "planner_C.h"
#include "planner_D.h"

/**
 * @brief PlannerFactory
 * @author kaifeng
 * @date 
*/
#include <memory>
namespace planner { 
class PlannerFactory//factory 
{
public :

    PlannerFactory()=default;
    ~PlannerFactory()=default;
    /**
    * @brief creat planner
    * @param needed planner type
    */
    std::shared_ptr<PlannerBase> fCreateplanner (const PlannerType& type)
    {
        if (type == B) {
            return std::make_shared<planner_B>();
        }
        else if (type == A) {
            return std::make_shared<planner_A>();
        }
        else if (type == C) {
            return std::make_shared<planner_C>();
        }
        else if (type == D) {
            return std::make_shared<planner_D>();
        }
        else {
            return nullptr;
        }
    }

};
}

// class PlannerFactory_D :public PlannerFactory //factory son
// {
// public :

//     PlannerFactory_D()=default;
//     virtual ~PlannerFactory_D() override
//     {
//         LOG(INFO)<<"D plannerBase created"<<std::endl;
//     }
//     virtual planner::plannerBase* fCreateplanner ()override
//     {
//         return new planner::planner_D();
//     }
// };

// class PlannerFactory_A :public PlannerFactory //factory son
// {
// public :

//     PlannerFactory_A()=default;
//     virtual ~PlannerFactory_A() override
//     {
//         LOG(INFO)<<"A plannerBase created"<<std::endl;
//     }
//     virtual planner::plannerBase* fCreateplanner ()override
//     {
//         return new planner::planner_A();
//     }
// };

// class PlannerFactory_B :public PlannerFactory //factory son
// {
// public :

//     PlannerFactory_B()=default;
//     virtual ~PlannerFactory_B() override
//     {
//         LOG(INFO)<<"B plannerBase created"<<std::endl;
//     }
//     virtual planner::plannerBase* fCreateplanner ()override
//     {
//         return new planner::planner_B();
//     }
// };

// class PlannerFactory_B :public PlannerFactory //factory son
// {
// public :

//     PlannerFactory_B()=default;
//     virtual ~PlannerFactory_B() override
//     {
//         LOG(INFO)<<"B plannerBase created"<<std::endl;
//     }
//     virtual planner::plannerBase* fCreateplanner ()override
//     {
//         return new planner::planner_B();
//     }
// };

#endif

基类

#ifndef _PLANNER_H_
#define _PLANNER_H_
#include "structPlanner_t.h"
#include <Eigen/Dense>
#include <vector>
#include <map>
#include <unordered_map>
#include "glog/logging.h"
#include <yaml-cpp/yaml.h>


/**
 * @brief Planner_base
 * @author kaifeng
 * @date 
*/




namespace planner { 

/**
 * @brief base class for all planners.
 */
class PlannerBase//client
{
    public:
  /**
   * @brief constructor
   */
  PlannerBase() = default;

  /**
   * @brief destructor
   */
  virtual ~PlannerBase() = default;

  /**
   * @brief initialize PlannerBase
   * @param config_path path of config file, yaml  
   * @return Status initialization status
   */
  virtual uint8_t initialize(const std::string& config_path) = 0;

  
  /**
   * @brief compute planner command
   * @param PlannerDataFlow saving relativ infos of planning
   * @param locInfo reference of LocInfo instance
   * @param VehicleState reference of VehicleState instance
   * @return reference of Command instance, which is private member
   */
  virtual void run( const Location& locInfo,
                    const VehicleState& VehicleState,
                    PlannerDataFlow& PlannerDataFlow) = 0;

  virtual void noRun(const Location& locInfo,
                    const VehicleState& VehicleState) = 0;

  /**
   * @brief stop planner
   */
  // virtual void stop();

protected:
    double cmd_; 
  //Command cmd_;
  //Debug debug_ptr_;
};

}

#endif

其中一个子class

#ifndef __A_planner_h__
#define __A_planner_h__

#include "planner_base.h"
#include "glog/logging.h"
#include <vector>
#include <map>
#include <cmath>
#include <utility>



/**
 * @brief A
 * @author kaifeng
 * @date 
*/
namespace planner
{
    class planner_A:public PlannerBase{ // product son
        public:
        planner_A()
        {
            LOG(INFO)<<"A in progress"<<std::endl;
        }
        ~planner_A()
        {
            LOG(INFO)<<"A stop"<<std::endl;
        }
       
        uint8_t initialize(const std::string& config_path)override;

        void run( const Location& locInfo,
                            const VehicleState& VehicleState,
                            PlannerDataFlow& PlannerDataFlow) override;

        void noRun(const Location& locInfo,
                            const VehicleState& VehicleState) override;
    
        private:
        /**
         * @brief read configuration
        */
        void readConfig(const std::string& path);

        private:
        // cost parameters
        struct CostParameter {
            float Xxxx{0.f};
            float xXxx{0.f};
            float xxXx{0.f};
            float xxxX{0.f};
        };
        CostParameter* p_parameter_;
        // 

    
    
    
    };

}
#endif

调度

在这里插入图片描述

commen 内实现了几个filter 封装成了类

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

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

相关文章

AI绘画中VAE压缩图像

介绍 在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。 这个低维空间的“分辨率”低于原始图像空间,有利于快速地完成加噪和去噪过程。 最后再将编码空间中的噪声表示解码恢复为图像空间,完成去噪或加噪操作。 …

只知道短视频和直播带货?抖店好像更适合我们普通人哦!项目介绍

我是王路飞。 说道带货&#xff0c;大多数人还是只知道抖音短视频和抖音直播带货。 毕竟&#xff0c;现在众多平台都在往电商方向发展&#xff0c;做电商的方式就是通过短视频和直播的形式带货。 但是&#xff0c;很明显不是所有人都能去做的&#xff0c;尤其是对我们这些普…

操作系统期末知识点总结

第一章 1、操作系统&#xff1a;OS是一个大型的系统软件、它负责计算机的全部软件和硬件资源的管理&#xff0c;并为用户提供良好的应用界面&#xff0c;使整个计算机系统实现高效率和高度自动化 2、操作系统的形成 1&#xff09;手工操作阶段 2&#xff09;批处理系统&…

houdini 常用节点

雾化 撒点 减面 点连线 trace 节点 labs skelete 图片转模型 齿轮制作 polyextrude point to point connect primuv

【前缀和】【单调栈】LeetCode2281:巫师的总力量和

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 作为国王的统治者&#xff0c;你有一支巫师军队听你指挥。 给你一个下标从 0 开始的整数数组 strength &…

Sui 生态排名第一的头部流动性协议 NAVI Protocol 活动进行中

作为在熊市中启动的新生公链&#xff0c;Sui 正在稳步崛起。公链的 TVL 持续攀升&#xff0c;目前已经达到了 1.76亿美元&#xff0c;闯入了公链排名前20榜单。仅过去四个月内&#xff0c;TVL 增加了10倍&#xff0c;并且增长仍在继续&#xff0c;SUI 的价格在近期也有了很亮眼…

Android Studio 安装和使用

前些天&#xff0c;打开了几年前的一个Android Studio app项目&#xff0c;使用安卓虚拟机仿真app崩溃&#xff0c;怀疑是不是中间升级过Android Studio导致异常的&#xff0c;马上脑子一热卸载了&#xff0c;结果上次踩过的坑&#xff0c;一个没少又踩一次&#xff0c;谨以此文…

Python中实现消息队列:构建高效异步通信系统的完整指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 消息队列的基础概念 在开始之前&#xff0c;先了解一些消息队列的基础概念。 1 什么是消息队列&#xff1f; 消息队列是一种通信方式&#xff0c;它允许将消息从一个应用程序传递到另一个应用程序。消息队列提…

[笔记]netty随笔

记录使用过程中偶然发现的一些关键逻辑。先做记录&#xff0c;以后netty知识有一定体系再做整理 childGroup 服务器中有俩group&#xff0c;一个是parentGroup&#xff0c;负责处理链接请求&#xff0c;一个是childGroup&#xff0c;负责业务逻辑。 channelActive是在childG…

Chrome浏览器http自动跳https问题

现象&#xff1a; Chrome浏览器访问http页面时有时会自动跳转https&#xff0c;导致一些问题。比如&#xff1a; 开发阶段访问dev环境网址跳https&#xff0c;后端还是http&#xff0c;导致接口跨域。 复现&#xff1a; 先访问http网址&#xff0c;再改成https访问&#xf…

Ubuntu 常用命令之 exit 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 exit命令在Ubuntu系统下用于结束一个终端会话。它可以用于退出当前的shell&#xff0c;结束当前的脚本执行&#xff0c;或者结束一个ssh会话。 exit命令的参数是一个可选的整数&#xff0c;用于指定退出状态。如果没有指定&#…

论文阅读——llava

Visual Instruction Tuning LLaVA 指令智能体分为两类&#xff1a;端到端的&#xff0c;通过LangChain[1]/LLM[35]协调各种模型的系统。 数据集生成用GPT辅助生成的&#xff0c;具体不写了。 模型结构&#xff1a; input image Xv LLM&#xff1a;Vicuna visual encoder&a…

docker学习(十一、Redis集群存储数据方式)

文章目录 一、集群数据存储1.单机连接集群问题2.集群方式连接redis存储数据 二、 查看集群信息 docker搭建Redis集群相关知识&#xff1a; docker学习&#xff08;九、分布式存储亿级数据知识&#xff09; docker学习&#xff08;十、搭建redis集群&#xff0c;三主三从&#x…

java easyexcel上传和下载数据

安装依赖 easyexcel官方文档 <!--通过注解的方式导出excel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency>注意踩坑&#xff1a;easyexcel会…

vm 如何桥接模式

1、配置桥接模式 2、进入虚拟机配置 网卡 ip 根据自己的实际情况。 如果桥接的有限以太网外部连接了 路由器&#xff0c;可以直接选择 DHCP 自动分配。 如果 路由器没有帮你分配 ip 地址&#xff0c;建议设置 路由器&#xff0c; 或者直接手动配置 ip地址。 如果没有就自己手…

Go语言与HTTP/2协议的实践探索

随着互联网技术的发展&#xff0c;HTTP/2协议逐渐成为主流。Go语言作为一种高效、简洁的编程语言&#xff0c;与HTTP/2协议的结合具有很大的潜力。本文将探讨Go语言与HTTP/2协议的实践探索。 一、HTTP/2协议的优势 HTTP/2协议相比HTTP/1.1协议&#xff0c;具有以下优势&#…

Modbus-TCP数据帧

Modbus-TCP基于4种报文类型 MODBUS 请求是客户机在网络上发送用来启动事务处理的报文MODBUS 指示是服务端接收的请求报文MODBUS 响应是服务器发送的响应信息MODBUS 证实是在客户端接收的响应信息 Modbus-TCP报文: 报文头MBAP MBAP为报文头&#xff0c;长度为7字节&#xff0c…

DshanMCU-R128s2 ADC 按键配置方法

FreeRTOS平台上使用的按键为ADC-KEY&#xff0c;采用的ADC模块为GPADC。 按键功能驱动的实现是通过ADC分压&#xff0c;使每个按键检测的电压值不同&#xff0c;从而实现区分不同的按键。按下或者弹起中断之后&#xff0c;通过中断触发&#xff0c;主动检测当前电压识别出对应…

金蝶云星空执行部署包后业务对象会被标记上部署包的开发码

文章目录 金蝶云星空执行部署包后业务对象会被标记上部署包的开发码 金蝶云星空执行部署包后业务对象会被标记上部署包的开发码 会被标记成开发码的业务对象包括以下&#xff1a; 新增的业务对象&#xff0c;扩展的业务对象 --查询二开的元数据打包 FPACKAGEID不为空&#xff…

阻塞 IO(BIO)

文章目录 阻塞 IO(BIO)模型等待队列头init_waitqueue_headDECLARE_WAIT_QUEUE_HEAD 等待队列项使用方法驱动程序应用程序模块使用参考 阻塞 IO(BIO) 模型 等待队列是内核实现阻塞和唤醒的内核机制。 等待队列以循环链表为基础结构&#xff0c;链表头和链表项分别为等待队列头和…