19 Star 169 Fork 281

飞行器智能感知与控制 / learn_programming

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 11.87 KB
一键复制 编辑 原始数据 按行查看 历史
布树辉 提交于 2024-03-01 07:51 . update 4_projects/README.md.

综合编程练习项目

完成了前面的编程基础和算法的练习,可以尝试综合运用所学的编程知识去解决一些实际的问题。通过这个综合练习,运用所学的知识解决一个或多个实际的问题,并锻炼系统性解决问题的思路。

1. 基础知识与方法

下面的项目需要图形界面,因此需要学习『Qt』或者『SFML』程序的编写。具体的学习方法可以如下:

  1. 由于综合练习需要学习使用第三方库,而Linux下使用第三方库比较方便,因此建议先花些时间把Linux基本用法学会。具体的教程可以参考: 《Linux教程》
  2. 先看看 《Qt例子程序》 程序,把程序结构、第三方库的用法等学会,然后分析例子程序与自己的程序所需要的功能差距在哪里?如果可以在例子程序的基础上逐步修改得到需要的画图功能,可以一步步从简单画线、画矩形等着手,然后逐步添加更多的功能,直到完成所需的功能为止。
  3. 考虑具体的算法应该是什么样?用什么样的数据结构,用哪种算法类型?开始可以不用想的非常完美,只要能把最基础的功能实现即可,在实现基本功能的情况下通过不断的迭代改进,实现最终所需要的效果。下面的项目,可以先把基本的正向功能实现,就是能人操作能够显示、变化、移动等功能。
  4. 在完成最基本的绘图和操作等功能之后,再考虑如何自己编程序实现电脑找最优的位置落子等。从而实现电脑玩游戏的功能。
  5. 总而言之,不要一上来想一下子做好,而是将项目分解成多个小的任务,通过循环迭代的方式,先把简单的功能实现,然后逐步完成难度更大的功能,最终当一个个问题解决之后再合并起来完成整体的功能。
  6. 这个综合练习,主要的目的是通过学习使用库函数、自己设计数据结构、处理算法,解决一个相对比较完整的项目,学习如何处理一个相对复杂的问题。如果具备了这样的能力,之后学习过程所要做的很多事情都是采用类似的思维和方法,因此能够极大的加速后续的学习效率。

2. 示例项目

可以参看下面所列的,也可以自己想一个去实现。可以先看看示例项目,了解一下要做成什么样子,自己还缺那些知识、技能。

2.1 模拟自动巡线的智能小车

研究如何模拟摄像头的工作原理,构建一个虚拟的环境,在虚拟的地面有黑色的轨迹,通过虚拟相机拍摄的画面,来识别黑色轨迹,然后控制小车的移动。

lane_tracking

具体要求:

  • 需要思考如何模拟环境、地面、黑色轨迹线
  • 需要考虑如何构建小车的模型
  • 使用Qt来编写可视化界面,能够显示仿真环境,相机看到的画面,控制指令等

2.2 无人机路径规划

目前无人机虽然实现了自动飞行,但是大部分的无人机仍不具备感知环境、动态适应环境的能力。本课题通过一步一步实现无人机的感知、路径规划、仿真,通过本项目理解无人机系统的感知、控制。需要设计开发一套仿真、控制系统,具体效果如下图所示。

dynamic_pathplanning.gif

具体要求:

  • 让无人机从红色的起点出发,朝向蓝色的终点飞行,但是事先不知道环境地图(障碍物)的分布
  • 假设无人机上装备了激光雷达,能够探测一定范围内的障碍物信息
  • 在飞行过程探测周围环境,不断完善环境地图,并不断更新规划路径
  • 无人机利用A * 算法规划当前认为可行的路径,绿色的线段
  • 更具体的说明见 无人机路径规划

2.3 编队无人机的集结

研究多架固定翼无人机从任意位置出发,形成编队,如下图的示意。刚开始多架无人机在空中特定的位置盘旋,接收到编队集结命令之后,多架固定翼无人机朝指定的集结地点出发,最终按照相同的速度与方向同时到达。

uav_flightformation

具体要求:

  • 需要考虑固定翼无人机的运行特性,假设无人机的最小转弯半径能够达到300m,其他无人机参数可以自己假设
  • 固定翼无人机的动力学仿真,如果不会可以用简单的模型来仿真,另外可以找相关的程序借鉴。
  • 需要考虑从任意位置到指定集结地点的曲线轨迹
  • 在生成曲线轨迹的基础上,如何生成控制固定翼无人机的飞行指令 (可以用最简单的方式:接下来需要达到的航点,飞行速度),并把飞行指令可视化出来
  • 使用Qt来编写可视化界面,能够可视化固定翼无人机飞行过程的位置变化,机头朝向

2.4 多旋翼无人机自主降落

模拟多旋翼无人机利用视觉定位实现自主降落的仿真系统。

uav_autolanding

主要的内容包括:

  1. 模拟多旋翼无人机运动,可以使用最简单的模型,假设为一个质点
  2. 模拟相机拍摄降落地点的标识,例如一个二维码或ArUco
  3. 如何识别二维码,如何解算相对位姿
  4. 如何控制多旋翼无人机逼近Marker

参考资料:

2.5 集群无人机的4D轨迹规划

编写程序模拟多架无人机在空中编队飞行,在空中展现出不同的形状,例如一字形、人字形等等。

formation

2.6 倒立摆的仿真与控制

研究倒立摆的控制原理,并实现一个图形化的仿真程序。

inverted_pendulum.png

具体要求:

  • 使用Qt编写可视化的界面,能够显示底部的滑动部分,倒立摆,绕动,控制变量等
  • 控制算法的输入、参数等需要设计好
  • 能够在可视化界面,用鼠标等给予饶动

2.7 五子棋程序

如何自己编写一个自动下五子棋的程序,思考编写这样的程序需要什么样的技术,需要什么算法,如何保存棋盘的状态,如何有效判断在何位置下子最好,在实现基本游戏的基础上,研究如何让计算机来自动玩这个游戏。

wuziqi

具体要求:

  • 使用Qt来编写可视化界面,学习Qt的绘图,鼠标操作事件等
  • 为了实现自动下五子棋,是否需要先把基本的五子棋程序实现?
  • 如何显示棋牌?如何保存我方、对方所下的棋子?
  • 研究游戏的基本规则,并编程实现
  • 怎么才能让电脑计算出落子的最优位置?
  • 是否可以实现两个自动下棋的算法,然后让两个算法对弈

2.8 数独程序

如何自己编写一个数独的自动程序。

shudu

  • 如何显示数独的界面?
  • 怎么进行推测,尝试,回退等操作

2.9 俄罗斯方块

研究如何实现一个俄罗斯方块的程序,能够用光标来控制下降,左右移动。在实现基本游戏的基础上,研究如何让计算机来自动玩这个游戏。

tetris

  • 设计游戏界面,如何读取键盘的按键输入
  • 如何实现记分
  • 使用Qt来编写可视化界面,学习Qt的绘图,键盘事件的获取
  • 研究游戏的基本规则,并编程实现
  • 如何判断哪里落方块比较好
  • 研究如何自动来控制方块的下落,并对比分析不同方法的特点

2.10 多旋翼无人机钻圈

识别红色的圈、并结合VINS识别的位置,实现无人机穿红色的圈。可以先实现仿真环境下的运行,然后有条件在真机下实现所有的功能。

image

  • 构思仿真环境的搭建,可以使用Gazebo,或者AirSim
  • 实现识别颜色圆环的代码
  • 根据颜色圆环生成飞行策略
  • 学习MAVROS,控制无人机的飞行
  • 将颜色圆环的识别程序与控制程序整合,实现多旋翼无人机钻圈的功能

3. 关于GUI界面

通过自己查找合适的资料、教程学习如何编写一个图形化的界面,从而方便进行交互。建议的方法是,找到一个类似的实例程序,通过不断的修改,将demo程序改造成你所设想的样子。

4. 代码重构

完成上述一个或者多个小项目的程序编写,并能解决实际问题。大部分情况下,第一次写完的程序,虽然已经实现了功能,但是往往存在如下的问题:

  • 程序命名不规范
  • 逻辑、功能比较混乱,代码不够清晰
  • 文件组织混乱,代码、数据等混杂
  • 程序里有很多固定的路径、常数等,不方便移植,无法在其他人的电脑上运行

为了更进一步提升自己的编程能力,需要通过多次的代码重构提升自己的综合能力。建议仔细阅读《代码重构》,并对自己编写的程序进行改进。

关于代码重构可以借鉴学习如下的项目:

5. 其他练习项目和参考代码

其他练习项目:

可以借鉴如下示例代码进行学习,具体的示例如下:

  • SimpGCS : 一个简单的地面站程序,通过解析MAVLINK协议,将无人机的位置等信息可视化在Qt的地图控件上
  • 简单的路径规划模拟系统 : 提供了一个简单的C++模拟系统,支持地图编辑、路径规划、可视化等功能
  • C++的2D SLAM演示系统 : 一个简单的2D EKF/Fast SLAM演示系统,通过这个演示系统,能够学会如何将算法、Qt GUI结合起来
  • 简单的路径规划模拟系统 : 提供了一个简单的C++模拟系统,支持地图编辑、路径规划、可视化等功能
  • Map2DFusion : 实时二维地图拼接,通过视觉SLAM解算位姿,并增量式拼接二维地图
  • 序列化图像的SfM重建 : 本实例程序演示了如何编写基本的SfM程序,通过利用序列化数据的特点加快重建的速度
C++
1
https://gitee.com/pi-lab/learn_programming.git
git@gitee.com:pi-lab/learn_programming.git
pi-lab
learn_programming
learn_programming
master

搜索帮助