1.1.1、初始配置、目标配置和无人机模型定义
- 我们把无人机考虑成一个具有一定体积的智能体,不考虑其具体动力学特性, 仅仅将其视为一个具有一定体积的、可自主移动的圆球。智能体之间不能接 触、碰撞。
- 智能体是同质的、可互换的、匿名的,所有个体性质都是相同的,唯一的不 同只有其所处的环境不同或者说其运动状态不同,除此之外,没有任何特殊 性,匿名性也导致智能体无法依靠 ID 分辨其他个体。且个体具有无记忆性, 无法记录上一步的行为或者决策。
- 智能体拥有相同的笛卡尔坐标系统,且目标多边形位置是固定已知的,没个 无人机均有记录均匀多边形的几个顶点位置。
- 忽略通信细节,不考虑通信时延和定位精度问题,每个智能体均可准确知道 其他任何个体位置,实际上仿真实验中只用到局部其他个体的位置信息。
- 智能体有两种状态,静止和激活状态,静止即为保持位置不变化,但仍然会 与外界保持沟通;激活状态则是智能体主动判断自身所处位置,根据环境做 出决策,然后执行决策。仿真时,智能体默认保持静止,激活是异步进行的, 同一时间只考虑激活一个个体,激活个体随机选择,依次达到对现实运行的 仿真。
1.2.1、多边形形成控制算法约束条件
算法设计之先,我们需要给出一些智能体运动约束条件: 1)智能体之间不能碰撞,更不能重合,设定智能体之间最小间距为 d。 2)本文所设计控制算法不涉及具体控制率,每个个体移动速度相同,表现在算法中则是每个个体每次激活时移动的距离小于等于 D。
步骤一 :抵达多边形
"""
Vertex_Position 表示多边形顶点坐标列表、detect 表示函数检测最近顶点 detect_occupy 表示
函数检测顶点是否被占领、move 表示函数移动、get 表示函数通信索要排队序号,adjust 表示目标
"""
def function1(Vertex_Position = Vertex_Position):
nearest_point = detect(Vertex_Position)
#检测最近多边形顶点位置
if !detect_occupy(nearest_point):
#如果检测到该顶点没被占领
move(nearest_point)
#移向目标顶点
else:
order = get(occupy_ID)
#向占领的智能体索要当前排队序号
if order:
adjust_aim = adjust(order)
#根据排队序号调整自己的目标位置
else:
Vertex_Position = Vertex_Position.remove(nearest_point)
return functions(Vertex_Position)
#索要排序号失败则移除顶点列表中的最近顶点,
#并再次调用决策函数
return None
步骤二 :均匀化
"""
def function2():
pre_index ,next_index = detect_neighbor()
#检测前后相邻个体在均匀多边形链表上的索引
aim = ((pre_index+next_index)/2 + my_index)/2
#aim 为前后相邻个体的中点与自身位置的中点
move(aim)
#往目标位置移动
注:detect_neighbor()表示函数检测多边形上前后相邻个体
代码见 done/plgsim.py
由于本科时候太菜了,自己写的代码自己都不想去维护。
为了读者阅读方便,尝试重构代码(见ToDo
),
基本框架已经搭起来了,但策略迁移工作量太多了,
又是毕业之际,暂时保留再做,感兴趣的小伙伴也也可以提出代码合并哈。
- https://blog.csdn.net/py431382/article/details/89854176?spm=1001.2014.3001.5501
- https://www.bilibili.com/video/BV1PE41117m6?spm_id_from=333.999.0.0
https://www.bilibili.com/video/BV1PE41117DG
代码待整理上传