Chapter 2: Process and Tools of Software Construction

本文介绍了软件开发生命周期,重点讲解了敏捷开发方法,包括Scrum和极限编程,并深入探讨了软件配置管理(SCM)和版本控制系统(VCS),特别是Git的使用,涵盖了从基础操作到分支合并策略,以及构建工具在软件构造中的作用。

2.1 Software Lifecycle and Configuration Management


本节的重点在版本控制工具git的基础使用

1. 基本知识


软件开发生命周期(SDLC):从无到有,从有到好

传统软件过程模型:基本类型有线性过程(Linear)和迭代过程(Iterative),目前存在的模型有瀑布过程(waterfall),增量过程(incremental),V字模型(V-model),原型过程(prototyping),螺旋模型(spiral)。

敏捷开发:Agile = 增量 + 迭代

将任务划分成一个个小规模的任务,因此较小的团队也能够适应大规模软件的开发。在每个小步骤的迭代中,用户可以参与开发,软件可以随时修正,质量因此得到了保证。因此,敏捷开发是一次次小迭代,将任务细分成一个个小任务,在每个小任务上完成迭代。

极限编程:关注于测试驱动的开发(TDD),自动化构建、持续集成、持续交付。

2. 软件配置管理(SCM)和版本控制系统(VCS)


软件配置管理是为了追踪和控制软件的变化,而软件中发生变化的基本单元,如文件,就被成为软件配置项(SCI)。

当软件在开发过程中达到了一个稳定的状态,如可以对外发布的状态,此时的文件组成了基线(Baseline)。

为了存储各配置项随时间变化的信息和基线信息,就有一个数据库来管理这些内容,即配置管理数据库(CMDB)。

VCS分为三种:本地版本控制系统(无法协作)存储在本地、集中式版本控制系统(支持协作但没办法抵抗服务器崩溃导致无法开发的风险)存储在服务器上、分布式版本控制系统(解决了前两者的问题,代价是存储空间)同时存储在本地和服务器。

3. Git


创建:git init

暂存:git add <filename>

提交:git commit -m “commit message”

链接:git remote add origin <URL>

推送:git push- u origin master

创建分支:git checkout -b <branch name>

切换分支:git checkout <branch name>

合并分支:git merge <branch name>

删除分支:git branch -d <branch name>

git中的四个区域:workspace、staging area、Local repository、Remote repository

git的存储结构是一张有向无环图,每次commit在图上会增加一个新的节点,并将HEAD指向这个节点。通常一个子节点有一个父节点,当一个父节点有多个子节点时表明创建了分支,一个子节点有多个父节点时表明进行分支合并。

git单个节点的存储的信息是文件信息指针tree、作者信息author、提交者信息commiter,而在每个tree中,包含所有文件的信息,对于每个文件指针,如果文件变化了,则指向变化后的新文件,如果没有变化,则指向上次提交的文件,不做重复存储。

传统VCS存储的是文件每个版本之间的变化,这种办法的优点是存储空间较小,但由于存储的只是变化,取出指定时期的文件要先取出原文件,再取出变化内容,最后做合并形成新文件,所以取出文件的时间复杂度较高。git存储的则是文件,所以取出特定版本的文件比较方便,但是代价的是空间复杂度较高。

关于分支的合并:对于合并操作来说,如果是把一个做了更改的分支合并到一个未作更改的分支,那么就将未作更改的分支的指针移到做过更改分支的指针的位置。示意图:把hotfix合并到master

而如果两个分支都做了更改,那么就找到更改的共同的祖先节点,以祖先节点为开始,将两个分支所有做出的更改都放在一起,在工作分支上形成一个新的节点。示意图:把iss53合并到master

删除分支时,只是删除了分支指针,并没有删除在该分支上的commit。

2.2 Process, Systems, and Tools of Software Construction

1. 通常软件构造过程


(1) Programming:有编程语言,也有建模语言,如UML,还有配置语言,如XML、JSON。

(2) Code review、Static code analysis:可以使用工具来发现bug,如CheckStyle, SpotBugs。

(3) Testing:测试,单元测试、集成测试、系统测试…

(4) Debugging:调试

(5) Dynamic code analysis/profiling:在程序运行的过程中查看并发现问题,本课程不涉及这部分

(6) Refactoring:重构不改变功能,只是处于更容易维护的目的对代码优化

(7) Build:第2部分

2. 狭义的软件构造过程(Build)


这是一个借助于工具,将软件构造过程中大的各阶段的活动自动化的过程,尽可能地脱离人工,以提高构造效率。

常用的工具:Jenkins、Make、Ant、Maven、Gradle

利用工具完成项目的自动化构建、测试、打包release等功能,完成build time–>run time。

同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### 关于三维空间中平面的凸包算法 #### 定义与概念 在三维空间中的凸包是指给定一组点集 \( P \),其凸包是一个最小体积的凸多面体,该多面体能够包围所有的输入点。对于二维平面上的点集而言,已经存在多种高效的算法来求解凸包问题[^2]。 然而,在三维情况下,情况变得更加复杂。三维凸包不仅限于简单的多边形边界描述,而是涉及到了由多个三角形或四边形组成的表面结构。为了实现这一目标,通常采用增量法、分治策略或是包裹方法(类似于Jarvis步进法)来进行构建[^3]。 #### 增量构造法 Incremental Construction Method 一种常见的解决方式是从一个初始简单形状开始——比如四个不共面的顶点形成的四面体作为起点;随后逐个加入新的点到当前已知的部分凸壳上,并调整更新这些新增加部分直到遍历完所有数据点为止。每当引入一个新的外部节点时,会形成一些新面孔并移除那些不再属于最终结果内部区域的老面孔。 #### QuickHull快速外壳算法 QuickHull是一种基于分而治之原理设计出来的高效算法之一。它通过寻找最远距离中心位置的一对极值点建立初步框架之后再分别处理剩余未被覆盖的空间范围内的子集合。此过程可以递归执行直至完成整个模型搭建工作。这种方法特别适合用于高维数目的场景下因为它的平均时间复杂度相对较低O(n log n)[^4]。 #### 实现示例 Python Code Example Using Scipy Library Python 中有一个非常方便使用的库叫做 `scipy.spatial` 提供了一个名为 ConvexHull 的类可以直接用来计算任意维度下的凸包: ```python from scipy.spatial import ConvexHull import numpy as np points = np.random.rand(30, 3) # 随机生成30个三维坐标点 hull = ConvexHull(points) for simplex in hull.simplices: print(simplex) ``` 这段代码将会打印出构成凸包表面的所有三角形单元对应的索引列表。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值