【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程

文章目录

  • 0. 前言
  • 1. 部分观测的马尔可夫决策过程
    • 1.1 POMDP的思想以及与MDP的联系
      • 1.1.1 MDP的过程回顾
      • 1.1.2 POMDP定义
      • 1.1.3 与MDP的联系及区别
        • POMDP 视角
        • MDP 视角
        • 决策次数对最优解的影响
    • 1.2 POMDP的3种常规解法
      • 1.2.1 连续状态的“Belief MDP”方法
        • 1. 信念状态的定义
        • 2. Belief MDP 的过程
        • 3. 问题的求解
        • 4. 值迭代的递推公式
        • 5. 维度爆炸问题
      • 1.2.2 有限前瞻深度策略
        • 1.方法概述
        • 2.求解步骤
        • 3.优化技巧
      • 1.2.3 在MDP中规划
        • 1.主要步骤
        • 2.优缺点
  • 2. EPSILON 系统解析
    • 2.1 自动驾驶决策规划现存问题
    • 2.2 系统概述
    • 2.3 问题描述
    • 2.4 整体流程
  • 3. MARC 解读—— Multipolicy and Risk-aware Contingency Planning for Autonomous Driving
  • 4. 参考链接

0. 前言

本文主要记录课程《自动驾驶预测与决策技术》的学习过程,难免会有很多纰漏,感谢指正。
课程链接:https://www.shenlanxueyuan.com/my/course/700
相关笔记链接:
Part1_自动驾驶决策规划简介
Part2_基于模型的预测方法
Part3_路径与轨迹规划
Part4_时空联合规划
Part5_决策过程

1. 部分观测的马尔可夫决策过程

1.1 POMDP的思想以及与MDP的联系

1.1.1 MDP的过程回顾

1.1.2 POMDP定义

请添加图片描述

1.1.3 与MDP的联系及区别

请添加图片描述
请添加图片描述

在这个“开门与老虎”例子中,解释了 POMDP 和 MDP 的区别与联系。

POMDP 视角

在这个图中,智能体面对两扇门,一扇门后有老虎,另一扇门是逃生的出口。问题在于,智能体无法直接观察门后是什么,必须通过“listen”(听老虎的声音)来推测老虎的位置。

  1. 状态(S0 和 S1):老虎可能在左边(S0),或者在右边(S1)。状态的变化依赖于智能体的行为。
  2. 动作集(A):智能体可以选择听(listen)或直接开左边门(open left)或右边门(open right)。
  3. 观察集:智能体不能直接知道老虎在哪里,但可以通过听老虎的声音获取部分信息。听到左边的声音意味着老虎可能在左边,听到右边的声音则相反。
  4. 观察概率(Pr):当老虎在左边(S0)时,听到左边的声音的概率是 0.85,而听到右边声音的概率是 0.15(有一定的不确定性)。同样,老虎在右边时的观察概率是对称的。
  5. 奖励:开错门导致 -100 分的惩罚,开对门获得 +10 分的奖励,而“听”的行为有一个代价 -1。

在 POMDP 模型中,智能体只能通过“听”这种部分观察行为来推测当前的状态,它无法直接看到老虎的位置。这种不确定性体现了 POMDP 的核心特点——智能体不能完全观察到环境的真实状态,只能基于观察推测。

MDP 视角

如果我们假设智能体可以直接看到老虎的位置,那么这个问题就变成了一个 MDP 问题:

  • 状态:智能体知道老虎的位置。
  • 动作:智能体可以直接选择开哪扇门。
  • 奖励与惩罚:仍然是开错门得到 -100 分,开对门 +10 分。

在 MDP 中,智能体能完全观察到当前状态,因此它可以立即根据观察作出正确的决策,比如看到老虎在左边时就开右边的门,没有不确定性。

决策次数对最优解的影响

请添加图片描述

在“开门与老虎”的 POMDP 问题中,决策次数的不同会影响如何寻找最优解。通过不同的决策时间范围(1次、2次、100次决策)来探索最优策略。

  1. 只能做一次决策

如果只能做一次决策,最优解比较简单,因为你没有时间去“听”并获得更多信息。在这种情况下,你无法改善对状态的认知,只能基于当前的信念状态做出决策。假设初始状态下老虎可能在左边或右边的概率是 50%。

  • 最优策略:此时直接选择开门,因为“听”的行为会消耗 -1 的代价,且你没有足够的回合来平衡这个损失。由于没有任何信息提示,选择任意一扇门的期望是一样的:直接开门会带来 -45 的期望收益(50%概率开对门得到 +10,50%概率开错门得到 -100)。
  1. 可以做两次决策

如果有两次决策机会,策略会更加复杂,因为你可以选择“听”一次,然后根据听到的信息来做更明智的选择。

  • 策略 1:首先执行“listen”行动,通过听到的老虎位置的信息更新你的信念状态。

    • 听到老虎在左边时,你推测老虎确实在左边的概率是 85%,在右边的概率是 15%。
    • 听到老虎在右边时,你推测老虎在右边的概率是 85%,在左边的概率是 15%。
  • 最优策略:通过“listen”获得信息后,你的下一步决策(开左门还是开右门)基于更新后的信念状态。如果听到左边的老虎声音,你应开右门(85%的概率成功),听到右边的声音则开左门。

期望收益

  • 听到老虎在左边:85%概率开对门,期望为 ( 0.85 × 10 + 0.15 × ( − 100 ) = − 4 (0.85 \times 10 + 0.15 \times (-100) = -4 (0.85×10+0.15×(100)=4)。
  • 听到老虎在右边:同理,期望为 -4。
  • 听的代价是 -1,所以最终期望收益为 ( − 4 − 1 = − 5 ) ( -4 - 1 = -5) (41=5)

相比于不听直接开门(期望收益 -45),听一次然后做决策的期望收益更好。

  1. 可以做 100 次决策

如果有 100 次决策机会,这就变成了长期规划的问题。你可以通过反复“听”来更新信念,并最大化未来决策的累积奖励。在这种情况下,你可以多次选择“listen”来降低不确定性,但每次“听”都有代价,因此需要平衡“听”的次数和总期望奖励。

  • 策略

    • 开始时先进行几次“listen”来逐渐提高对老虎位置的把握,直到信念状态足够明确(比如 95% 的信心)。
    • 然后再根据当前的信念选择开门。
  • 最优策略

    • 在较早阶段可以多听几次,但不宜过多,因为每次“listen”都会有 -1 的代价。
    • 在信念足够明确时,停止“listen”,选择开门。如果老虎位置的概率已经非常确定(例如 >95%),继续“听”的收益就不如直接开门的收益高。

在这种长期决策中,POMDP 的策略可以通过动态规划贝尔曼方程来求解,这样可以在多次决策过程中找到最优的策略。

总结:

  • 1次决策:直接开门,期望收益是 -45。
  • 2次决策:先听一次再开门,期望收益是 -5。
  • 100次决策:先听几次(逐渐增加对老虎位置的确定性),然后开门,期望收益可以更高,具体取决于使用的策略优化算法。

在多次决策问题中,通过不断获取信息来更新信念状态可以大幅提升期望收益,这也是 POMDP 的强大之处。请添加图片描述
请添加图片描述

1.2 POMDP的3种常规解法

1.2.1 连续状态的“Belief MDP”方法

请添加图片描述
请添加图片描述

使用Belief MDP 方法在连续状态空间中的基本思路及求解过程:

1. 信念状态的定义

信念状态是对系统当前状态的概率分布。由于在 POMDP 问题中,状态不是完全可观测的,智能体需要根据历史信息(包括过去的动作和观测)推测当前系统的状态,这种推测即信念状态 ( b ) ( b ) (b)

在经典 POMDP 问题中,由于状态是部分可观测的,智能体需要根据所做的观测推断出系统可能处于的状态分布,这个推断称为信念状态(Belief State)

  • 信念状态 ( b ( s ) ) ( b(s) ) (b(s)) 是一个概率分布,表示智能体对系统实际状态的估计。具体来说,信念状态是根据历史的观测、动作、奖励等信息,对当前状态的条件概率分布。对于每一个状态 ( s ) ( s ) (s),信念状态 ( b ( s ) ) ( b(s) ) (b(s)) 表示智能体认为系统处于状态 ( s ) ( s ) (s) 的概率。

  • 将 POMDP 问题转化为信念 MDP 时,我们不再直接处理原始的部分可观测的状态,而是在信念空间上处理这个问题。因此,信念 MDP 具有完全可观测性。

2. Belief MDP 的过程

为了处理部分可观测性问题,POMDP 转化为Belief MDP 问题。Belief MDP的目标是找到在信念空间中的最优策略,即在当前的信念状态下采取什么动作能够最大化期望奖励。

  • 动态模型:系统从信念状态 ( b t ) ( b_t ) (bt) 转移到新的信念状态 ( b t + 1 ) ( b_{t+1} ) (bt+1),通过执行动作 ( a t ) ( a_t ) (at) 并观测到新的观测 ( o ) ( o ) (o) 后,更新信念状态。

  • 奖励函数:对于每一个信念状态,奖励 ( r ( b t , a t ) ) ( r(b_t, a_t) ) (r(bt,at)) 是在信念 ( b t ) ( b_t ) (bt) 下采取动作 ( a t ) ( a_t ) (at) 所带来的即时奖励。

3. 问题的求解

利用值迭代的方法求解信念 Belief MDP 的过程:

  • 期望奖励函数 ( V π ( b 0 ) ) ( V^\pi(b_0)) (Vπ(b0)):给定初始信念 ( b 0 ) ( b_0) (b0) 和策略 ( π ) ( \pi) (π),期望的回报是未来每一个时刻 ( t ) ( t ) (t) 的奖励的加权和,即:
    V π ( b 0 ) = ∑ t = 0 ∞ γ t E [ R ( s t , a t ) ∣ b 0 , π ] V^\pi(b_0) = \sum_{t=0}^{\infty} \gamma^t E[R(s_t, a_t) | b_0, \pi] Vπ(b0)=t=0γtE[R(st,at)b0,π]
    其中 ( γ ) ( \gamma ) (γ)是折扣因子。

  • 最优策略:通过优化该期望回报 ( V π ( b 0 ) ) ( V^\pi(b_0) ) (Vπ(b0)),可以找到一个最优策略 ( π ∗ ) ( \pi^*) (π),即:
    π ∗ = arg ⁡ max ⁡ π V π ( b 0 ) \pi^* = \arg\max_\pi V^\pi(b_0) π=argπmaxVπ(b0)

4. 值迭代的递推公式

为了计算Belief MDP 中每个信念状态的值,可以使用值迭代算法,其递推公式为:
V ∗ ( b ) = max ⁡ a ∈ A [ r ( b , a ) + γ ∑ o ∈ O P ( o ∣ b , a ) V ∗ ( τ ( b , a , o ) ) ] V^*(b) = \max_{a \in A} \left[ r(b, a) + \gamma \sum_{o \in O} P(o | b, a) V^*(\tau(b, a, o)) \right] V(b)=aAmax[r(b,a)+γoOP(ob,a)V(τ(b,a,o))]
这个公式表示,在信念状态 ( b ) ( b) (b) 下,采取动作 ( a ) ( a ) (a) 能带来的最大化的预期回报。这里包括:

  • 即时奖励 ( r ( b , a ) ) ( r(b, a) ) (r(b,a))
  • 未来奖励的加权和,未来的信念状态由信念更新公式 ( τ ( b , a , o ) ) ( \tau(b, a, o) ) (τ(b,a,o)) 计算得到。
5. 维度爆炸问题

Belief MDP 的核心问题是维度爆炸,因为信念状态空间是连续的,而每个信念状态都需要计算其值函数。这在处理高维度的信念空间时,计算量会变得极为庞大,因此通常需要采用近似算法进行求解。

1.2.2 有限前瞻深度策略

这种方法的核心思想是对未来的状态和动作进行有限深度的前瞻,并基于此进行优化,类似于模型预测控制 (MPC) 的思路。

请添加图片描述
请添加图片描述

1.方法概述
  1. 有限前瞻

    • 由于 POMDP 的状态空间通常非常大,完全求解的计算量巨大,因此该方法通过对动作序列和观测进行有限步的前瞻来简化问题。
    • 图中展示了一个状态-动作-观测的搜索树,在树中,智能体从根节点(当前状态)出发,通过一系列动作和观测进行扩展,每次前瞻 ( H ) ( H ) (H)步。
  2. 剪枝策略

    • 为了减少计算量,常常会对某些不太可能的观测进行剪枝,保留更有可能出现的观测结果。这使得状态空间不会呈指数增长,优化计算资源。
  3. 树结构中的节点数

    • 图右侧给出了有限前瞻过程中的节点数计算公式,节点数量随着动作 ( A ) ( A) (A) 和观测 ( O ) (O) (O) 的种类,以及前瞻步数 ( H ) ( H ) (H) 指数级增加。因此,通过剪枝和合理的搜索策略来减少需要评估的节点非常重要。
2.求解步骤
  • 前瞻搜索:从当前状态出发,模拟未来可能的动作和观测序列。每个动作序列对应未来一系列的状态和奖励。
  • 评估策略:在每个前瞻步长结束时,对不同的动作序列进行评估,根据预期回报选择最佳的动作序列。
  • 执行最优动作:基于评估的结果,执行当前最优的第一个动作,并将该动作的观测结果作为下一步的输入,重复上述过程。
3.优化技巧
  • ( α \alpha α)-向量技巧:用于加速计算值函数,使得每一个信念状态可以用一个超平面表示。
  • 蒙特卡洛树搜索(MCTS):该方法可以从当前状态出发,逐步扩展状态和观测序列,通过模拟未来可能的动作结果,减少计算复杂度。

1.2.3 在MDP中规划

请添加图片描述

其核心思想是将概率最大的置信状态作为实际状态来处理,类似于假设系统的状态总是最有可能的那一个。

1.主要步骤
  1. 置信状态假设

    • 假设当前最可能的置信状态代表系统的真实状态,即我们并不处理所有可能的状态,而是聚焦在当前置信度最高的那个状态。
  2. 通过滤波跟踪状态

    • 使用类似于滤波的技术来不断更新和跟踪这个置信状态的概率分布。滤波器会根据新观测来调整系统对当前状态的估计,确保我们使用的状态是最可能的。
  3. 选择最优动作

    • 在每个时刻,根据当前估计的最可能状态,选择该状态下的最优动作(通常是基于预先定义的策略或价值函数)。
2.优缺点
  • 优点:该方法在计算上较为高效,因为它简化了问题,将复杂的概率分布问题转化为一个确定性问题。
  • 缺点:当系统不确定性较高时(即多种状态可能同时存在),这种方法可能会失败。因为它无法主动收集更多信息来提高置信度,只依赖于被动更新的置信状态。

这类方法适用于那些不确定性较小的场景,但在高度动态且不确定性较大的环境下,可能效果不佳。

2. EPSILON 系统解析

该部分只做general的介绍,详细的流程可以参考论文及以下链接:

  • https://github.com/HKUST-Aerial-Robotics/EPSILON

  • EPSILON: An Efficient Planning System for Automated Vehicles in Highly Interactive Environments

  • EPSILON论文解读、代码ROS2-Carla重构、实车部署全记录

2.1 自动驾驶决策规划现存问题

请添加图片描述
请添加图片描述

2.2 系统概述

请添加图片描述

2.3 问题描述

请添加图片描述请添加图片描述
请添加图片描述

2.4 整体流程

Efficient Behavior Planning – Motivating Example
请添加图片描述

Efficient Behavior Planning – Guided Action Branching
请添加图片描述
请添加图片描述
Efficient Behavior Planning – Multi-agent Forward Simulation
请添加图片描述
Efficient Behavior Planning – Safety Mechanism
请添加图片描述
Efficient Behavior Planning – Policy Selection
请添加图片描述

基于时空语义走廊的轨迹生成

请添加图片描述

3. MARC 解读—— Multipolicy and Risk-aware Contingency Planning for Autonomous Driving

该部分没有听太懂,还是要结合论文去看。可参考以下链接:

  • MARC: Multipolicy and Risk-Aware Contingency Planning for Autonomous
    Driving
  • MARC: Multipolicy and Risk-aware Contingency Planning for Autonomous
    Driving - 论文推土机的文章
  • MARC:一种安全又高效的时空联合规划的方法

请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述请添加图片描述
请添加图片描述请添加图片描述

请添加图片描述
请添加图片描述

4. 参考链接

  • 《自动驾驶预测与决策技术》

  • Part1_自动驾驶决策规划简介

  • Part2_基于模型的预测方法

  • Part3_路径与轨迹规划

  • Part4_时空联合规划

  • Part5_决策过程

  • https://github.com/HKUST-Aerial-Robotics/EPSILON

  • EPSILON: An Efficient Planning System for Automated Vehicles in Highly Interactive Environments

  • EPSILON论文解读、代码ROS2-Carla重构、实车部署全记录

  • MARC: Multipolicy and Risk-Aware Contingency Planning for Autonomous
    Driving

  • MARC: Multipolicy and Risk-aware Contingency Planning for Autonomous
    Driving - 论文推土机的文章

  • MARC:一种安全又高效的时空联合规划的方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg 视频滤镜:屏蔽边框杂色- fillborders

滤镜描述 fillborders 官网链接 > FFmpeg Filters Documentation fillborders滤镜有几种方式帮你屏蔽边框的杂色、不好的图案。 滤镜使用 参数 left <int> ..FV.....T. set the left fill border (from 0 to INT_MAX) (default 0)right …

Java基础——类和对象的定义链表的创建,输出

目录 什么是类&#xff1f; 什么是对象? 如何创建链表&#xff1f; 尾插法&#xff1a; 头插法&#xff1a; 输出链表的长度 输出链表的值 什么是类&#xff1f; 创建Java程序必须创建一个类class. .java程序需要经过javac指令将文件翻译为.class字节码文件&#xff0c…

简单的 docker 部署ELK

简单的 docker 部署ELK 这是我的运维同事部署ELK的文档&#xff0c;我这里记录转载一下 服务规划 架构: Filebeat->kafka->logstash->ES kafka集群部署参照: kafka集群部署 部署服务程序路径/数据目录端口配置文件elasticsearch/data/elasticsearch9200/data/elas…

【初阶数据结构篇】二叉树OJ题

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

5分钟科普:AI网关是什么?应用场景是什么?有没有开源的选择?

AI网关的功能及其定义 AI网关位于企业应用与内外部大模型调用的交汇点&#xff0c;能够灵活地将请求转发给内部自建模型或外部大模型服务提供商&#xff0c;甚至海外的服务商。它管理着企业所有的AI出口流量&#xff0c;为企业内的不同团队提供了多方面的优势。 对于开发团队…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析

该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用Ansys Mechanical和LS-DYNA对相机在地板上的一系列冲击和弹跳过程…

凸优化理论,凸二次规划问题,对偶问题及KKT条件

凸优化理论 ​ 研究凸优化之前我们不妨提出几个小问题&#xff1a; 什么是优化问题&#xff1f;优化问题的解是什么&#xff1f;什么是凸优化问题&#xff1f;凸优化问题的解决方案是什么&#xff1f; 1.1 优化问题 ​ 理解优化问题其实很简单&#xff0c;我们其实从高中事…

实战攻略 | ClickHouse优化之FINAL查询加速

【本文作者&#xff1a;擎创科技资深研发 禹鼎侯】 查询时为什么要加FINAL 我们在使用ClickHouse存储数据时&#xff0c;通常会有一些去重的需求&#xff0c;这时候我们可以使用ReplacingMergeTree引擎。这个引擎允许你存储重复数据&#xff0c;但是在merge的时候会根据order …

3DGS与NeRF的区别

0 论文链接 nerf&#xff1a;https://arxiv.org/abs/2003.08934 3dgs&#xff1a;https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/3d_gaussian_splatting_low.pdf 1 简要 1.1 nerf neural radiance fields神经辐射场 作者提出了一种优化来自一组输入图像的场景…

关于python的复习

Python的基础 自动声明: 在 Python 中&#xff0c;不需要显式声明变量类型&#xff0c;变量的类型是在赋值时根据值自动推断的。 动态类型: Python 是动态类型语言&#xff0c;变量的类型可以在运行时改变。 x 10 # 整数 x "hello" # 现在是字符串 变量…

HBuilderX运行微信小程序,编译的文件在哪,怎么运行

1. 点击HBuilderX顶部的运行-运行到小程序模拟器-微信开发者工具&#xff0c;就会开始编译 2. 编译完成后的文件在根目录找到 unpackage -- dist -- dev -- mp-weixin, 这里面就是编译后的文件&#xff0c;如果未跳转到开发者工具&#xff0c;那可能是没设置启动路径&#xff0…

自然语言处理在客户服务中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 自然语言处理在客户服务中的应用 引言 自然语言处理概述 定义…

【学习笔记】Kylin-Desktop-V10-SP1 麒麟系统知识4——设备设置

提示&#xff1a;学习麒麟Kylin-Desktop-V10-SP1系统设备设置相关知识&#xff0c;包含设备设置进入方法、配置打印机、设置鼠标、键盘相关参数&#xff08;包含输入法的配置&#xff09;、以及管理快捷键组合、和多屏协同相关配置 一、前期准备 成功安装麒麟系统&#xff08…

Gen-RecSys——一个通过生成和大规模语言模型发展起来的推荐系统

概述 生成模型的进步对推荐系统的发展产生了重大影响。传统的推荐系统是 “狭隘的专家”&#xff0c;只能捕捉特定领域内的用户偏好和项目特征&#xff0c;而现在生成模型增强了这些系统的功能&#xff0c;据报道&#xff0c;其性能优于传统方法。这些模型为推荐的概念和实施带…

【国内中间件厂商排名及四大中间件对比分析】

国内中间件厂商排名 随着新兴技术的涌入&#xff0c;一批国产中间件厂商破土而出&#xff0c;并在短时间内迅速发展&#xff0c;我国中间件市场迎来洗牌&#xff0c;根据市占率&#xff0c;当前我国中间件厂商排名依次为&#xff1a;东方通、宝兰德、中创股份、金蝶天燕、普元…

PVE纵览-备份与快照指南

PVE纵览-备份与快照指南 文章目录 PVE纵览-备份与快照指南摘要1 备份与快照概述定义与区别备份与快照在PVE中的应用场景 2 PVE 备份功能详解备份类型与策略配置备份任务自动化备份管理 3 PVE 快照功能详解快照的工作原理快照的创建与恢复机制快照对系统性能的影响快照的使用场景…

解非线性方程组

实验类型&#xff1a;●验证性实验 ○综合性实验 ○设计性实验 实验目的&#xff1a;进一步熟练掌握解非线性方程组牛顿迭代算法&#xff0c;提高编程能力和解算非线性方程组问题的实践技能。 实验内容&#xff1a; 设有非线性方程组(此方程组是非标准型) 实验说明&#xff1…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…

设计模式-七个基本原则之一-开闭原则 + SpringBoot案例

开闭原则:(SRP) 面向对象七个基本原则之一 对扩展开放&#xff1a;软件实体&#xff08;类、模块、函数等&#xff09;应该能够通过增加新功能来进行扩展。对修改关闭&#xff1a;一旦软件实体被开发完成&#xff0c;就不应该修改它的源代码。 要看实际场景&#xff0c;比如组内…

图形几何之美系列:仿射变换矩阵(二)

“ 在几何计算、图形渲染、动画、游戏开发等领域&#xff0c;常需要进行元素的平移、旋转、缩放等操作&#xff0c;一种广泛应用且简便的方法是使用仿射变换进行处理。相关的概念还有欧拉角、四元数等&#xff0c;四元数在图形学中主要用于解决旋转问题&#xff0c;特别是在三维…