轨迹跟踪PID相关及前馈引入结果对比

1、前言:

        记录下给定一段轨迹如何实现跟踪控制,主要使用几个经典的方法进行对比。一些讨论的部分在代码中的注释部分。

        前馈控制可以在没有扰动和建模误差的理想条件下很好地跟踪期望输出,但在实际系统中,由于存在建模误差、外部扰动和初始条件误差,前馈控制无法完全消除系统误差。通常,前馈控制与反馈控制结合使用,通过反馈控制来补偿和校正误差,从而实现更精确和鲁棒的控制系统。

2、代码

% 参数设置
dt = 0.01;
T = 10;
time = 0:dt:T;

% 期望轨迹
x_d = cos(time); % x轨迹
y_d = sin(time); % y轨迹
z_d = 0.5 * time; % z轨迹

% 初始化位置
x_ff = zeros(size(time));
y_ff = zeros(size(time));
z_ff = zeros(size(time));

x_fb = zeros(size(time));
y_fb = zeros(size(time));
z_fb = zeros(size(time));

x_fffb = zeros(size(time));
y_fffb = zeros(size(time));
z_fffb = zeros(size(time));

x_pid = zeros(size(time));
y_pid = zeros(size(time));
z_pid = zeros(size(time));

x_apid = zeros(size(time));
y_apid = zeros(size(time));
z_apid = zeros(size(time));

x_apid_ff = zeros(size(time));
y_apid_ff = zeros(size(time));
z_apid_ff = zeros(size(time));
% x_apid_ff(1) = 1;

% PID参数
Kp = [20, 20, 20];
Ki = [0.1, 0.1, 0.1];
Kd = [0.01, 0.01, 0.01];

% 自适应PID参数
alpha = [20, 20, 20]; % 更新系数,控制参数的调整速度

% 初始点位置,说明初始误差的情况
x_ff(1)=.5;
x_fb(1) = .5;
x_fffb(1) = .5;
x_pid(1) = .5;
x_apid(1) = .5;
x_apid_ff(1)=.5;

% 初始化PID变量
integrated_error = [0, 0, 0];
previous_error = [0, 0, 0];


% 前馈控制
x_velocity_d = gradient(x_d, dt);%输出 FX 对应于 ∂F/∂x,即 x(水平)方向上的差分--近似导数--离散数据的梯度,way2---和diff(x_d) / dt同.但有较小误差
y_velocity_d = gradient(y_d, dt);
z_velocity_d = gradient(z_d, dt);
%{
% 数据: 说明gradient与diff使用之间的差别。diff由于是前向差分所以少一个数据。
x = 0:0.1:10;
y = sin(x);

% 使用 gradient 计算梯度
dydx_gradient = gradient(y, 0.1);

% 使用 diff 计算差分
dydx_diff = diff(y) / 0.1;
x_diff = x(1:end-1);

% 绘图
figure;
plot(x, y, 'r', 'LineWidth', 2); hold on;
plot(x, dydx_gradient, 'b--', 'LineWidth', 2);
plot(x_diff, dydx_diff, 'g-.', 'LineWidth', 2);
xlabel('X');
ylabel('Y and dY/dX');
legend('y = sin(x)', 'Gradient dy/dx', 'Diff dy/dx');
title('Comparison of Gradient and Diff');
grid on;

%}

for t = 1:length(time)-1
    % 前馈控制信号: 期望轨迹求导数way1;前馈输入为位置轨迹的差分或梯度
    % control_signal_x = -sin(time(t));
    % control_signal_y = cos(time(t));
    % control_signal_z = 0.5;
    % way2
% 获取期望速度(即前馈控制输入)way2
control_signal_x = x_velocity_d(t);
control_signal_y = y_velocity_d(t); 
control_signal_z =z_velocity_d(t);

    % 更新位置
    x_ff(t+1) = x_ff(t) + control_signal_x * dt;
    y_ff(t+1) = y_ff(t) + control_signal_y * dt;
    z_ff(t+1) = z_ff(t) + control_signal_z * dt;
end

% 反馈控制
for t = 1:length(time)-1
    % 当前误差
    error_x = x_d(t) - x_fb(t);
    error_y = y_d(t) - y_fb(t);
    error_z = z_d(t) - z_fb(t);

    % 反馈控制信号
    control_signal_x = Kp(1) * error_x;
    control_signal_y = Kp(2) * error_y;
    control_signal_z = Kp(3) * error_z;

    % 更新位置
    x_fb(t+1) = x_fb(t) + control_signal_x * dt;
    y_fb(t+1) = y_fb(t) + control_signal_y * dt;
    z_fb(t+1) = z_fb(t) + control_signal_z * dt;
end

% 前馈+反馈控制仅仅比例控制
for t = 1:length(time)-1
    % 当前误差
    error_x = x_d(t) - x_fffb(t);
    error_y = y_d(t) - y_fffb(t);
    error_z = z_d(t) - z_fffb(t);

    % 前馈控制信号:期望轨迹求导数way1的方式进行。
    feedforward_x = -sin(time(t));
    feedforward_y = cos(time(t));
    feedforward_z = 0.5;

    % 反馈控制信号
    feedback_x = Kp(1) * error_x;
    feedback_y = Kp(2) * error_y;
    feedback_z = Kp(3) * error_z;

    % 综合控制信号
    control_signal_x = feedforward_x + feedback_x;
    control_signal_y = feedforward_y + feedback_y;
    control_signal_z = feedforward_z + feedback_z;

    % 更新位置
    x_fffb(t+1) = x_fffb(t) + control_signal_x * dt;
    y_fffb(t+1) = y_fffb(t) + control_signal_y * dt;
    z_fffb(t+1) = z_fffb(t) + control_signal_z * dt;
end

% PID控制
for t = 1:length(time)-1
    % 当前误差
    error_x = x_d(t) - x_pid(t);
    error_y = y_d(t) - y_pid(t);
    error_z = z_d(t) - z_pid(t);

    % 积分误差
    integrated_error(1) = integrated_error(1) + error_x * dt;
    integrated_error(2) = integrated_error(2) + error_y * dt;
    integrated_error(3) = integrated_error(3) + error_z * dt;

    % 导数误差
    derivative_error_x = (error_x - previous_error(1)) / dt;
    derivative_error_y = (error_y - previous_error(2)) / dt;
    derivative_error_z = (error_z - previous_error(3)) / dt;

    % PID控制信号
    control_signal_x = Kp(1) * error_x + Ki(1) * integrated_error(1) + Kd(1) * derivative_error_x;
    control_signal_y = Kp(2) * error_y + Ki(2) * integrated_error(2) + Kd(2) * derivative_error_y;
    control_signal_z = Kp(3) * error_z + Ki(3) * integrated_error(3) + Kd(3) * derivative_error_z;

    % 更新位置
    x_pid(t+1) = x_pid(t) + control_signal_x * dt;
    y_pid(t+1) = y_pid(t) + control_signal_y * dt;
    z_pid(t+1) = z_pid(t) + control_signal_z * dt;

    % 更新前一个误差
    previous_error = [error_x, error_y, error_z];
end

% 自适应PID控制
for t = 1:length(time)-1
    % 当前误差
    error_x = x_d(t) - x_apid(t);
    error_y = y_d(t) - y_apid(t);
    error_z = z_d(t) - z_apid(t);

    % 自适应PID参数
    adaptive_Kp = Kp + alpha .* abs([error_x, error_y, error_z]);

    % 积分误差
    integrated_error(1) = integrated_error(1) + error_x * dt;
    integrated_error(2) = integrated_error(2) + error_y * dt;
    integrated_error(3) = integrated_error(3) + error_z * dt;

    % 导数误差
    derivative_error_x = (error_x - previous_error(1)) / dt;
    derivative_error_y = (error_y - previous_error(2)) / dt;
    derivative_error_z = (error_z - previous_error(3)) / dt;

    % 自适应PID控制信号
    control_signal_x = adaptive_Kp(1) * error_x + Ki(1) * integrated_error(1) + Kd(1) * derivative_error_x;
    control_signal_y = adaptive_Kp(2) * error_y + Ki(2) * integrated_error(2) + Kd(2) * derivative_error_y;
    control_signal_z = adaptive_Kp(3) * error_z + Ki(3) * integrated_error(3) + Kd(3) * derivative_error_z;

    % 更新位置
    x_apid(t+1) = x_apid(t) + control_signal_x * dt;
    y_apid(t+1) = y_apid(t) + control_signal_y * dt;
    z_apid(t+1) = z_apid(t) + control_signal_z * dt;

    % 更新前一个误差
    previous_error = [error_x, error_y, error_z];
end

%通过前馈控制提供初始控制信号,减少误差的产生;通过反馈控制修正剩余误差
% 自适应PID+前馈控制

% Ki=diag(zeros(3))';Kd=zeros(1,3);
% %此部分注释掉之后,只剩自适应P控制+前馈,效果要好于自适应PID+前馈和固定P反馈控制+前馈控制
%这是因为由于前馈控制的引入已经将误差引入到较小情况,而较小的误差时,ID控制反而会对误差处理有较大影响
% 应在不同的使积分和微分部分在特定情况下起作用,比如误差较大或较小时分别调整不同的权重。
% 前馈控制提供了基于期望轨迹的初始控制信号,若前馈控制信号已经较好地接近实际需求,比例控制的适应性调整就足够了。
% 而PID控制中的积分和微分部分可能会对前馈信号进行不必要的修正,反而影响效果。
for t = 1:length(time)-1
    % 当前误差
    error_x = x_d(t) - x_apid_ff(t);
    error_y = y_d(t) - y_apid_ff(t);
    error_z = z_d(t) - z_apid_ff(t);

    % 自适应PID参数
    adaptive_Kp = Kp + alpha .* abs([error_x, error_y, error_z]);

    % 积分误差
    integrated_error(1) = integrated_error(1) + error_x * dt;
    integrated_error(2) = integrated_error(2) + error_y * dt;
    integrated_error(3) = integrated_error(3) + error_z * dt;

    % 导数误差
    derivative_error_x = (error_x - previous_error(1)) / dt;
    derivative_error_y = (error_y - previous_error(2)) / dt;
    derivative_error_z = (error_z - previous_error(3)) / dt;

    % 自适应PID控制信号
    control_signal_x = adaptive_Kp(1) * error_x + Ki(1) * integrated_error(1) + Kd(1) * derivative_error_x;
    control_signal_y = adaptive_Kp(2) * error_y + Ki(2) * integrated_error(2) + Kd(2) * derivative_error_y;
    control_signal_z = adaptive_Kp(3) * error_z + Ki(3) * integrated_error(3) + Kd(3) * derivative_error_z;

    % 前馈控制信号
    feedforward_x = -sin(time(t));
    feedforward_y = cos(time(t));
    feedforward_z = 0.5;

    % 综合控制信号
    control_signal_x = feedforward_x + control_signal_x;
    control_signal_y = feedforward_y + control_signal_y;
    control_signal_z = feedforward_z + control_signal_z;

    % 更新位置
    x_apid_ff(t+1) = x_apid_ff(t) + control_signal_x * dt;
    y_apid_ff(t+1) = y_apid_ff(t) + control_signal_y * dt;
    z_apid_ff(t+1) = z_apid_ff(t) + control_signal_z * dt;

    % 更新前一个误差
    previous_error = [error_x, error_y, error_z];
end

% 自适应PID+前馈控制---上一部分的修改,用于根据误差动态调整对微分和积分控制,稍微比前面的自适应PID好,效果是误差在前馈+反馈P控制附近震荡
% previous_error = [0; 0; 0];
% integrated_error = [0; 0; 0];
% 
% for t = 1:length(time)-1
%     % 当前误差
%     error_x = x_d(t) - x_apid_ff(t);
%     error_y = y_d(t) - y_apid_ff(t);
%     error_z = z_d(t) - z_apid_ff(t);
% 
%     % 自适应PID参数
%     adaptive_Kp = Kp + alpha .* abs([error_x, error_y, error_z]);
% 
%     % 积分误差,条件限制积分项。使积分和微分部分在特定情况下起作用,比如误差较大或较小时分别调整不同的权重。
%     if abs(error_x) < 0.1
%         integrated_error(1) = integrated_error(1) + error_x * dt;
%     end
%     if abs(error_y) < 0.1
%         integrated_error(2) = integrated_error(2) + error_y * dt;
%     end
%     if abs(error_z) < 0.1
%         integrated_error(3) = integrated_error(3) + error_z * dt;
%     end
% 
%     % 导数误差,使用平滑处理
%     derivative_error_x = (error_x - previous_error(1)) / dt;
%     derivative_error_y = (error_y - previous_error(2)) / dt;
%     derivative_error_z = (error_z - previous_error(3)) / dt;
%     derivative_error_x = lowpass(derivative_error_x, 0.1, 1/dt); % 低通滤波
%     derivative_error_y = lowpass(derivative_error_y, 0.1, 1/dt);
%     derivative_error_z = lowpass(derivative_error_z, 0.1, 1/dt);
% 
%     % 自适应PID控制信号
%     control_signal_x = adaptive_Kp(1) * error_x + Ki(1) * integrated_error(1) + Kd(1) * derivative_error_x;
%     control_signal_y = adaptive_Kp(2) * error_y + Ki(2) * integrated_error(2) + Kd(2) * derivative_error_y;
%     control_signal_z = adaptive_Kp(3) * error_z + Ki(3) * integrated_error(3) + Kd(3) * derivative_error_z;
% 
%     % 前馈控制信号
%     feedforward_x = -sin(time(t));
%     feedforward_y = cos(time(t));
%     feedforward_z = 0.5;
% 
%     % 综合控制信号
%     control_signal_x = feedforward_x + control_signal_x;
%     control_signal_y = feedforward_y + control_signal_y;
%     control_signal_z = feedforward_z + control_signal_z;
% 
%     % 更新位置
%     x_apid_ff(t+1) = x_apid_ff(t) + control_signal_x * dt;
%     y_apid_ff(t+1) = y_apid_ff(t) + control_signal_y * dt;
%     z_apid_ff(t+1) = z_apid_ff(t) + control_signal_z * dt;
% 
%     % 更新前一个误差
%     previous_error = [error_x, error_y, error_z];
% end


% 绘制轨迹比较
figure;
plot3(x_d, y_d, z_d, 'r', 'LineWidth', 2); hold on;
plot3(x_ff, y_ff, z_ff, 'b--', 'LineWidth', 2);
plot3(x_fb, y_fb, z_fb, 'g--', 'LineWidth', 2);
plot3(x_fffb, y_fffb, z_fffb, 'k--', 'LineWidth', 2);
plot3(x_pid, y_pid, z_pid, 'c--', 'LineWidth', 2);
plot3(x_apid, y_apid, z_apid, 'm--', 'LineWidth', 2);
plot3(x_apid_ff, y_apid_ff,z_apid_ff, 'k:', 'LineWidth', 2); % 自适应PID+前馈
xlabel('X');
ylabel('Y');
zlabel('Z');
legend('Desired', 'Feedforward', 'Feedback', 'Feedforward+Feedback', 'PID', 'Adaptive PID', 'Adaptive PID+Feedforward');
title('3D Trajectory Tracking Comparison');
grid on;

% 计算误差
error_ff = sqrt((x_d - x_ff).^2 + (y_d - y_ff).^2 + (z_d - z_ff).^2);
error_fb = sqrt((x_d - x_fb).^2 + (y_d - y_fb).^2 + (z_d - z_fb).^2);
error_fffb = sqrt((x_d - x_fffb).^2 + (y_d - y_fffb).^2 + (z_d - z_fffb).^2);
error_pid = sqrt((x_d - x_pid).^2 + (y_d - y_pid).^2 + (z_d - z_pid).^2);
error_apid = sqrt((x_d - x_apid).^2 + (y_d - y_apid).^2 + (z_d - z_apid).^2);
error_apid_ff = sqrt((x_d - x_apid_ff).^2 + (y_d - y_apid_ff).^2 + (z_d - z_apid_ff).^2);

% 绘制误差比较
figure;
plot(time, error_ff, 'b', 'LineWidth', 2); hold on;
plot(time, error_fb, 'g', 'LineWidth', 2);
plot(time, error_fffb, 'k', 'LineWidth', 2);
plot(time, error_pid, 'c', 'LineWidth', 2);
plot(time, error_apid, 'm', 'LineWidth', 2);
plot(time, error_apid_ff, 'k:', 'LineWidth', 2); % 自适应PID+前馈
xlabel('Time');
ylabel('Error');
legend('Feedforward', 'Feedback', 'Feedforward+Feedback', 'PID', 'Adaptive PID', 'Adaptive PID+Feedforward');
title('Error Comparison');
grid on;

3、结果【前馈的引入效果好很多】

4、其他参考学习链接
什么是前馈控制?_哔哩哔哩_bilibili

只用PID?加上前馈解决95%的问题!_哔哩哔哩_bilibili

PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现_前馈补偿 c语言-CSDN博客

PID算法-从单级PID到单神经元自适应PID控制器 - 任囧 - 博客园 (cnblogs.com)

线性二次型调节器(LQR)原理详解-CSDN博客

前馈控制与MPC - Henry的博客 | Henry Blog (ldylab.cc)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/748811.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全入门必选:十款免费的抓包工具有哪些?

下面给大家推荐几款好用的免费的抓包工具软件&#xff0c;有需要的小伙伴们来了解一下。 1. Wireshark抓包分析工具 4.0.1 Wireshark是一款功能强大的网络协议分析器&#xff0c;可以实时检测和抓取网络通讯数据。它支持多种协议和媒体类型&#xff0c;并具备丰富的显示过滤…

汇凯金业:如何正确做黄金趋势单

炒黄金过程中&#xff0c;如何准确把握趋势并顺势而为&#xff0c;是大多数投资者面临的普遍问题。专家们经常强调顺势而为的重要性&#xff0c;但具体应如何操作&#xff0c;许多投资者仍然存在疑惑。本文将从五个关键策略入手&#xff0c;为您详细解析黄金趋势单的操作方法&a…

基于Python学生成绩管理系统详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

Flutter 小技巧之为什么推荐 Widget 使用 const

今天收到这个问题&#xff0c;本来想着简单回复下&#xff0c;但是感觉这个话题又可以稍微展开讲讲&#xff0c;干脆就整理成一篇简单的科普&#xff0c;这样也能更方便清晰地回答这个问题。 聊这个问题之前&#xff0c;我们需要把一个“老生常谈”的概念拿出来说&#xff0c;那…

安宝特方案 | AR眼镜+手套式扫码枪,智能化仓储创新应用

新扫码设备形态&#xff0c;提升工作效率 传统的仓储工作通常依赖人工操作和纸质记录&#xff0c;这不仅耗时又容易出错。 引入穿戴式AR设备和手套式扫码枪后&#xff0c;AR眼镜可以将数字信息直接叠加在视野中&#xff0c;仓储工人只需佩戴设备即可看到货物位置、库存数量和任…

3. 向索引库中导入数据

1. 准备数据库对象 import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstr…

高校外卖点餐系统

摘 要 随着互联网的快速发展&#xff0c;外卖点餐已经成为人们生活中的一部分。为了满足高校学生的需求&#xff0c;本文设计和实现了一个基于Java Web的高校外卖点餐系统。该系统采用B/S架构&#xff0c;使用Java语言和SSM框架进行开发&#xff0c;前端使用Vue框架进行设计。…

idea中使用springboot进行开发时遇到的工程结构问题汇总

idea中的工程结构和eclipse中不同&#xff0c;但是配置的内容都是一样的。 IDEA中也就是这个页面&#xff0c;快捷键ctrlaltshifts 如果在eclipse中&#xff0c;经常会遇到jre和jdk不正确的情况&#xff0c;但IDEA中这个问题很少&#xff0c;但是IDEA中会经常由于未正常配置根…

基于SpringBoot音乐网站与分享平台详细设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全&#xff1…

浅谈逻辑控制器之仅一次控制器

浅谈逻辑控制器之仅一次控制器 “仅一次控制器”(Once Only Controller) 是一个非常实用的组件&#xff0c;它允许用户控制测试计划中的某些操作仅执行一次&#xff0c;无论其所在的线程组或父级控制器设置了多少次循环。本指南将详细介绍“仅一次控制器”的功能、使用场景及配…

RSA非对称加密-openssl命令及C语言实现

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。本文介绍如何使用openssl命令和C代码实现基础的RSA加/解密和签名/验签功能。 一、openssl命令实现RSA加解密 1、生成私钥和公钥 生成私钥 openssl genrsa -out private.key 2048 #…

『Z-Workshop』 6月22日线下ALCOVE分享活动

2024 求是创新 ZJUBCA Sponsored by the ALCOVE Community TIME&#xff1a;2024/06/22 ADD&#xff1a;浙江大学紫金港校区 --- Alcove 是 Aptos 公链与 Alibaba Cloud 共同打造的亚洲首个 Move 开发者社区&#xff0c;致力于支持开发者使用 Move 语言构建下一代 Web3 应用&am…

UE4_材质_水涟漪、水深制作_Ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 效果图如下&#xff1a; 创建水材质的教程&#xff0c;首先需要外出收集一些参考&#xff0c;看一看你将要做的事情很重要&#xff0c;确定将要模仿物体的关键属性&#xff0c;从这…

Java网络编程(JavaWeb的基础)

Java网络编程&#xff08;JavaWeb的基础&#xff09; 文章目录 Java网络编程&#xff08;JavaWeb的基础&#xff09;前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、南…

如何找到正确的网络钓鱼目标

在深入研究联系人收集之前&#xff0c;我们希望确保对可用的攻击面有一个清晰的了解。我见过许多渗透测试者只获取客户端提供的主域&#xff0c;通过 theHarvester、linkedInt、maltego 等运行它&#xff0c;并将输出称为目标列表。在这样做的过程中&#xff0c;这些渗透测试机…

云效BizDevOps上手亲测

云效BizDevOps上手亲测 什么是云效项目协作Projex配置2023业务空间原始诉求字段原始诉求工作流创建原始诉求配置2023产品空间创建主题业务原始诉求关联主题配置2023研发空间新建需求需求关联主题 与传统区别云效开发流程传统开发流程云效BizDevOps 操作体验 什么是云效 在说到…

203. 移除链表元素【链表】【C++】

题目描述 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#x…

Labview_Occurrencel(事件发生)

PS&#xff1a;这里遇到 一个很Low的事情&#xff1a; 在停止第二个while循环的时候出现了停止不了的情况。因为等待事件发生设置的超时时间为:-1。所以等事件发生后出现了条件接线端已经执行的情况&#xff0c;所以当下次事件发生时未能及时停止。初版的停止设置如下图&#x…

AI赋能视频剪辑师:人工智能时代,视频剪辑师该如何剪辑?

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;视频剪辑行业也不例外。在这个全新的时代&#xff0c;AI技术为视频剪辑师带来了前所未有的便利和创新空间。那么&#xff0c;在人工智能时代&#xff0c;视频剪辑师…