Month: March 2024

  • 几个基本的线代知识点

    这篇文章简要介绍一下线性代数的相关概念知识,如行列式,特征值,特征向量以及特征值分解,SVD分解等。在这里顺便记录一下以便后续查阅。 1、行列式(determinant),矩阵对应一个特定的值,一般记为det(A),余子式(minor)m_{i,j}一般记为当前矩阵去除i行j列后形成的行列式(由此也可以理解为行列式为递归定义),代数余子式(cofactor)需要在m_{i,j}的基础上再乘上一个因子(-1)^{i+j}形成c_{i,j}。同时有伴随矩阵(adjoint matrix)的概念也是基于代数余子式进行定义的。需要注意,行列式只针对于方阵。 基于伴随矩阵就比较容易计算矩阵的逆。如下所示,也可以看出矩阵的逆要求其行列式不为0。 2、特征值特征向量(也是方阵,对于非方阵来说,是不存在特征值的,但是会存在条件数):满足特征方程(characteristic equatation)det(A-lamda I)=0的lambda的值即为矩阵的特征值。实对称矩阵的特征向量相互正交。特征值有其对应的代数重数(Algebraic multiplicity),每个特征值有其对应的几何重数(Geometric multiplicity,即为其对应的线性无关的特征向量的个数)。缺陷特征值(defective eigenvalue)指的是存在这个特征值的几何重数比代数重数要小的特征值。关于代数重数大于等于几何重数的相关证明,可以参考引文的链接。 3、特征值分解和SVD分解,可以参考引文3和引文4,其中特征值分解满足方阵,实对称矩阵的特征向量线性无关且为相互正交,PCA就用到了这个特性,SVD分解可以解决不是方阵的情况,但是可以通过转化为特征值分解的方法去进行求解,具体的方法可以参考引文3。特征值的计算方法可以用QR分解来进行。 References

  • 交互式VR在视觉增强方面可能的应用

    人类个人的感知,认知和创造性都是有限制的,这里仅从视觉感知增强的方面来说一说元宇宙相关技术的作用。所描述的场景和应用只是一些可能的案例,实际上会有更多丰富的场景,但也有待去更好的在技术产品上落地实现,在实际中得以很好的应用。 人类在感知上存在着较大局限,比如仅从视觉上来讲,人的眼睛只能感受波长较窄的一段可见光,看不清微观世界运行的细节,也看不清大的宏观宇宙的全貌,人的视角也很有限制,不能同时看到360度周视全貌,以及遮挡视线部分的内容。感知是认知的基础,人类首先能够看得见听得着,才能不断积累对世界的认识并代代相传,智慧才能不断升级。 人类感知能力的局限可以由现在科技的发展进行拓展和增强,人们越来越会制造高级的工具来延申我们的视觉感知,听觉感知以及行动力等等。就拿VR来说,可以应用的场景很多,特别在小的微观细节和大的宏观全貌的交互式可视化上将能够大有所为。这里就简要的来说一说。 比如生物化学这些领域,一些分子结构的交互动态可视化,DNA双螺旋到底长成什么样子,一些生物医药,特别对于生物学和医学的同学,如果能够通过VR技术来可视化很多生物微观的细节结构和动态行为,那这里的学习和理解将更加的直观和深刻。 再比如大的宏观结构,数字孪生地球,太阳系和银河系等等,都是非常有教育价值的场景,通过数字地球,未来我们甚至可以随时云上游览地球的任何一个地方,我们可以通过缩放来了解地月的运行方式,太阳系的行星和卫星,以及可能的太阳系带着自己的行星卫星和星云在银河系中飞奔的场景。 还有很多的场景可以用到,如展示栩栩如生的已经灭绝的古生物,中小学语文课历史课等内容都可以制作设计精良的交互可视化内容。以后VR,AR和AI相结合的元宇宙产品,有更多的内容期待着大家发挥神奇的想象力,期待后面这些方面也能有所实践。

  • Apollo 粗粒度结构及系统启动流程简介

    Apollo系统是智能驾驶领域很有影响力的开源系统,本篇文章从粗粒度上介绍Apollo系统的结构,并分析其其启动流程。后续有机会再介绍细节,不正确的地方欢迎批评指正。 Apollo系统是个比较复杂的系统应用,首先其实现了通信及任务调度的中间件CyberRT(在代码仓的apollo\cyber目录下),也称为Apollo系统的运行时环境(RT即为Runtime),Apollo系统的各个业务逻辑模块,包括感知perception,规划planning,控制control等等各上层的模块,都是基于CyberRT的基础上进行构建的。CyberRT提供了两个核心的运行时功能,1为任务调度,基于协程,多线程实现的不同任务可以按照智能驾驶的业务逻辑编排成高效的执行模式运行,2为通信模式,借鉴了ROS里边的node发布订阅模式,实现了进程内(intra),shm(共享内存单机多进程间通信),rtsp(实时发布订阅协议,多个host之间的网络通信协议),以及hybrid(混合模式,基于component之间通信的物理状态动态选择上述三种模式以达高效通信)。在CyberRT的实现里,一个任务以component为载体,里边的业务处理逻辑通过协程来实现,同时其有对应node,实现了reader和writer,也就是可以接收和发送消息(不同的消息以channel来区分,类似于ros里的topic)。关于通信的实现可以参考apollo\cyber\transport目录下面的代码,引文2中也有相关的介绍。 CyberRT可以理解为在底层操作系统之上构建的一个RTOS,在Apollo的源码仓里,系统的各个模块的逻辑实现依赖于CyberRT提供的接口,这些模块的代码在目录apollo\modules里。具体阅读相关代码实现。 这里以一个模块的启动为例进行说明,一般来说,每一个模块都有一个启动的文件(dag有向无环图文件),如下面的路径为摄像头bev感知模块的dag文件:apollo\modules\perception\camera_detection_bev\dag\camera_detection_bev.dag。一般通过mainboard程序启动一个module。mainboard即为cyberrt运行时编译后生成的可执行文件,会加载CyberRT运行时环境,load相应模块的so文件(一个module可以由多个component组成)。而整个新系统将会是很多个module组成的大系统,因此会有很多个mainboard程序启动,整个智能驾驶系统将是一个多进程程序(不同进程有可能会跨不同的主机host)。具体的启动方式的介绍在引文3中有详细介绍,在此不做赘述。 References

  • Apollo CyberRT的两种任务调度策略实现代码简要说明

    Apollo CyberRT为智能驾驶的中间件(middle ware),提供了类似于ROS概念(并优于ROS平台)的机器人运行时环境。CyberRT在任务的调度上进行了优化的设计,提供了经典调度模式和编排调度模式,使得系统的诸多任务可以按照任务之间的逻辑拓扑结构来进行编排,从而在执行性能上得到很好的保证。同时CyberRT在通信上也做了很好的支持,在单机内部,多机之间的不同component都能够进行高效的通信。这里主要就任务调度方式来做一下说明,也是加以记录以备后面查阅,不正确的地方欢迎批评指正。 首先,在CyberRT实现里,Processor类对应着线程的封装,CRoutine类是对协程的封装,Component类对应着组件(任务)的封装,在Component类里,会创建协程来处理任务。 经典调度模式(ClassicContext):在经典调度模式下,可以将任务进行分组,分组的目的主要是在基于NUMA架构的计算环境上,实现资源的隔离,在同一个组的任务会安排在同一个NUMA节点下运行,这样保证了同一组的任务之间的通信不会由于跨NUMA节点而带来更多的资源消耗和计算时长。而且每一个组下面维护一个多优先级的协程(CRoutine)队列,每一个优先级下面维护一个协程的数组。ClassicContext类对经典调度模式的上下文进行了建模,而且在CyberRT实现里,每一个Processor对应着一个ClassicContext,并且任务(component,以协程的方式实现)的优先级队列作为ClassicContext类成员的静态变量,在不同的线程里边实现共享。ClassicContext调度任务时,会从高优先级的任务里优先调度。在这里补充说明一下,CRoutine的同一个实例可以在不同的线程里调度,CRoutine类里有thread_local类型的相关变量,保证了同一个协程在不同的线程里有对应的相关变量的副本。 编排调度模式(ChoreographyContext):在编排调度模式下,一个Processor对应着一个ChoreographyContext,并且封装了一个multimap类型的变量,key为协程的优先级,value为协程,保证了可以支持同等的优先级下的多个协程。而且这个变量不是静态变量,在多个线程(Processor)之间不共享,保证了执行的协程任务的CPU亲和性(不会在多个cpu之间调度同一个协程),可以基于此通过配置文件来实现任务的编排(如定义某些任务在某些cpu上执行)。 更多的代码细节建议阅读官方开源的代码仓的关键部分,如apollo\cyber\scheduler,apollo\cyber\croutine,apollo\cyber\component等,上述的文字说明都可以在这几个目录的代码里找到实现。 References

  • 无常有常-浅论日常生活工作中的安全及风险管理

    我们生活的世界是一个开放的系统,每个人都是整个宇宙空间的一部分,承担着不同的角色,履行对应的义务,人是一切社会关系的总和,不能绝对孤立存在。 因此每个人在履行对应任务的时候就要不断的复盘,总结和反思,自己在以往的经历中哪些做的挺好,又有哪些不足。而不足的地方也许就是自己的认知欠缺的地方,以及决策上的考虑不全,或者说在一个大系统中和人们的交互沟通上存在着信息理解上的差异,想法不同而又不能相互很好的理解,导致了矛盾和分歧的存在,从而影响整体生活的氛围和环境。这也是认知、文化和个人及组织管理等综合实力的体现。 通常有说世事无常,指的通常是说我们个人的渺小,事情的发展不是完全以个人的意志为转移的,也就是个人不是世界的中心,天地是公平且仁慈的,因此我们要学会接受一些偶然出现的可能风险,并认识到自己的不足,去加以改进和再实践,去更好的理解和认识自己的日常决策的重要性并谨言慎行,这样才会从无常变为有常。只有我们充分理解了世界社会运行的规律,我们的决策才会更加的理性和有规律可循,结果也趋向于稳定和成功。无常指的是偶然性和没有提前预想到的地方,而有常指的是规律和道理。 感恩生活中的美好和身边所有人的支持和帮助,希望通过不断的总结和反思,能带给更多人更好的快乐和幸福。

  • QR分解及用其求矩阵特征值方法简介

    QR分解是一种特殊的矩阵分解,将矩阵A(m,n)分解为标准正交矩阵Q(m,n)和上三角矩阵R(n,n)的乘积,QR分解可以用来求矩阵的特征值等应用。 首先解释一下施密特正交化的方法,施密特正交化将n个线性无关的向量转化为标准正交向量,其转化的步骤是首选选一个向量,然后在计算第二个向量时,将原始的第二个向量可以分解为第一个向量和垂直于第一个向量的两个向量的和。而可以利用在同一个方向上的两个向量的内积之比值即为两个向量长度的比值等特性求出第二个向量(和第一个向量垂直),以此同样的类似方法求得第三个向量,第四个向量等等。从而得出施密特正交法的公式。具体公式可以参考引文。 经过施密特正交化的方法可以得出n个标准正交的列向量,而且原始的每一个列向量都可以表示为这n个标准正交列向量的线性组合,根据施密特正交向量的生成特点,原始的列向量的线性组合的线性因子刚好符合上三角矩阵的形式。 第二种算法为Householder transformation,其依次利用列向量和标准正交基形成镜像对称的特征去找到变换的Q的关系,得出Q的特性(对称正交),具体算法请参考引文链接。 QR分解的一个用处就是用来计算矩阵的特征值,具体的原理不做特别说明,如有兴趣可以参考引文链接。下图说明了怎么用numpy基于QR分解去计算矩阵的特征值。 References

  • A*算法简介以二维数字魔方为例

    A*算法又称为启发式搜索算法,是在可能的解空间中,以更少的时间或步骤去找到路径问题答案的一种方法。用到A star算法的场景挺多,如路径规划,二维数字魔方,三维立体颜色魔方(生活中常见的魔方)等等,都可以用A*算法来加快搜索的进度。也是算法基础课中最典型的一个算法,一般要求去用代码实现,并且和原始的穷举式路径搜索,启发式函数的搜索结果(可能有多种不同的启发式函数方法)进行对比。 这里以一个二维数字魔方游戏为例来进行说明,二维数字魔方为一个9宫格,每个格子一个数字,每一个当前的状态可以用一个数字串来描述,数字串的顺序为9宫格从上到下从左到右的顺序进行依次排列而成,0代表空的格子,其邻居的格子可以移动到0这个位置,移动后相当于进行了互换。如“608435127”这个串就代表了一个二维数字魔方的状态,我们一般定义目标状态为“123456780”。要求为从当前状态通过移动方格去达到目标状态。 我们对这个问题进行建模如下,1、状态建模,可以用3*3的二维数组来表示当前状态和目标状态;并且用(x0,y0)表示空的格子(数字0的格子)的坐标,用移动的操作方向来记录移动的操作路径(D表示向下,U表示向上,L表示向左,R表示向右);2、用g cost代表当前已经搜索到达的路径所需花销,用h cost代表从当前状态到达目标状态预估的(heuristic)的开销,总花销f cost为g cost + h cost。 具体的搜索算法有基于Dijkstra最短路径搜素算法,它从起点开始搜索时,总是优先搜索和展开当前离起点路径最短的节点,直至搜索到目标点时结束搜索。A*算法正是以“优先搜索直觉上方向靠谱的节点”为策略来减少搜索空间达到加速搜索目标点的目的。具体从代码实现上来解释即为:(1)、Dijkstra最短路径搜索算法将上述的g cost的大小作为路径展开的优先级;(2)、A*算法则用g cost + h cost的大小作为路径展开的优先级,使得搜索路径尽可能朝着目标状态的方向去展开。 以上述的二维数字魔方为例进行说明,Dijkstra最短路径搜索算法维护一个优先级队列,存放已经遍历的节点(路径)的代价函数g cost(以最小堆min heap的形式),然后每做一次搜索,就会从堆顶pop出节点并对其successors进行核查,如果没有遍历过,则将其g cost设为当前的g cost+1并push到优先级队列中;这个过程持续直至pop出的节点即为目标节点。 A*算法和Dijkstra最短路径搜索算法大体搜索流程差不多,不同的地方在于代价函数,A*算法的代价函数为g_cost+h_cost,其中g_cost和上述的Dijkstra算法相同,关键在于h_cost的设计,基于此特定问题,有两种特殊的h_cost函数,1为曼哈顿距离(每个魔方方块的位置和其目标位置的横坐标和纵坐标的距离之和),2为魔方单元块和其目标位置不对应的单元块个数。关于启发式函数的特性和设计准则,可以参考引文链接。 我们针对上述的几个搜索算法在借鉴了已有工作和相关思路的基础上提供了完整的代码实现,具体可以参考引文链接。 References

  • 虚实结合的生活工作空间设想

    随着元宇宙、人工智能和5G,6G区块链等技术的进步和融合,未来我们的生活工作方式将会有较大的变化,新的数字化时代科技发展日新月异,超乎我们的想象,这里就先天马行空的来说一说未来可能的情况和场景。 以IT公司为例,未来程序员编程实现工作将更多的由程序员的数字代理来完成,现实生活中的程序员可以负责来review和优化代码,以及程序的集成等工作。 家庭生活空间也类似,这里每个人可以由实体成员,实体机器人代理和虚拟代理三个角色构成,实体机器人负责在家庭物理空间完成一定的任务,如家务购物等,虚拟代理可以参加虚实融合的教学家长会,完成一些实体成员日程生活的记录如记账网购等活动。甚至我们日常活动中产生的想法和行动都可以数字化到元宇宙空间中,虚拟代理和实体在认知状态和行为上实现同步。某种意义上这样的数字虚拟代理可以实现实体个人成长经历一定程度的永久化,后代们将会更加具体的看到前人的生活工作情况,是一个活生生的家庭族谱,可以设置时间分辨率去浏览回顾,个人或伴侣也可以在年迈的时候去回忆曾经的美好时光。 综合上面两个场景及可能的更多的常见来看,未来虚拟空间将展现越来越重要的作用,虚拟空间将拥有更强大的生产力,人们的日常工作将会越来越多的由我们在虚拟空间的代理来完成,每一个组织,包括最小单位的个人,到家庭,公司,政府单位等都可以在元宇宙空间中建立虚拟代理,这些代理还可以在元宇宙空间中互联,实现更大的社交元宇宙,就像我们的物理世界中组织模式一样。也有说元宇宙就是下一代互联网,不过其组成元素将大大扩展很多,将是一个和现实世界平行发展但也有耦合和交互的虚拟世界,理想状态甚至是和物理世界同步运行着的一个镜像世界,或者加入非物理世界的人为构造和想象的部分,以及可能的多个不同特色和任务的虚拟世界,相互耦合着相互影响着推动整体世界向前运行。

  • 短时傅里叶分析(STFT)简介

    短时傅里叶分析是时频分析中经常用到的技术,由于傅里叶分析存在着时间跨度较宽导致分析结果中的频率特性中缺少了时间信息,甚至不同的信号可能会得出相同的傅里叶分析结果(如左右对称的两个信号,其傅里叶分析结果相同)。下面示例代码是短时傅里叶变换的numpy的逻辑实现,是基于局部(localized time zone)的傅里叶分析得出结果所拼接而成。其中hop_length即为短时傅里叶分析的时间分辨率。 以上图示为短时傅里叶分析的三维可视化结果,也有基于二维的可视化方法,一般称为光谱(声谱)图,如下所示为一段音频的频谱分析结果(Speech spectrogram,频率大小这个维度用颜色来表示)。 上面的声谱图可以有如下的解释: 1、基于梳状图的水平线们为对应的基频; 2、垂直线对应突然的语音信号, 通常是瞬变特征,典型的瞬变语音为辅音;爆破音;塞音; 3、在高频信号部分有较大能量的区域(更亮的颜色),一般对应着摩擦音(fricatives) 后续将继续更新光谱图的更多的分析技巧,如频率包络图等。 References

  • 具身智能(Embodied AI)开源数据集Open X-Embodiment简介

    为了训练一个通用的机器人策略,Google推出了Open X-Embodiment数据集,通过在全球机器人实验室收集机械臂操作的数据集,历时大半年,一共得到了大大小小60多个来自21个组织结构34个机器人研究实验室的数据集,包含在22个机器人上采集的能够完成527种不同技能(skills)的16万个任务(160266 tasks)的上百万条数据。60个已有数据集中涉及到的机器人有单臂、双臂和四足,Franka占多数。下图为数据集的来源组织单位,可以看出诸多著名高校和研究结构都有参与其中。 可以看到除了这前面的一些动作有一定数量之外,其他的几百个动作的数量都非常少,技能数据呈现长尾分布(如下图中d所示)。 机器人大模型有两个典型代表,RT-1是高效的为机器人控制(robotic control)设计的基于transformer架构的模型,RT-2是一个大的视觉语言模型联合微调训练( co-fine-tuned)以输出机器人动作(以自然语言的表现形式,natural language tokens)。RT为Robotics Transformer的简称。RT1使用130k条机器人遥操作数据训练,展示出了其处理多种任务的能力和很强的泛化能力。但其通用性仍受限于数据集的大小。RT-1 的输入由图片序列、自然语言指令构成,输出由机械臂运动的目标位姿( Toll , pitch gaw , gripper stαtus)、基座的运动 、模式转换指令构成( The robot action is a 7-dimensional vector consisting of x, y, z, roll, pitch, yaw, and gripper opening or the rates of these quantities.)。RT-2抛弃了RT-1的设计,采用了利用网络上海量图文数据预训练出的图文模型,这些模型的规模可以最大达到55B的参数量,远远超过RT-1的35M的规模。这些图文模型被训练来回答关于图片的问题,原本的输出是文字,RT-2创造性的将机器人动作重新编码,使得编码为“文字”的机器人动作作为图文模型的输出。RT-X把提高扩展的目标放在了指令中的“动作”。 基于RT-1模型用该混合的机器人数据训练的结果模型为RT-1-X,基于RT-2模型用该混合的机器人数据训练的结果模型为RT-2-X,RT-1-X和RT-2-X比RT-1和RT-2模型性能优越了很多。得到的RT-1-X和RT-2-X模型表现出了很强的泛化能力和涌现能力(跨机器人实体学习的能力)。是以后更加通用智能的机器人的技术实现的曙光。 Open X-Embodiment数据集采用RLDS格式进行描述,RLDS为Reinforcement Learning Datasets的缩写,是一个用来存储,检索和操作序列的决策制订和执行的剧集数据(episodic data in the context of Sequential Decision Making),剧集一般记录一个完整的任务轨迹过程,比如一盘棋的下棋的步骤序列,在这里为机器人的一个任务的数据序列。如下图所示为一个episode数据的图像序列。如需了解数据集的更多的细节,可以参考引文中github里相关的代码链接。 行业内开源的好的数据集对于推动整个方向的发展起到了非常重要的作用,之前也有介绍过数据要素方面的博客短文(参考引文链接),具身机器人在将来将可以实现更多的任务,也可以在更多的应用场景中得到应用,数据集也可能会进一步扩充和丰富,以后如家务机器人,教育机器人等等也许会在不久后能够在实际生活中得到较好的应用。期待越来越多的算法和应用创新来丰富数字化场景的应用和数字化产业的发展,为社会经济提供新的增长动力,为人们的生活带来更多的便利和福祉。…