开源基准测试模拟器:BlueROV2 水下机器人的控制(参考轨迹修改)

        论文中所述,定桩为直径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倍后,轨迹比较吻合。

参考轨迹(黄)和实际轨迹(红)图 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仗剑走代码

“您的支持是我创作的动力”

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值