【Matlab 六自由度机器人】笛卡尔空间规划和关节空间规划(附MATLAB建模代码)

笛卡尔空间规划和关节空间规划

  • 近期更新
  • 前言
  • 正文
    • 1. 笛卡尔空间规划
      • 特点:
      • 步骤:
    • 2. 关节空间规划
      • 特点:
      • 步骤:
    • 3. 两种方法的区别
    • 4. MATLAB代码:机械臂避障路径规划问题和解答
      • 4.1 关节空间规划方法
      • 4.2 笛卡尔空间规划方法
      • 4.3 规划方法的比较
    • 5. 路径规划优化
      • 5.1 平滑性优化
      • 5.2 速度和加速度约束
    • 6. 复杂场景处理
      • 6.1 多个障碍物
      • 6.2 工作空间约束
    • 7. 高级路径规划算法
    • 8. 可视化改进
  • 总结
  • 参考文献

近期更新

【汇总】

【Matlab 六自由度机器人】系列文章汇总  \fcolorbox{green}{aqua}{【Matlab 六自由度机器人】系列文章汇总 } Matlab 六自由度机器人】系列文章汇总 

【主线】

运动学 \color{red}运动学 运动学

  1. 定义标准型及改进型D-H参数,建立机器人模型。
  2. 运动学正解
  3. 基于蒙特卡罗方法(Monte Carlo Method)构建机器人工作空间

动力学 \color{red}动力学 动力学

  1. 【Matlab 六自由度机器人】机器人动力学之推导拉格朗日方程(附MATLAB机器人动力学拉格朗日方程推导代码)

【补充说明】

  1. 关于灵活工作空间与可达工作空间的理解
  2. 关于改进型D-H参数(modified Denavit-Hartenberg)的详细建立步骤
  3. 关于旋转的参数化(欧拉角、姿态角、四元数)的相关问题
  4. 关于双变量函数atan2(x,y)的解释
  5. 关于机器人运动学反解的有关问题

前言

随着工业自动化和智能制造的快速发展,机器人技术在现代生产中扮演着越来越重要的角色。六自由度机器人因其灵活性和多功能性而被广泛应用于各种复杂任务中。然而,要充分发挥机器人的潜力,有效的路径规划至关重要。本文将深入探讨六自由度机器人的两种主要路径规划方法:笛卡尔空间规划和关节空间规划。
本文我们将详细比较这两种方法的特点、优缺点及适用场景,并通过MATLAB代码示例展示如何实现机械臂的避障路径规划。通过本文,读者将能够全面理解这两种规划方法的原理,并在实际应用中做出合适的选择。

正文

1. 笛卡尔空间规划

笛卡尔空间规划是在机器人末端执行器的工作空间中进行路径规划。这种方法直接考虑机器人末端执行器在三维空间中的位置和姿态。

特点:

  • 直观:规划路径更容易理解和可视化
  • 精确:可以精确控制末端执行器的运动轨迹
  • 复杂性:需要进行逆运动学计算,可能存在奇异点

步骤:

  1. 确定起始点和目标点的位置和姿态
  2. 在笛卡尔空间中生成路径点
  3. 对每个路径点进行逆运动学求解,得到对应的关节角度
  4. 检查是否存在奇异点或超出关节限制
  5. 如有必要,调整路径或使用其他方法处理奇异点

2. 关节空间规划

关节空间规划直接在机器人的关节空间中进行路径规划,考虑各个关节的角度变化。

特点:

  • 简单:避免了复杂的逆运动学计算
  • 平滑:关节运动通常更加平滑
  • 不直观:末端执行器的实际运动轨迹可能难以预测

步骤:

  1. 确定起始和目标构型的关节角度
  2. 在关节空间中生成路径点
  3. 对每个路径点进行正运动学计算,得到末端执行器的位置和姿态
  4. 检查是否存在碰撞或其他约束违反
  5. 如有必要,调整路径以满足约束条件

3. 两种方法的区别

  1. 规划空间

    • 笛卡尔空间规划在工作空间中进行
    • 关节空间规划在关节角度空间中进行
  2. 直观性

    • 笛卡尔空间规划更直观,易于理解末端执行器的运动
    • 关节空间规划不直观,难以预测末端执行器的实际轨迹
  3. 计算复杂度

    • 笛卡尔空间规划需要进行逆运动学计算,计算量较大
    • 关节空间规划只需要正运动学计算,计算量较小
  4. 奇异点处理

    • 笛卡尔空间规划可能遇到奇异点问题
    • 关节空间规划通常不会遇到奇异点问题
  5. 运动平滑性

    • 关节空间规划通常产生更平滑的关节运动
    • 笛卡尔空间规划可能导致关节运动不平滑
  6. 路径控制

    • 笛卡尔空间规划可以精确控制末端执行器的运动轨迹
    • 关节空间规划难以精确控制末端执行器的运动轨迹

4. MATLAB代码:机械臂避障路径规划问题和解答

4.1 关节空间规划方法

以下是使用关节空间规划方法的机械臂避障路径规划MATLAB代码示例:

%% 机器人模型定义
% 使用提供的机器人建模代码定义机器人模型%% 定义障碍物
obstacle = [500, 200, 500]; % 障碍物中心坐标 [x, y, z]
obstacle_radius = 100; % 障碍物半径%% 路径规划
start_config = [0, 0, 0, 0, 0, 0]; % 起始关节角度
end_config = [pi/2, pi/4, -pi/4, pi/2, -pi/4, pi/3]; % 目标关节角度num_points = 50; % 路径点数量
path = zeros(num_points, 6);for i = 1:num_pointst = (i - 1) / (num_points - 1);path(i, :) = start_config + t * (end_config - start_config);
end%% 避障检查和路径调整
max_iterations = 100;
for iter = 1:max_iterationscollision_found = false;for i = 1:num_points% 计算当前构型下的末端执行器位置T = robot.fkine(path(i, :));pos = T.t';% 检查是否与障碍物碰撞if norm(pos - obstacle) < obstacle_radiuscollision_found = true;% 计算避障方向avoid_dir = pos - obstacle;avoid_dir = avoid_dir / norm(avoid_dir);% 调整路径点adjustment = 10 * avoid_dir; % 调整步长new_pos = pos + adjustment;% 使用逆运动学计算新的关节角度new_config = robot.ikine(SE3(new_pos), 'mask', [1 1 1 0 0 0]);path(i, :) = new_config;endendif ~collision_foundbreak;end
end%% 可视化结果
figure;
robot.plot(start_config);
hold on;% 绘制障碍物
[X, Y, Z] = sphere(20);
X = X * obstacle_radius + obstacle(1);
Y = Y * obstacle_radius + obstacle(2);
Z = Z * obstacle_radius + obstacle(3);
surf(X, Y, Z, 'FaceColor', 'r', 'FaceAlpha', 0.3, 'EdgeColor', 'none');% 绘制路径
for i = 1:num_pointsT = robot.fkine(path(i, :));pos = T.t';plot3(pos(1), pos(2), pos(3), 'b.', 'MarkerSize', 10);
end% 绘制起点和终点
T_start = robot.fkine(start_config);
T_end = robot.fkine(end_config);
plot3(T_start.t(1), T_start.t(2), T_start.t(3), 'go', 'MarkerSize', 10, 'LineWidth', 2);
plot3(T_end.t(1), T_end.t(2), T_end.t(3), 'ro', 'MarkerSize', 10, 'LineWidth', 2);title('机械臂避障路径规划');
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
grid on;
view(3);%% 动画展示
figure;
robot.plot(path);

请添加图片描述

这段代码实现了以下功能:

  1. 定义了一个球形障碍物
  2. 在关节空间中生成了一条直线路径
  3. 检查路径是否与障碍物碰撞
  4. 如果发生碰撞,调整路径点以避开障碍物
  5. 可视化最终的避障路径
  6. 展示机器人运动动画

注意事项:

  • 这个示例使用了简单的障碍物检测和路径调整方法,实际应用中可能需要更复杂的算法
  • 逆运动学求解可能不总是收敛,可能需要额外的错误处理
  • 路径平滑性和动力学约束未考虑,实际应用中可能需要进一步优化

通过运行这段代码,你可以看到机器人如何在关节空间中规划路径并避开障碍物。可以通过调整参数(如起始点、终点、障碍物位置等)来测试不同的场景。

4.2 笛卡尔空间规划方法

以下是使用笛卡尔空间规划方法的机械臂避障路径规划 MATLAB 代码示例:

%% 机器人模型定义
% 使用提供的机器人建模代码定义机器人模型%% 定义障碍物
obstacle = [500, 200, 500]; % 障碍物中心坐标 [x, y, z]
obstacle_radius = 100; % 障碍物半径%% 笛卡尔空间路径规划
% 定义起始点和终点的位姿
start_pose = robot.fkine([0, 0, 0, 0, 0, 0]);
end_pose = robot.fkine([pi/2, pi/4, -pi/4, pi/2, -pi/4, pi/3]);num_points = 50; % 路径点数量
cartesian_path = zeros(num_points, 6); % [x, y, z, roll, pitch, yaw]% 生成直线路径
for i = 1:num_pointst = (i - 1) / (num_points - 1);interp_pose = SE3.interp(start_pose, end_pose, t);cartesian_path(i, 1:3) = interp_pose.t';cartesian_path(i, 4:6) = tr2rpy(interp_pose.R);
end%% 避障检查和路径调整
max_iterations = 100;
for iter = 1:max_iterationscollision_found = false;for i = 1:num_pointspos = cartesian_path(i, 1:3);% 检查是否与障碍物碰撞if norm(pos - obstacle) < obstacle_radiuscollision_found = true;% 计算避障方向avoid_dir = pos - obstacle;avoid_dir = avoid_dir / norm(avoid_dir);% 调整路径点adjustment = 10 * avoid_dir; % 调整步长new_pos = pos + adjustment;cartesian_path(i, 1:3) = new_pos;endendif ~collision_foundbreak;end
end%% 逆运动学求解
joint_path = zeros(num_points, 6);
for i = 1:num_points% 创建旋转矩阵R = rotz(cartesian_path(i,6)) * roty(cartesian_path(i,5)) * rotx(cartesian_path(i,4));% 创建平移向量t = cartesian_path(i,1:3)';% 创建SE3对象pose = SE3(R, t);% 尝试逆运动学求解try% 使用当前关节角度作为初始猜测if i > 1q0 = joint_path(i-1,:);elseq0 = [0, 0, 0, 0, 0, 0];  % 使用零位置作为初始猜测endq = robot.ikine(pose, 'q0', q0, 'mask', [1 1 1 1 1 1]);if isempty(q) || any(isnan(q))warning('在点 %d 处逆运动学求解可能失败。', i);if i > 1joint_path(i,:) = joint_path(i-1,:);elseerror('无法求解第一个点的逆运动学。请检查起始位置是否在工作空间内。');endelsejoint_path(i,:) = q;endcatch MEwarning('在点 %d 处发生错误: %s', i, ME.message);if i > 1joint_path(i,:) = joint_path(i-1,:);elserethrow(ME);endend% 打印调试信息fprintf('点 %d: 笛卡尔位置 = [%.2f, %.2f, %.2f], 关节角度 = [%.2f, %.2f, %.2f, %.2f, %.2f, %.2f]\n', ...i, t(1), t(2), t(3), joint_path(i,1), joint_path(i,2), joint_path(i,3), joint_path(i,4), joint_path(i,5), joint_path(i,6));
end%% 可视化结果
figure;
robot.plot(joint_path(1,:));
hold on;% 绘制障碍物
[X, Y, Z] = sphere(20);
X = X * obstacle_radius + obstacle(1);
Y = Y * obstacle_radius + obstacle(2);
Z = Z * obstacle_radius + obstacle(3);
surf(X, Y, Z, 'FaceColor', 'r', 'FaceAlpha', 0.3, 'EdgeColor', 'none');% 绘制笛卡尔空间路径
plot3(cartesian_path(:,1), cartesian_path(:,2), cartesian_path(:,3), 'b.-', 'MarkerSize', 10);% 绘制起点和终点
plot3(start_pose.t(1), start_pose.t(2), start_pose.t(3), 'go', 'MarkerSize', 10, 'LineWidth', 2);
plot3(end_pose.t(1), end_pose.t(2), end_pose.t(3), 'ro', 'MarkerSize', 10, 'LineWidth', 2);title('机械臂避障路径规划(笛卡尔空间)');
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
grid on;
view(3);%% 动画展示
figure;
robot.plot(joint_path);

请添加图片描述
请添加图片描述

这段代码实现了以下功能:

  1. 在笛卡尔空间中定义起始点和终点的位姿
  2. 在笛卡尔空间中生成直线路径
  3. 检查路径是否与障碍物碰撞,并在笛卡尔空间中调整路径
  4. 对调整后的笛卡尔空间路径进行逆运动学求解,得到关节空间路径
  5. 可视化最终的避障路径
  6. 展示机器人运动动画

4.3 规划方法的比较

  1. 规划空间
    笛卡尔空间规划直接在工作空间中进行
    关节空间规划在关节角度空间中进行

  2. 直观性
    笛卡尔空间规划更直观,易于理解末端执行器的运动
    关节空间规划不直观,难以预测末端执行器的实际轨迹

  3. 计算复杂度
    笛卡尔空间规划需要进行逆运动学计算,计算量较大
    关节空间规划只需要正运动学计算,计算量较小

  4. 避障调整
    笛卡尔空间规划可以直接在工作空间中进行避障调整
    关节空间规划需要将避障调整转换到关节空间

  5. 奇异点处理
    笛卡尔空间规划可能遇到奇异点问题,需要特殊处理
    关节空间规划通常不会遇到奇异点问题

  6. 路径控制
    笛卡尔空间规划可以精确控制末端执行器的运动轨迹
    关节空间规划难以精确控制末端执行器的运动轨迹

在实际应用中,选择使用笛卡尔空间规划还是关节空间规划取决于具体任务需求和机器人的特性。有时也会结合两种方法,以获得更好的规划结果。


当然,我们可以进一步探讨机械臂避障路径规划的优化方法和更复杂的场景。
以下是一些可以考虑的改进和扩展:

5. 路径规划优化

5.1 平滑性优化

为了使机械臂的运动更加平滑,我们可以使用样条插值或贝塞尔曲线来优化路径。这里是一个使用三次样条插值的例子:

%% 路径平滑优化
function smooth_path = smooth_trajectory(path, num_points)[m, n] = size(path);smooth_path = zeros(num_points, n);for i = 1:npp = spline(1:m, path(:,i));smooth_path(:,i) = ppval(pp, linspace(1, m, num_points));end
end% 在主程序中调用
smooth_path = smooth_trajectory(path, 100);% 更新可视化代码,使用 smooth_path 替代 path

5.2 速度和加速度约束

考虑机械臂的动力学特性,我们可以添加速度和加速度约束:

%% 速度和加速度约束
max_velocity = [pi/2, pi/2, pi/2, pi, pi, pi]; % 每个关节的最大速度
max_acceleration = [pi, pi, pi, 2*pi, 2*pi, 2*pi]; % 每个关节的最大加速度function [v, a] = check_dynamics_constraints(path, time_step)v = diff(path) / time_step;a = diff(v) / time_step;for i = 1:size(v, 2)v(:,i) = min(max(v(:,i), -max_velocity(i)), max_velocity(i));endfor i = 1:size(a, 2)a(:,i) = min(max(a(:,i), -max_acceleration(i)), max_acceleration(i));end
end% 在主程序中调用
time_step = 0.1; % 假设每个路径点之间的时间间隔为0.1秒
[v, a] = check_dynamics_constraints(smooth_path, time_step);

6. 复杂场景处理

6.1 多个障碍物

扩展代码以处理多个障碍物:

%% 定义多个障碍物
obstacles = [500, 200, 500, 100;  % [x, y, z, radius]300, 400, 300, 80;700, 100, 600, 120;
];%% 更新避障检查函数
function collision = check_collision(pos, obstacles)collision = false;for i = 1:size(obstacles, 1)if norm(pos - obstacles(i,1:3)) < obstacles(i,4)collision = true;return;endend
end% 在主循环中使用新的碰撞检测函数
if check_collision(pos, obstacles)% 执行避障操作
end

6.2 工作空间约束

添加工作空间边界检查:

%% 工作空间边界
workspace_limits = [-1000, 1000; -1000, 1000; 0, 1500]; % [x_min, x_max; y_min, y_max; z_min, z_max]function in_workspace = check_workspace(pos, workspace_limits)in_workspace = all(pos >= workspace_limits(:,1)' & pos <= workspace_limits(:,2)');
end% 在路径规划中添加工作空间检查
if ~check_workspace(new_pos, workspace_limits)% 调整路径点使其保持在工作空间内new_pos = min(max(new_pos, workspace_limits(:,1)'), workspace_limits(:,2)');
end

7. 高级路径规划算法

对于更复杂的场景,可以考虑使用更先进的路径规划算法,如快速扩展随机树(RRT)或概率路径图(PRM)。这里是一个简化的RRT示例:

function path = rrt_planner(start_config, end_config, robot, obstacles, workspace_limits, max_iterations)tree = start_config;path = [];for i = 1:max_iterations% 随机采样构型if rand < 0.1q_rand = end_config;elseq_rand = random_config(workspace_limits);end% 找到最近的节点[~, idx] = min(sum((tree - q_rand).^2, 2));q_near = tree(idx,:);% 向随机构型方向扩展q_new = q_near + 0.1 * (q_rand - q_near) / norm(q_rand - q_near);% 检查新节点是否有效if is_valid_config(q_new, robot, obstacles, workspace_limits)tree = [tree; q_new];% 检查是否到达目标if norm(q_new - end_config) < 0.1path = reconstruct_path(tree, length(tree));return;endendend
end% 辅助函数
function q = random_config(workspace_limits)q = workspace_limits(:,1)' + rand(1,6) .* (workspace_limits(:,2)' - workspace_limits(:,1)');
endfunction valid = is_valid_config(q, robot, obstacles, workspace_limits)T = robot.fkine(q);pos = T.t';valid = check_workspace(pos, workspace_limits) && ~check_collision(pos, obstacles);
endfunction path = reconstruct_path(tree, goal_idx)path = tree(goal_idx,:);current_idx = goal_idx;while current_idx > 1[~, parent_idx] = min(sum((tree(1:current_idx-1,:) - tree(current_idx,:)).^2, 2));path = [tree(parent_idx,:); path];current_idx = parent_idx;end
end% 在主程序中调用 RRT 规划器
path = rrt_planner(start_config, end_config, robot, obstacles, workspace_limits, 10000);

8. 可视化改进

为了更好地展示规划结果,我们可以改进可视化效果:

%% 改进的可视化
figure('Name', '机械臂避障路径规划', 'Position', [100, 100, 1200, 600]);subplot(1,2,1);
robot.plot(start_config);
hold on;% 绘制障碍物
for i = 1:size(obstacles, 1)[X, Y, Z] = sphere(20);X = X * obstacles(i,4) + obstacles(i,1);Y = Y * obstacles(i,4) + obstacles(i,2);Z = Z * obstacles(i,4) + obstacles(i,3);surf(X, Y, Z, 'FaceColor', 'r', 'FaceAlpha', 0.3, 'EdgeColor', 'none');
end% 绘制路径
plot3(smooth_path(:,1), smooth_path(:,2), smooth_path(:,3), 'b-', 'LineWidth', 2);% 绘制起点和终点
plot3(start_config(1), start_config(2), start_config(3), 'go', 'MarkerSize', 10, 'LineWidth', 2);
plot3(end_config(1), end_config(2), end_config(3), 'ro', 'MarkerSize', 10, 'LineWidth', 2);title('3D 路径可视化');
xlabel('X轴'); ylabel('Y轴'); zlabel('Z轴');
grid on; view(3);% 绘制关节角度变化
subplot(1,2,2);
time = linspace(0, 1, size(smooth_path, 1));
for i = 1:6plot(time, smooth_path(:,i), 'LineWidth', 2);hold on;
end
title('关节角度随时间的变化');
xlabel('归一化时间');
ylabel('关节角度 (rad)');
legend('Joint 1', 'Joint 2', 'Joint 3', 'Joint 4', 'Joint 5', 'Joint 6');
grid on;% 动画展示
figure('Name', '机械臂运动动画');
robot.plot(smooth_path, 'trail', 'b-', 'workspace', workspace_limits(:)');

这些改进和扩展涵盖了以下方面:

  1. 路径平滑优化
  2. 速度和加速度约束
  3. 多障碍物处理
  4. 工作空间约束
  5. 高级路径规划算法(RRT)
  6. 改进的可视化效果

通过这些优化和扩展,我们的机械臂避障路径规划系统变得更加强大和实用。它能够处理更复杂的场景,生成更平滑的路径,并考虑机械臂的动力学约束。同时,改进的可视化效果使得规划结果更加直观和易于理解。

在实际应用中,你可能还需要考虑其他因素,如:

  • 末端执行器的方向约束
  • 更复杂的障碍物形状
  • 动态障碍物
  • 多机器人协同规划
  • 考虑机械臂的自身碰撞

这些主题可以作为进一步研究和改进的方向。

总结

通过对六自由度机器人的笛卡尔空间规划和关节空间规划的深入探讨,我们可以得出以下结论:

  1. 方法特点
    笛卡尔空间规划直观、精确,适合需要精确控制末端执行器轨迹的任务。
    关节空间规划计算简单、运动平滑,适合对轨迹精度要求不高的任务。

  2. 计算复杂度
    笛卡尔空间规划涉及复杂的逆运动学计算,计算量较大。
    关节空间规划主要涉及正运动学计算,计算量相对较小。

  3. 避障能力
    两种方法都能实现有效的避障,但实现方式不同。
    笛卡尔空间规划在工作空间中直接调整路径,更加直观。
    关节空间规划需要将避障策略转换到关节空间,实现相对复杂。

  4. 实际应用
    在实际应用中,两种方法常常结合使用,以充分发挥各自优势。
    选择合适的规划方法需要考虑具体任务需求、机器人特性和计算资源等因素。

  5. 优化方向
    未来的研究可以关注路径平滑优化、多约束条件下的规划、动态环境中的实时规划等方向。
    结合人工智能技术,如机器学习和深度强化学习,有望进一步提高路径规划的效率和鲁棒性。

参考文献

Matlab机器人工具箱

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

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

相关文章

Java中关于算数运算符的理解

在Java中基本的算数运算符有五类 加减-乘*在编程语言中乘号一律写为 *除/在Java中两个整数相除结果还是整数取余%取得的是两个数相除的余数 这里可以看见&#xff0c;在输出加法和减法时&#xff0c;我在后面多加了一个括号&#xff0c;这是因为运算优先级的原因&#xff0c;加…

105. 从前序与中序遍历序列构造二叉树【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路四、参考代码 零、LeetCode 原题 105. 从前序与中序遍历序列构造二叉树 一、题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的…

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…

基于Spring Boot的医疗病历B2B平台开发策略

第4章 系统设计 4.1 系统总体设计 系统不仅要求功能完善&#xff0c;而且还要界面友好&#xff0c;因此&#xff0c;对于一个成功的系统设计&#xff0c;功能模块的设计是关键。由于本系统可执行的是一般性质的学习信息管理工作&#xff0c;本系统具有一般适用性&#xff0c;其…

49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

上一篇文章我们学习了第一种结构型模式&#xff1a;代理模式。它在不改变原始类&#xff08;或者叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到&#xff0c;常用在业务系统中开发一些非功能性需求&#xf…

Docker consul注册中心

一、consul 1.1、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。 起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。 直到后来出现了多个节点的分布式架构&#x…

如何看一个flutter项目的具体flutter版本

查看pubspec.lock文件 这个项目实际运行的就是 flutter 3.16.6 版本的

模电板测试分析报告【积分/微分电路】

积分电路常用于波形转换&#xff0c;如将矩形波变三角波。对正弦波积分可以实现相移。 微分电路&#xff1a; 为什么直接串联0.1uF电容到反馈线上去&#xff1a; 整改&#xff1a;这么看的话原理图中C58应该换成电阻的。 积分电路下图中红色的换成电容就可以变成微分电路了。 从…

八、随机名字功能

摘要&#xff1a; XML在C#与Unity3D中的实战运用 - PlaneZhong - 博客园 (cnblogs.com) 读取策划提供的配置文件。 策划提供一份execel文档&#xff0c;程序将它转化为一个配置文件&#xff08;xml&#xff09; 首先&#xff1a; XML是一个可扩展标记的语言 一、转换方法…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

Node.js管理工具NVM

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令&#xff1a; 一、安装 nvm 下载 nvm&#xff1a; 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

【C语言】你不知道的知识小盲区——柔性数组

文章目录 一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势 一、什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。在C99标准中&#xff0c;如果结构体的最后一个成员是…

sqli-labs less-26 空格绕过

空格绕过 过滤空格 用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 //() 绕过空格注释符绕过//–%20//#–- -;%00; 空白字符绕过SQLite3 —— 0A,0D,0c,09,20 MYSQL 09,0A,0B,0B,0D,A0,20 PosgressSQL 0A,0D,0C,09,20 Oracle_11g 00,0A,0D,0C,09,20 MSSQL 01,02,03,04,05,06,07,…

[瑞吉外卖]-05菜品模块

文件上传下载 介绍 文件上传也称为upload&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上, 可以供其他用户浏览或下载 前端组件库提供了上传组件&#xff0c;但是底层原理还是基于form表单的文件上传。 服务端要接收客户端上传的文件&#xff0c;通常都会使用Ap…

一次Fegin CPU占用过高导致的事故

记录一下 一次应用事故分析、排查、处理 背景介绍 9号上午收到CPU告警&#xff0c;同时业务反馈依赖该服务的上游服务接口响应耗时太长 应用告警-CPU使用率 告警变更 【WARNING】项目XXX,集群qd-aliyun,分区bbbb-prod,应用customer,实例customer-6fb6448688-m47jz, POD实例CP…

Web集群服务-Nginx

1. web服务 1. WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站 2. WEB中间件: 等同于WEB服务 3. 中间件:范围更加广泛,指的负载均衡之后的服务 4. 数据库中间件:数据库缓存,消息对列 2. 极速上手指南 nginx官网: nginx documentation 2.1 配置yum源 vim /etc/…

HTML基础知识

介绍 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是一种用于创建网页的标准标记语言。它描述了一个网站的结构骨架&#xff0c;使得浏览器能够展示具有特定格式的文本、链接、图片和其他内容。以下是HTML的一些基础知识&#xff1a; HT…

骨传导耳机哪个牌子好?自费测评5大爆款骨传导耳机,高能不断!

随着科技的飞速发展&#xff0c;耳机市场也迎来了一次又一次的革新。从有线到无线&#xff0c;从入耳式到头戴式&#xff0c;每一次技术的突破都为用户带来了全新的听觉体验。近年来&#xff0c;骨传导耳机以其独特的传声方式和健康舒适的佩戴体验&#xff0c;逐渐成为运动爱好…

初识Linux之指令(二)

一&#xff1a;head指令 head 与 tail 就像它的名字一样的浅显易懂&#xff0c;它是用来显示开头或结尾某个数量的文字区块&#xff0c;head 用来显示档案的 开头至标准输出中&#xff0c;而 tail 想当然尔就是看档案的结尾。 语法&#xff1a;head 【参数】 【文件】 功能&…

docker (desktopcompose) download

docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell