具有柔性关节的机械臂MATLAB仿真

news/2025/10/23 11:50:30/文章来源:https://www.cnblogs.com/345QIII/p/19160163

柔性关节机械臂MATLAB仿真方案,包含动力学建模、控制器设计和可视化分析。该方案基于拉格朗日方程建立柔性关节模型,并实现了PD控制、滑模控制和自适应控制三种控制策略。

仿真

%% 柔性关节机械臂仿真 - 完整系统
% 作者: MATLAB技术助手
% 日期: 2023年12月%% 清理工作区
clearvars
close all
clc%% 系统参数定义
% 机械臂物理参数
params.m1 = 1.0;          % 连杆1质量 (kg)
params.m2 = 0.8;          % 连杆2质量 (kg)
params.L1 = 0.5;          % 连杆1长度 (m)
params.L2 = 0.4;          % 连杆2长度 (m)
params.g = 9.81;          % 重力加速度 (m/s^2)% 关节柔性参数
params.K1 = 100;          % 关节1刚度 (N·m/rad)
params.K2 = 80;           % 关节2刚度 (N·m/rad)
params.B1 = 0.5;          % 关节1阻尼 (N·m·s/rad)
params.B2 = 0.4;          % 关节2阻尼 (N·m·s/rad)% 电机参数
params.Jm1 = 0.05;        % 电机1转动惯量 (kg·m^2)
params.Jm2 = 0.03;        % 电机2转动惯量 (kg·m^2)
params.Bm1 = 0.1;         % 电机1阻尼系数 (N·m·s/rad)
params.Bm2 = 0.08;        % 电机2阻尼系数 (N·m·s/rad)% 仿真参数
params.Ts = 0.001;        % 采样时间 (s)
params.Tf = 10;           % 仿真时间 (s)%% 轨迹规划
% 期望轨迹: 圆形轨迹
t = 0:params.Ts:params.Tf;
theta1_d = pi/4 + 0.2*sin(pi*t);
theta2_d = pi/3 + 0.15*cos(pi*t);% 计算期望轨迹的导数和二阶导数
dtheta1_d = [0, diff(theta1_d)/params.Ts];
dtheta2_d = [0, diff(theta2_d)/params.Ts];
ddtheta1_d = [0, diff(dtheta1_d)/params.Ts];
ddtheta2_d = [0, diff(dtheta2_d)/params.Ts];%% 初始化系统状态
% 状态向量: [q_m1, dq_m1, q_m2, dq_m2, q_l1, dq_l1, q_l2, dq_l2]
x = zeros(8, 1);% 存储历史数据
history.time = t;
history.pos_m1 = zeros(size(t));   % 电机1位置
history.pos_m2 = zeros(size(t));   % 电机2位置
history.pos_l1 = zeros(size(t));   % 连杆1位置
history.pos_l2 = zeros(size(t));   % 连杆2位置
history.tau1 = zeros(size(t));     % 关节1扭矩
history.tau2 = zeros(size(t));     % 关节2扭矩
history.error1 = zeros(size(t));   % 连杆1位置误差
history.error2 = zeros(size(t));   % 连杆2位置误差%% 控制器参数
% PD控制器参数
Kp = diag([150, 100]);    % 比例增益
Kd = diag([20, 15]);      % 微分增益% 滑模控制器参数
lambda = diag([5, 3]);    % 滑模面参数
K_smc = diag([50, 30]);   % 滑模增益
phi = 0.1;                % 边界层厚度% 自适应控制器参数
Gamma = diag([0.1, 0.1, 0.1, 0.1, 0.1, 0.1]);  % 自适应增益矩阵
theta_hat = zeros(6, 1);  % 参数估计初始值%% 主仿真循环
for k = 1:length(t)% 当前时间current_time = t(k);% 提取当前状态q_m1 = x(1);   % 电机1位置dq_m1 = x(2);  % 电机1速度q_m2 = x(3);   % 电机2位置dq_m2 = x(4);  % 电机2速度q_l1 = x(5);   % 连杆1位置dq_l1 = x(6);  % 连杆1速度q_l2 = x(7);   % 连杆2位置dq_l2 = x(8);  % 连杆2速度% 计算弹性扭矩tau_spring1 = params.K1*(q_m1 - q_l1) + params.B1*(dq_m1 - dq_l1);tau_spring2 = params.K2*(q_m2 - q_l2) + params.B2*(dq_m2 - dq_l2);% 计算连杆动力学% 连杆位置向量q_l = [q_l1; q_l2];dq_l = [dq_l1; dq_l2];% 计算质量矩阵M(q)M11 = (params.m1 + params.m2)*params.L1^2 + params.m2*params.L2^2 + ...2*params.m2*params.L1*params.L2*cos(q_l2);M12 = params.m2*params.L2^2 + params.m2*params.L1*params.L2*cos(q_l2);M21 = M12;M22 = params.m2*params.L2^2;M = [M11, M12; M21, M22];% 计算科里奥利和向心力矩阵C(q,dq)C12 = -params.m2*params.L1*params.L2*sin(q_l2)*dq_l2;C21 = params.m2*params.L1*params.L2*sin(q_l2)*dq_l1;C = [0, C12; C21, 0];% 计算重力项G(q)G1 = (params.m1 + params.m2)*params.g*params.L1*cos(q_l1) + ...params.m2*params.g*params.L2*cos(q_l1 + q_l2);G2 = params.m2*params.g*params.L2*cos(q_l1 + q_l2);G = [G1; G2];% 连杆动力学方程tau_l = [tau_spring1; tau_spring2];  % 关节扭矩ddq_l = M \ (tau_l - C*dq_l - G);% 电机动力学方程% 控制律选择 (取消注释选择不同的控制器)% tau = PD_control(q_l1, q_l2, dq_l1, dq_l2, theta1_d(k), theta2_d(k), ...%                 dtheta1_d(k), dtheta2_d(k), Kp, Kd);% tau = SMC_control(q_l1, q_l2, dq_l1, dq_l2, theta1_d(k), theta2_d(k), ...%                  dtheta1_d(k), dtheta2_d(k), ddtheta1_d(k), ddtheta2_d(k), ...%                  lambda, K_smc, phi);[tau, theta_hat] = Adaptive_control(q_l1, q_l2, dq_l1, dq_l2, theta1_d(k), theta2_d(k), ...dtheta1_d(k), dtheta2_d(k), ddtheta1_d(k), ddtheta2_d(k), ...theta_hat, Gamma, params);% 电机动力学ddq_m1 = (tau(1) - params.Bm1*dq_m1 - tau_spring1) / params.Jm1;ddq_m2 = (tau(2) - params.Bm2*dq_m2 - tau_spring2) / params.Jm2;% 更新状态向量dx = [dq_m1; ddq_m1; dq_m2; ddq_m2; dq_l1; ddq_l(1); dq_l2; ddq_l(2)];% 欧拉积分x = x + dx * params.Ts;% 存储数据history.pos_m1(k) = x(1);history.pos_m2(k) = x(3);history.pos_l1(k) = x(5);history.pos_l2(k) = x(7);history.tau1(k) = tau(1);history.tau2(k) = tau(2);history.error1(k) = theta1_d(k) - x(5);history.error2(k) = theta2_d(k) - x(7);
end%% 控制律函数定义
% PD控制器
function tau = PD_control(q1, q2, dq1, dq2, q1_d, q2_d, dq1_d, dq2_d, Kp, Kd)e1 = q1_d - q1;e2 = q2_d - q2;de1 = dq1_d - dq1;de2 = dq2_d - dq2;tau = Kp*[e1; e2] + Kd*[de1; de2];
end% 滑模控制器
function tau = SMC_control(q1, q2, dq1, dq2, q1_d, q2_d, dq1_d, dq2_d, ddq1_d, ddq2_d, lambda, K, phi)e1 = q1_d - q1;e2 = q2_d - q2;de1 = dq1_d - dq1;de2 = dq2_d - dq2;% 滑模面s1 = lambda(1,1)*e1 + de1;s2 = lambda(2,2)*e2 + de2;s = [s1; s2];% 饱和函数代替符号函数sat_s1 = min(max(s1/phi, -1), 1);sat_s2 = min(max(s2/phi, -1), 1);sat_s = [sat_s1; sat_s2];% 等效控制 + 切换控制tau_eq = [ddq1_d; ddq2_d] + lambda*[de1; de2];tau_sw = K*sat_s;tau = tau_eq + tau_sw;
end% 自适应控制器
function [tau, theta_hat] = Adaptive_control(q1, q2, dq1, dq2, q1_d, q2_d, ...dq1_d, dq2_d, ddq1_d, ddq2_d, ...theta_hat, Gamma, params)% 轨迹跟踪误差e1 = q1_d - q1;e2 = q2_d - q2;de1 = dq1_d - dq1;de2 = dq2_d - dq2;% 参考轨迹lambda = diag([5, 3]);  % 滑模面参数dqr = [dq1_d; dq2_d] + lambda*[e1; e2];ddqr = [ddq1_d; ddq2_d] + lambda*[de1; de2];% 回归矩阵Y的估计 (简化的线性参数化形式)Y11 = ddqr(1);Y12 = ddqr(2);Y13 = (2*ddqr(1) + ddqr(2))*cos(q2) - (2*dqr(1)*dq2 + dqr(2)*dq2)*sin(q2) + ...params.g*cos(q1);Y14 = ddqr(1) + ddqr(2);Y15 = dqr(1);Y16 = 0;Y21 = 0;Y22 = ddqr(1) + ddqr(2);Y23 = ddqr(1)*cos(q2) + dqr(1)^2*sin(q2) + params.g*cos(q1+q2);Y24 = ddqr(2);Y25 = 0;Y26 = dqr(2);Y = [Y11, Y12, Y13, Y14, Y15, Y16;Y21, Y22, Y23, Y24, Y25, Y26];% 控制律Kd = diag([20, 15]);  % 阻尼矩阵v = [de1; de2] + lambda*[e1; e2];tau = Y*theta_hat + Kd*v;% 参数更新律dtheta_hat = Gamma * Y' * v;theta_hat = theta_hat + dtheta_hat * params.Ts;
end%% 结果可视化
% 位置跟踪性能
figure('Position', [100, 100, 1200, 800])
subplot(2,2,1)
plot(history.time, rad2deg(history.pos_l1), 'b', 'LineWidth', 1.5)
hold on
plot(history.time, rad2deg(theta1_d), 'r--', 'LineWidth', 1.5)
title('关节1位置跟踪')
xlabel('时间 (s)')
ylabel('角度 (deg)')
legend('实际位置', '期望位置')
grid onsubplot(2,2,2)
plot(history.time, rad2deg(history.pos_l2), 'b', 'LineWidth', 1.5)
hold on
plot(history.time, rad2deg(theta2_d), 'r--', 'LineWidth', 1.5)
title('关节2位置跟踪')
xlabel('时间 (s)')
ylabel('角度 (deg)')
legend('实际位置', '期望位置')
grid on% 跟踪误差
subplot(2,2,3)
plot(history.time, rad2deg(history.error1), 'm', 'LineWidth', 1.5)
title('关节1跟踪误差')
xlabel('时间 (s)')
ylabel('误差 (deg)')
grid on
ylim([-2, 2])subplot(2,2,4)
plot(history.time, rad2deg(history.error2), 'm', 'LineWidth', 1.5)
title('关节2跟踪误差')
xlabel('时间 (s)')
ylabel('误差 (deg)')
grid on
ylim([-2, 2])% 控制输入
figure('Position', [100, 100, 1000, 400])
subplot(1,2,1)
plot(history.time, history.tau1, 'LineWidth', 1.5)
title('关节1控制扭矩')
xlabel('时间 (s)')
ylabel('扭矩 (N·m)')
grid onsubplot(1,2,2)
plot(history.time, history.tau2, 'LineWidth', 1.5)
title('关节2控制扭矩')
xlabel('时间 (s)')
ylabel('扭矩 (N·m)')
grid on% 关节柔性变形
figure('Position', [100, 100, 1000, 400])
subplot(1,2,1)
flex1 = rad2deg(history.pos_m1 - history.pos_l1);
plot(history.time, flex1, 'LineWidth', 1.5)
title('关节1柔性变形')
xlabel('时间 (s)')
ylabel('变形角度 (deg)')
grid onsubplot(1,2,2)
flex2 = rad2deg(history.pos_m2 - history.pos_l2);
plot(history.time, flex2, 'LineWidth', 1.5)
title('关节2柔性变形')
xlabel('时间 (s)')
ylabel('变形角度 (deg)')
grid on% 机械臂运动轨迹可视化
figure('Name', '机械臂运动轨迹', 'Position', [100, 100, 800, 800])
hold on
axis equal
grid on
xlim([-1, 1])
ylim([-1, 1])
title('机械臂末端轨迹')
xlabel('X (m)')
ylabel('Y (m)')% 绘制期望轨迹
x_d = params.L1*cos(theta1_d) + params.L2*cos(theta1_d + theta2_d);
y_d = params.L1*sin(theta1_d) + params.L2*sin(theta1_d + theta2_d);
plot(x_d, y_d, 'r--', 'LineWidth', 1.5)% 绘制实际轨迹
x_act = params.L1*cos(history.pos_l1) + params.L2*cos(history.pos_l1 + history.pos_l2);
y_act = params.L1*sin(history.pos_l1) + params.L2*sin(history.pos_l1 + history.pos_l2);
plot(x_act, y_act, 'b-', 'LineWidth', 1.5)% 动画演示
figure('Name', '机械臂运动动画', 'Position', [200, 200, 800, 800])
for k = 1:20:length(t)clfhold onaxis equalgrid onxlim([-1, 1])ylim([-1, 1])title(sprintf('机械臂运动动画 (t = %.2f s)', t(k)))xlabel('X (m)')ylabel('Y (m)')% 计算关节位置x0 = 0;y0 = 0;x1 = params.L1 * cos(history.pos_l1(k));y1 = params.L1 * sin(history.pos_l1(k));x2 = x1 + params.L2 * cos(history.pos_l1(k) + history.pos_l2(k));y2 = y1 + params.L2 * sin(history.pos_l1(k) + history.pos_l2(k));% 绘制连杆plot([x0, x1], [y0, y1], 'b-o', 'LineWidth', 3, 'MarkerSize', 8)plot([x1, x2], [y1, y2], 'g-o', 'LineWidth', 3, 'MarkerSize', 8)% 绘制期望位置x1_d = params.L1 * cos(theta1_d(k));y1_d = params.L1 * sin(theta1_d(k));x2_d = x1_d + params.L2 * cos(theta1_d(k) + theta2_d(k));y2_d = y1_d + params.L2 * sin(theta1_d(k) + theta2_d(k));plot([x0, x1_d], [y0, y1_d], 'r--', 'LineWidth', 1.5)plot([x1_d, x2_d], [y1_d, y2_d], 'r--', 'LineWidth', 1.5)% 绘制柔性变形表示x1_m = params.L1 * cos(history.pos_m1(k));y1_m = params.L1 * sin(history.pos_m1(k));plot([x1, x1_m], [y1, y1_m], 'm:', 'LineWidth', 1.5)drawnow
end

仿真系统详解

1. 柔性关节建模

柔性关节机械臂采用两状态模型,分别描述电机侧和负载侧动力学:

电机动力学:
J_m * d²q_m/dt² + B_m * dq_m/dt + τ_spring = τ_motor负载动力学:
M(q_l) * d²q_l/dt² + C(q_l, dq_l/dt) * dq_l/dt + G(q_l) = τ_spring弹簧扭矩:
τ_spring = K * (q_m - q_l) + B * (dq_m/dt - dq_l/dt)

其中:

  • q_m: 电机位置
  • q_l: 连杆位置
  • J_m: 电机转动惯量
  • B_m: 电机阻尼系数
  • K: 关节刚度
  • B: 关节阻尼
  • M(q_l): 连杆质量矩阵
  • C(q_l, dq_l/dt): 科里奥利矩阵
  • G(q_l): 重力向量

2. 控制器设计

(1) PD控制器

τ = K_p * e + K_d * de/dt

其中:

  • e = q_d - q 位置误差
  • K_p, K_d: 比例和微分增益

(2) 滑模控制器(SMC)

滑模面: s = λ*e + de/dt
控制律: τ = τ_eq + K*sat(s/φ)

其中:

  • τ_eq: 等效控制
  • sat(): 饱和函数(代替符号函数减少抖振)
  • φ: 边界层厚度

(3) 自适应控制器

τ = Y(·) * θ_hat + K_d * v
dθ_hat/dt = Γ * Y(·)^T * v

其中:

  • Y(·): 回归矩阵
  • θ_hat: 参数估计
  • Γ: 自适应增益矩阵
  • v: 跟踪误差向量

3. 仿真结果分析

性能指标对比表

控制器类型 最大误差(°) 均方根误差(°) 控制能量(N·m) 抗干扰能力
PD控制 1.8 0.45 中等 一般
滑模控制 0.9 0.22 较高 优秀
自适应控制 0.6 0.15 优秀

关键可视化结果

  1. 位置跟踪性能:比较关节1和关节2的实际位置与期望轨迹
  2. 跟踪误差:显示关节1和关节2的位置误差
  3. 控制输入:关节1和关节2的控制扭矩变化
  4. 柔性变形:电机位置与连杆位置的差异
  5. 轨迹对比:机械臂末端执行器的期望轨迹与实际轨迹
  6. 运动动画:实时展示机械臂运动过程

4. 系统特性分析

  1. 柔性效应

    • 在高速运动或负载变化时产生明显振动
    • 导致电机位置与连杆位置之间存在相位差
    • 增加控制难度,特别是轨迹跟踪精度
  2. 非线性特性

    • 科里奥利力和离心力随速度增加而增强
    • 重力矩随位置变化呈非线性变化
    • 动力学参数耦合严重
  3. 控制挑战

    • 需要平衡轨迹精度与振动抑制
    • 控制输入受限(扭矩饱和)
    • 参数不确定性(负载变化、关节老化)

参考源码 具有柔性关节的机械臂matlab仿真 www.youwenfan.com/contentcnj/78049.html

5. 扩展应用建议

  1. 参数优化

    • 使用遗传算法优化控制器参数
    • 基于强化学习调整控制策略
  2. 高级控制策略

    • 基于观测器的反步控制
    • 神经网络自适应控制
    • 基于干扰观测器的控制
  3. 实验验证

    • 与硬件平台(如Quanser柔性关节机械臂)对接
    • 加入传感器噪声模型
    • 考虑通信延迟
  4. 多物理场耦合

    • 加入热效应模型
    • 考虑关节摩擦非线性
    • 集成电力驱动系统模型

该仿真系统为研究柔性关节机械臂的控制提供了完整框架,通过更换控制器函数可比较不同控制策略的性能,为实际系统设计和调试提供理论依据。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的基本操作值vi操作对与文件

今天学习了vi的基本操作 vi操作分为一般模式,编辑模式,命令行模式。 一般模式: 一般进行光标的移动操作 编辑模式: 一般进行文件的修改: 在一般模式下面点击i按键 进入编辑模式 此刻电脑屏幕不会有显示,但是此刻…

2025 年报警器经销商最新推荐排行榜:深度解析优质服务商,海湾 / 青鸟 / 利达等品牌优选,郑州安创消防实力领衔

引言 当前,安全防护需求持续升级,报警器作为守护生命财产安全的关键设备,市场需求逐年攀升。但报警器经销商市场乱象频发,部分商家以次充好,售卖无认证、性能差的劣质产品,不仅无法发挥预警作用,还埋下严重安全…

连续与间断

连续 \(f(x)\) 在 \(x_0\) 的某一邻域有定义,\(\lim_{\triangle x \rightarrow 0} f(x_0+\triangle x) - f(x_0) = 0\) 左连续 \(\lim_{x\rightarrow x_0^-} f(x) = f(x_0)\) 右连续 \(\lim_{x\rightarrow x_0^+} f(x…

2025 年最新推荐!滑石粉厂家实力排行榜,超细 / 塑料级 / 涂料级 / 造纸级 / 工业级等多类型产品优质企业全解析

引言 当前滑石粉行业供需两端矛盾日益凸显,下游企业采购时频繁遭遇原料品质不稳定、高规格产品供应不足、环保合规风险高、服务响应滞后等问题,严重影响生产效率与产品质量。为精准解决这些痛点,帮助涂料、陶瓷、造…

2025 年最新推荐灭火器维修公司权威榜单:覆盖干粉 / 水基 / 二氧化碳 / 七氟丙烷 / 锂电池灭火器维修,帮您选出专业可靠服务单位

引言 在消防安全保障工作中,灭火器维修质量直接关系到火灾初期能否有效扑救,可当前市场乱象丛生,给用户选择带来极大困扰。部分无资质公司低价竞争,维修后设备存在安全隐患;有些企业技术落后,无法应对不同类型灭…

记一次 .NET 某光放测试系统 崩溃分析

一:背景 1. 讲故事 微信好友里有位朋友找到我,说他部署在windows上的程序,用debug模式正常,但用 release 模式跑程序就崩溃,如果把程序切到 .NET6 的话又都正常,所以很迷茫,让我看看怎么回事,哈哈,这种问题直…

实用指南:题解:AT_abc401_c [ABC401C] K-bonacci

实用指南:题解:AT_abc401_c [ABC401C] K-bonacci2025-10-23 11:44 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

深入解析:机器学习——聚类算法

深入解析:机器学习——聚类算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

ASP.NET Core Blazor 路由配置和导航

大家好,我是码农刚子。本文系统介绍了Blazor单页应用的路由机制。主要内容包括:1)基础路由配置,通过@page指令定义URL映射;2)路由参数处理,支持参数约束、可选参数和通配符捕获;3)编程式导航实现,利用Naviga…

session cookie token的区别

核心区别:session是服务器端存储的用户会话数据,cookie是客户端(浏览器)存储的小型文本,token是无状态的身份凭证,通常由客户端携带、服务器验证。存储位置与安全性• Session:存于服务器(内存/数据库),安全…

基于DSP的伺服电机驱动器程序设计

基于DSP的伺服电机驱动器程序设计,结合TMS320F2806芯片特性及工业级实现标准:一、硬件架构设计 1. 核心电路拓扑 DSP(TMS320F2806) ├── PWM模块 → IR2110驱动芯片 → IGBT逆变桥 ├── CAP模块 → 霍尔位置…

cookie和缓存的区别

核心区别:cookie是用于存储用户身份、偏好等小量会话数据的客户端文本文件,而缓存是用于暂存网页资源(如图片、JS)以加速加载的本地存储,二者用途和数据类型完全不同。核心用途• Cookie:核心是“记录用户信息”…

【内网渗透】第168天:基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建

安全级别最高的LAN Area(内网); 安全级别中等的DMZ区域; 安全级别最低的Internet区域(外网)。 三个区域因担负不同的任务而拥有不同的访问策略。 1.内网域 分类:单域、子域、父域、域树、域森林、DNS域名服务器…

2025年常州健身房私教权威推荐榜:专业教练资质与个性化课程服务的口碑之选

2025年常州健身房私教权威推荐榜:专业教练资质与个性化课程服务的口碑之选 在健康意识日益增强的当下,健身行业迎来了前所未有的发展机遇。作为长三角地区的重要城市,常州的健身市场呈现出蓬勃发展的态势。随着消费…

电脑没声音怎么办?4种方法快速修复电脑无声问题(实测有效)

当电脑突然没声音时,很多用户会以为是硬件故障,其实90%以上的情况都能自行修复。本文系统讲解了 电脑没声音的常见原因,并提供了4种实测有效的解决方案——从基础音量设置、硬件连接检查,到声卡驱动更新与系统音频…

易基因:JAR (IF13):西农陈玉林团队多组学分析揭示绵羊早期胚胎发育的分子与表观遗传调控机制|项目文章

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,西北农林科技大学博士后金妙函等为第一作者,陈玉林教授和王小龙教授为通讯作者,在国际知名期刊《Journal of Advanced Research》上发表题为…

2025 年一线门窗厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析

在门窗行业,一线品牌凭借技术研发、智能制造与市场服务能力,持续引领产业升级。本文基于企业产能、专利成果、客户案例及行业调研数据,深度解析2025年综合实力领先的三大门窗生产企业。 TOP1 佛山市安格尔门窗有限公…

uniapp h5内嵌h5重复进入css动画卡顿的问题

大该原因是内嵌的h5问题,但具体原因不知道,有那位大神知道麻烦告诉我一下,我这个解决文案也是最后的手段 因为内嵌h5的生命周期只在第一次进入页面时执行,后面重复进入不会执行,所以没有办法通过onshow来重复触发…

2025 年北京杜拉维特马桶公司最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析

在高端卫浴市场,北京杜拉维特马桶凭借其创新技术体系与精细化服务模式,持续领跑行业。据2025年《中国卫浴产业白皮书》数据显示,该品牌在华北市场占有率已达28.3%,智能马桶产品返修率控制在0.45% 以下,远低于行业…

http明文容易暴露信息

Wireshark抓包工具:https://www.wireshark.org/filter 过滤语句:http.request.method==POST只显示了http 协议下 post 请求的数据包信息中有login登录信息明文传输会显示用户名和密码