通过 MATLAB 的 cylinder 函数生成圆柱体的表面坐标,生成表示一个具有非标准形状的圆柱体(在本例中是杯子)

MATLAB的机器人系统工具箱(RST)的官方例程Plan a Reaching Trajectory with Multiple Kinematic Constraints 规划具有多个运动学约束的到达轨迹

matlab 复制代码
% 创建用于视觉化杯子的点
[X,Y,Z] = cylinder(cupRadius*linspace(0,1,50).^0.125);
% 调整 Z 坐标的比例,使其符合杯子的高度
Z = cupHeight*Z - cupHeight/2;
% 将杯子的位置平移到指定位置
X = X + cupPosition(1);
Y = Y + cupPosition(2);
Z = Z + cupPosition(3);
% 将杯子添加到图形中,并配置照明
s = patch(surf2patch(X,Y,Z));
s.FaceColor = 'blue';          % 设置杯子的颜色为蓝色
s.FaceLighting = 'gouraud';    % 设置照明效果为 Gouraud 渲染
s.EdgeAlpha = 0;               % 将边缘透明度设置为 0

% 移动光源的位置,使杯子的侧面被照亮
lightObj = findobj(gca,'Type','Light');
for i = 1:length(lightObj)
    lightObj(i).Position = [1,1,1];
end

Y-Z视图

[X,Y,Z] = cylinder(cupRadius*linspace(0,1,50).^0.125);

这行代码用于生成表示一个具有非标准形状的圆柱体(在本例中是杯子)的三维坐标点。具体来说,它通过 MATLAB 的 cylinder 函数生成圆柱体的表面坐标,然后对这些坐标进行一定的处理,以实现独特的形状效果。

逐步解释:
  1. linspace(0,1,50):

    • 生成从 0 到 1 之间的 50 个等间距的数值。
    • 这些数值表示圆柱体沿径向(半径方向)的分布,用于生成圆柱体的外形。
  2. linspace(0,1,50).^0.125:

    • 对生成的 50 个数值进行 0.125 次幂运算。
    • 幂次操作:幂次小于 1的幂次操作会导致数值在靠近 0 的部分变化较快,而在接近 1 的部分变化较慢,表现为更"平缓"的增长曲线
  3. cupRadius*linspace(0,1,50).^0.125:

    • 将计算出的半径值乘以 cupRadius,以生成实际的杯子半径。
    • 这一步将非线性调整的半径值缩放到实际的杯子尺寸。
  4. cylinder(cupRadius*linspace(0,1,50).^0.125):

    • cylinder 函数使用给定的半径值生成一个圆柱体的三维坐标点。
    • cylinder 函数默认生成一个高为 1,底部在 z=0,顶部在 z=1 的圆柱体,其参数是圆柱体各层的半径 。通过这种方式,生成的圆柱体会有一个非线性收缩 的效果,导致生成的形状在底部较窄,而在顶部逐渐变宽,更接近实际杯子的形状。
  5. [X, Y, Z]:

    • cylinder 函数输出三个矩阵 XYZ,它们分别表示圆柱体表面的 x、y 和 z 坐标。
    • 这些矩阵可以直接用于绘制圆柱体的表面,表示杯子的三维形状。

幂次操作演示

matlab 复制代码
clear;clc;close all;

x = linspace(0, 1, 5); % 生成 0 到 1 之间的 5 个等间距数值

% 不同幂次操作
y1 = x .^ 1;        % 线性,不做幂次操作,[0, 0.25, 0.5, 0.75, 1]
y2 = x .^ 0.5;      % 平方根,进行 0.5 次幂的操作,[0, 0.5, 0.7071, 0.866, 1]
y3 = x .^ 0.125;    % 进行 0.125 次幂的操作%,[0, 0.861, 0.9306, 0.9715, 1]

% 绘制第一组曲线
plot(x, y1, '-o', 'DisplayName', 'x^1'); hold on;
plot(x, y2, '-o', 'DisplayName', 'x^0.5');
plot(x, y3, '-o', 'DisplayName', 'x^0.125');
legend show;
xlabel('Original values');
ylabel('Transformed values');
title('Effect of Different Power Operations');

% 生成 0 到 1 之间的 50 个等间距数值
x_fine = linspace(0, 1, 50);

% 对新的数值集进行相同的幂次操作
y1_fine = x_fine .^ 1;
y2_fine = x_fine .^ 0.5;
y3_fine = x_fine .^ 0.125;

% 绘制第二组曲线
plot(x_fine, y1_fine, '*', 'DisplayName', 'x^1 (50 points)'); hold on;
plot(x_fine, y2_fine, '*', 'DisplayName', 'x^0.5 (50 points)');
plot(x_fine, y3_fine, '*', 'DisplayName', 'x^0.125 (50 points)');
legend show;

1. cylinder 函数的基本用法

[X, Y, Z] = cylinder(r, n)

  • r 是一个向量,定义了圆柱体的半径分布。如果 r 是一个标量,则生成的圆柱体的横截面是一个固定半径的圆。否则,r 的每个元素定义了从底部到顶部的不同半径。
  • n 是圆柱体的侧面点数,表示圆周上生成的点的数量。默认值为 20。

cylinder 函数生成的 XYZ 是网格化的数据,这些数据表示圆柱体的表面。XY 是圆柱体表面的横截面点的 xy 坐标,Z 是圆柱体的高度分布。

2. 解释 X 的大小

matlab 复制代码
[X, Y, Z] = cylinder(cupRadius*linspace(0,1,50).^0.125);
  • cupRadius*linspace(0,1,50).^0.125 :这个表达式生成了一个长度为 50 的向量 r,表示圆柱体从底部到顶部的半径变化。

    • linspace(0,1,50) 创建了一个从 0 到 1 之间均匀分布的 50 个点。
    • 然后,这些点被提升到 0.125 次幂,以实现非线性的半径分布。
    • 之后,乘以 cupRadius 以获得实际的半径大小。
  • cylinder(r) :此时,r 是一个长度为 50 的向量,因此 cylinder 函数会生成一个圆柱体,其横截面在 Z 方向上变化,形成了 50 个横截面(代表圆柱体从底部到顶部的 50 个切片)。

  • 默认的 n 值为 20cylinder 函数默认在圆周上生成 21 个点(包括 0 度和 360 度位置,重复了一次,以便闭合圆周)。

3. X 的大小分析

  • 50 行:代表了圆柱体沿 Z 轴方向上的 50 个切片。
  • 21 列:代表了圆柱体每个横截面上生成的 21 个点。

因此,X 的大小为 50x21,这意味着有 50 个高度切片,每个切片上有 21 个点,构成圆柱体表面的坐标点。

总结

  • 行数 50 :指定的 r 向量的长度(50 个切片)。
  • 列数 21cylinder 默认在圆周上生成 21 个点,以形成完整的圆柱体表面。
相关推荐
yong99906 分钟前
信号分形维数计算方法与MATLAB实现
开发语言·人工智能·matlab
Angel Q.2 小时前
基于GS(Gaussian Splatting)的机器人Sim2Real2Sim仿真平台有哪些
机器人·仿真·3dgs·高斯泼溅·sim2real2sim
才兄说2 小时前
机器人租赁中的现场确认痛点
人工智能·机器人
瑞璐塑业peek注塑2 小时前
【精密传动】机器人反向行星滚珠丝杠PEEK注塑降本方案成量产关键
机器人
知乎的哥廷根数学学派3 小时前
基于高阶统计量引导的小波自适应块阈值地震信号降噪算法(MATLAB)
网络·人工智能·pytorch·深度学习·算法·机器学习·matlab
cici158743 小时前
基于光流场的Demons算法MATLAB实现
人工智能·算法·matlab
aini_lovee3 小时前
基于判别码的深度神经网络快速自适应语音识别 MATLAB实现
matlab·语音识别·dnn
haing20193 小时前
3/1/3形七轴协作机器人解析解法及matlab实现
机器人
AIoT科技物语14 小时前
100%开源,国产Qmini双足机器人,从3D打印资源到软件系统、驱动算法全公开
机器人
气概14 小时前
法奥机器人学习使用
学习·junit·机器人