论文中所述,定桩为直径6m,深25m的圆筒,现将轨迹修改为直径3.5m,螺旋上升的轨迹,上升高度为25m。使其可以绕柱螺旋上升。由于没有找到原轨迹参数的设置部分,现设计新的变量进行参考轨迹的设计。设置Etext、Ntext、Dtext分别为东、北、下三维向量的参数。
1.参数向量赋值
可直接在MATLAB命令行窗口输入一下命令来赋予Etext、Ntext、Dtext变量的值。
% 参数定义
r = 7/2; % 圆柱半径 (直径7米)
H = 25; % 总深度
n_cycles = 5; % 螺旋圈数
T_total = 100; % 总时间(秒)
Fs = 200; % 采样率(Hz)
% 生成时间序列
t = 0:1/Fs:T_total; % 时间向量(0到T_total秒)
num_points = length(t);
% 计算时间相关的角度参数
theta = 2*pi * n_cycles * t / T_total; % 角度随时间线性增长
% 生成三维坐标的 timeseries 对象(1x1 double 类型)
Etext = timeseries(r * cos(theta), t, 'Name', '东方向');
Ntext = timeseries(r * sin(theta), t, 'Name', '北方向');
Dtext = timeseries(H - (H / T_total) * t, t, 'Name', '深度');
% 设置元数据(可选)
Etext.DataInfo.Units = '米';
Ntext.DataInfo.Units = '米';
Dtext.DataInfo.Units = '米';
Etext.TimeInfo.Units = '秒';
Ntext.TimeInfo.Units = '秒';
Dtext.TimeInfo.Units = '秒';
% 验证 timeseries 属性
disp('Etext 的 timeseries 属性:');
disp(Etext);
disp('Ntext 的 timeseries 属性:');
disp(Ntext);
disp('Dtext 的 timeseries 属性:');
disp(Dtext);
% 可视化(以Etext为例)
% 三维轨迹动画(可选)
figure;
plot3(Etext.Data(:), Ntext.Data(:), Dtext.Data(:), 'k'); hold on;
xlabel('东方向 Etext'); ylabel('北方向 Ntext'); zlabel('深度 Dtext');
title('螺旋路径实时演示');
grid on; view(-30, 30); axis equal;
% 保存到工作区或文件(可选)
assignin('base', 'Etext', Etext);
assignin('base', 'Ntext', Ntext);
assignin('base', 'Dtext', Dtext);
% save('spiral_timeseries.mat', 'Etext', 'Ntext', 'Dtext');
2. 修改起点
修改bluerov起点位置为(0,3.5,25)
3.修改Rate Limitate
原Rate Limitate导致轨迹进行速率限制,从而使我们设置的轨迹发生变化,例如原N方向的上升下降沿限制信号限制为0.2和-0.2。
从而导致我们的参考轨迹输出发生变化。
我们可以修改上下沿限制,例如提高至2和-2。
参考轨迹目前可以正常上传,当前滑膜控制参数下轨迹效果如下
4.偏航方向修改
偏航方向设置为沿参考轨迹方向前进
r = 7/2; % 圆柱半径 (直径7米)
H = 25; % 总深度
n_cycles = 5; % 螺旋圈数
T_total = 100; % 总时间(秒)
Fs = 200; % 采样率(Hz)
% 生成时间序列
t = 0:1/Fs:T_total; % 时间向量(0到T_total秒)
num_points = length(t);
% 计算时间相关的角度参数
theta = 2*pi * n_cycles * t / T_total; % 角度随时间线性增长
% 生成三维坐标的 timeseries 对象
Etext = timeseries(r * cos(theta), t, 'Name', '东方向');
Ntext = timeseries(r * sin(theta), t, 'Name', '北方向');
Dtext = timeseries(H - (H / T_total) * t, t, 'Name', '深度');
% 计算偏航角(Yaw),始终沿轨迹前进,并确保单位为 **弧度**
yaw = -unwrap(atan2(Ntext.Data, Etext.Data)); % 直接使用弧度
Ytext = timeseries(yaw, t, 'Name', '偏航角');
% 设置元数据(可选)
Etext.DataInfo.Units = '米';
Ntext.DataInfo.Units = '米';
Dtext.DataInfo.Units = '米';
Ytext.DataInfo.Units = '弧度'; % 偏航角单位改为弧度
Etext.TimeInfo.Units = '秒';
Ntext.TimeInfo.Units = '秒';
Dtext.TimeInfo.Units = '秒';
Ytext.TimeInfo.Units = '秒';
% 验证 timeseries 属性
disp('Ytext 的 timeseries 属性:');
disp(Ytext);
% 可视化偏航角变化(单位:弧度)
figure;
plot(t(:), Ytext.Data(:), 'r'); % 直接绘制弧度值
xlabel('时间 (s)'); ylabel('偏航角 (rad)');
title('水下机器人沿螺旋轨迹的偏航角变化(弧度)');
grid on;
% 保存到工作区或文件(可选)
assignin('base', 'Etext', Etext);
assignin('base', 'Ntext', Ntext);
assignin('base', 'Dtext', Dtext);
assignin('base', 'Ytext', Ytext);
% save('spiral_timeseries.mat', 'Etext', 'Ntext', 'Dtext', 'Ytext');
5.修改推力上下限
经过多次参数修改,发现轨迹始终含有偏差,查看推力大小发现推力限制导致无法快速进行跟踪轨迹。将推力限制扩大3倍后,轨迹比较吻合。
参考轨迹(黄)和实际轨迹(红)图