水下航行器(NMPC)非线性模型预测控制分布式轨迹跟踪复现之旅
【复现】水下航行器(NMPC)非线性模型预测控制分布式轨迹跟踪 复现文献1: 《Distributed implementation of nonlinear model predictive control for AUV trajectory tracking》 复现文献2: 《Modified C/GMRES Algorithm for Fast Nonlinear Model Predictive Tracking Control of AUVs》 1、利用水下机器人运动的动态特性,提出了一种新的分布式NMPC算法。 通过适当地将原始优化问题分解为更小的子问题,然后以分布式方式解决它们,可以显著减少预期的浮点操作(flops)。 2、证明了在分解子问题中所提出的收缩约束可以保证AUV轨迹的收敛性。 证明了该方法的递推可行性和闭环稳定性。 利用保证的稳定性,进一步开发了一种实时分布式实现算法,在控制性能和计算复杂度之间进行自动权衡。 对FalconAUV模型的大量仿真研究证明了该方法的有效性和鲁棒楚

最近在研究水下航行器的控制问题,把目光聚焦在了非线性模型预测控制(NMPC)的分布式轨迹跟踪上,这就涉及到两篇超有价值的文献:《Distributed implementation of nonlinear model predictive control for AUV trajectory tracking》以及《Modified C/GMRES Algorithm for Fast Nonlinear Model Predictive Tracking Control of AUVs》。
一、新分布式NMPC算法的核心思路
水下机器人运动的动态特性那可是相当复杂,但基于此,研究者提出了一种全新的分布式NMPC算法。简单来说,就是把原本那个复杂的优化问题巧妙地拆解成一个个更小的子问题,再以分布式的方式去逐个击破。这样做的好处可大了,预期的浮点操作(flops)会大幅减少,这对于提升计算效率那是立竿见影的。

打个比方,如果原始优化问题是要把一座大山挪走,那新算法就是把这座山分成了一个个小土堆,然后找好多人一起,同时去搬走这些小土堆,效率自然就高了。
二、算法关键要点的实现
1. 子问题分解
在代码实现上,我们可以先定义原始优化问题的相关参数,比如:
# 定义原始优化问题的参数
num_states = 5 # 假设状态变量数量
num_control = 3 # 假设控制变量数量
horizon = 10 # 预测时域
# 初始化状态和控制变量的数组
states = np.zeros((num_states, horizon + 1))
controls = np.zeros((num_control, horizon))
这里我们初始化了状态和控制变量的数组,用于后续的计算。接下来,就是对原始问题进行分解:
# 子问题分解示例
subproblem_size = 3
num_subproblems = int(np.ceil(horizon / subproblem_size))
subproblems_states = []
subproblems_controls = []
for i in range(num_subproblems):
start = i * subproblem_size
end = min((i + 1) * subproblem_size, horizon)
sub_states = states[:, start:end + 1]
sub_controls = controls[:, start:end]
subproblems_states.append(sub_states)
subproblems_controls.append(sub_controls)
这段代码将预测时域按一定大小划分成了多个子问题,每个子问题都有对应的状态和控制变量。
2. 收缩约束与收敛性证明
在分解子问题的时候,收缩约束可起着关键作用,它能保证AUV轨迹的收敛性。虽然数学证明过程比较复杂,但简单理解就是给每个子问题设定一些规则,让它们的解最终都能朝着我们期望的方向发展,保证整个轨迹不会跑偏。

在代码里,我们可以通过添加一些条件判断和约束计算来实现收缩约束:
# 收缩约束实现示例
shrinking_factor = 0.95
for i in range(num_subproblems):
sub_states = subproblems_states[i]
sub_controls = subproblems_controls[i]
# 根据收缩约束条件更新子状态和子控制变量
sub_states[:, 1:] = shrinking_factor * sub_states[:, 1:]
sub_controls[:, :] = shrinking_factor * sub_controls[:, :]
subproblems_states[i] = sub_states
subproblems_controls[i] = sub_controls
这里简单地用一个收缩因子对每个子问题的状态和控制变量进行了调整,模拟收缩约束的作用。
三、递推可行性与闭环稳定性证明
证明递推可行性和闭环稳定性也是这个算法的重要部分。递推可行性就是说在每个时间步,优化问题都有解,不会出现算不下去的情况;闭环稳定性则保证了系统在运行过程中不会失控。这两者结合起来,为算法的可靠性提供了坚实的保障。

【复现】水下航行器(NMPC)非线性模型预测控制分布式轨迹跟踪 复现文献1: 《Distributed implementation of nonlinear model predictive control for AUV trajectory tracking》 复现文献2: 《Modified C/GMRES Algorithm for Fast Nonlinear Model Predictive Tracking Control of AUVs》 1、利用水下机器人运动的动态特性,提出了一种新的分布式NMPC算法。 通过适当地将原始优化问题分解为更小的子问题,然后以分布式方式解决它们,可以显著减少预期的浮点操作(flops)。 2、证明了在分解子问题中所提出的收缩约束可以保证AUV轨迹的收敛性。 证明了该方法的递推可行性和闭环稳定性。 利用保证的稳定性,进一步开发了一种实时分布式实现算法,在控制性能和计算复杂度之间进行自动权衡。 对FalconAUV模型的大量仿真研究证明了该方法的有效性和鲁棒楚

从代码角度,我们可以通过一些反馈机制来体现闭环稳定性,比如:
# 闭环稳定性反馈示例
# 假设已经有了预测的下一状态
next_state_predicted = predict_next_state(current_state, control)
# 根据实际状态和预测状态的差异进行反馈调整
error = current_state - next_state_predicted
control = control + feedback_gain * error
这段代码展示了根据预测状态和实际状态的误差来调整控制变量,以此维持闭环系统的稳定性。
四、实时分布式实现算法
基于保证的稳定性,又开发出了实时分布式实现算法,这个算法可厉害了,它能在控制性能和计算复杂度之间自动权衡。想象一下,就像一个智能管家,根据实际情况来合理分配资源,既能保证水下航行器的控制效果,又不会让计算资源浪费。

具体实现时,我们可以结合多线程或者分布式计算框架来模拟实时分布式的效果:
import threading
# 定义子问题计算函数
def solve_subproblem(subproblem_index):
sub_states = subproblems_states[subproblem_index]
sub_controls = subproblems_controls[subproblem_index]
# 这里进行子问题的具体求解
result = solve_sub(sub_states, sub_controls)
subproblems_states[subproblem_index] = result['states']
subproblems_controls[subproblem_index] = result['controls']
# 创建并启动线程
threads = []
for i in range(num_subproblems):
t = threading.Thread(target=solve_subproblem, args=(i,))
threads.append(t)
t.start()
# 等待所有线程完成
for t in threads:
t.join()
这段代码利用Python的多线程来模拟分布式计算子问题,不同的线程同时处理不同的子问题,大大提高了计算效率。
五、仿真验证
最后,通过对FalconAUV模型进行大量的仿真研究,证明了这种方法的有效性和鲁棒性。在仿真中,我们可以设置各种不同的初始条件和环境干扰,看看算法的表现如何。
# 仿真示例
# 设定不同的初始状态
initial_states = [np.random.randn(num_states) for _ in range(10)]
for initial_state in initial_states:
states[:, 0] = initial_state
# 运行算法
run_nmpc_algorithm()
# 检查轨迹是否收敛,控制性能是否达标等
check_performance()
这段代码通过设置多个不同的初始状态来运行算法,检查算法在不同情况下的性能表现。

通过这次复现,对水下航行器的分布式NMPC轨迹跟踪有了更深入的理解,同时也感受到了算法设计和实现过程中的种种挑战与乐趣。希望这篇博文能给同样在研究相关领域的小伙伴们一些启发。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)