同步操作将从 Aircraft-IS-Design/ Aircraft-Information-System-Design 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
目前无人机虽然实现了自动飞行,但是大部分的无人机仍不具备感知环境、动态适应环境的能力。本课题通过一步一步实现无人机的感知、路径规划、仿真,通过本项目理解无人机系统的感知与控制。
本课题需要实现的效果如下图所示
无人机从红色的起点
出发,朝向蓝色的终点
飞行,但是事先不知道环境地图(障碍物)的分布。
假设无人机上装备了激光雷达,能够探测一定范围内的障碍物信息,如上图所示
当前探测到的障碍物用红色显示
还未探测到的障碍物用灰色显示
已经探测到的障碍物用黑色显示
无人机利用A * 算法规划当前认为可行的路径,绿色的线段
但是随着探测范围扩大,无人机在飞行过程发现,利用之前规划的路线无法达到目标点,则需要重新规划路径
利用上述方法,不断探测障碍物,并不断规划路径,无人机最终到达目标点
本课程设计可分成如下的几个步骤,大家可以按照下面的引导一步一步从简单的功能开始做起,逐步增加功能,最终实现全部功能。
学习《C++编程》,《Qt编程》,或者使用Matlab等编程语言,根据自己的能力和背景知识。
加载地图文件,显示在GUI界面上。可以使用【Qt示例程序 - 画网格】,在这个示例程序的基础上增加功能,从而实现第一步的目标。
示例地图文件见《示例地图》
地图文件的格式是一个二进制文件,文件的结构如下:
地图每个像素的值的定义:
enum RMapItemType
{
RMAP_FREE = 0, // 空白区域
RMAP_OBSTACLE, // 障碍物
RMAP_OBSTACLE_UNDESCOVERED, // 未被发现的障碍物
RMAP_OBSTACLE_SCANNED, // 已被扫描到的障碍物
RMAP_START_POINT, // 起点
RMAP_END_POINT, // 终点
RMAP_CURRENT_POSITION, // 当前点
RMAP_OBSTACLE_EDGE // 障碍物扩展的点
};
地图读取示例程序如下:
int load_map(const char *fname)
{
FILE *fp = NULL;
int res, ret = -1;
uint32_t f_magic;
int32_t m_mx, m_my;
int8_t *m_map;
int32_t m_startX, m_startY, m_endX, m_endY;
// open file
fp = fopen(fname, "rb");
if( fp == NULL ) {
printf("ERR: failed to open file %s!\n", fname);
return -1;
}
// check file magic number
res = fread(&f_magic, sizeof(uint32_t), 1, fp);
if( f_magic != 0x15432345 ) {
printf("ERR: input file format is not correct! %s\n", fname);
goto RMAP_LOAD_RET;
}
// read map nx, ny
res = fread(&m_mx, sizeof(int32_t), 1, fp);
res = fread(&m_my, sizeof(int32_t), 1, fp);
// read map
if( m_map != NULL ) delete [] m_map;
m_map = new int8_t[m_mx*m_my];
res = fread(m_map, sizeof(int8_t), m_mx*m_my, fp);
// read start,end point
res = fread(&m_startX, sizeof(int32_t), 1, fp);
res = fread(&m_startY, sizeof(int32_t), 1, fp);
res = fread(&m_endX, sizeof(int32_t), 1, fp);
res = fread(&m_endY, sizeof(int32_t), 1, fp);
ret = 0;
RMAP_LOAD_RET:
fclose(fp);
return ret;
}
在前面程序的基础上,实现A * 算法,在这个阶段可以假设环境地图都已知,规划全局的地图,并显示在GUI界面上。
在Step1的程序基础上,模拟激光雷达扫描。模拟从当前位置发射多条射线,判断障碍物是否在射线上。把结果显示在在GUI界面上。
在Step2, Step3的成果基础上,设计动态路径的算法,并实现该算法。测试所实现的方法和示例效果的差别,并改进
完成代码编写之后,虽然已经实现了功能,但是往往存在如下的问题:
为了更进一步提升自己的编程能力,需要通过多次的代码重构提升自己的综合能力。建议仔细阅读《代码重构》,并对自己编写的程序进行改进。通过代码重构更进一步提升自己对问题的理解、编程综合能力。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。