跳转到主内容
思享编程网:思考分享,玩转编程世界!

风力摆——stm32

文章目录 一.单摆模型解析 1.1 目标值解算 1.2 当前值解算 二.双摆模型解析 2.1 基础解析 2.2 直线和画园解析 2.3 画八字 三.总结 四matlab代码 五.matlab各种画图代码(各种图形,导入图片提取坐标) 一.单摆模型解析 1.1 目标值解算

1.2 当前值解算 C 语言的 三角函数库只认“弧度”,不认“度”。

二.双摆模型解析 2.1 基础解析

2.2 直线和画园解析

直线方程

2.3 画八字

Target_X = Amplitude_x * sin(Alpha); // X方向目标值函数

Target_Y = Amplitude_y * sin(2 * Alpha + Phase); // Y方向目标值函数

else if(flag_mode==5) //八字模式 { Flag_Stop = 0; // 开启输出 Data_Amplitude = Basic_Amplitude; // 初始振幅 Data_Gama = PI / 4; // 振幅比例系数 Data_Phase = PI / 2; // 相位差为π/2 } Amplitude_x=Data_Amplitude*sin(Data_Gama)*Xishu;//振幅X Data_Amplitude就是m Data_Amplitude决定摆线有多长 Data_Gama决定摆线的角度 Amplitude_y=Data_Amplitude*cos(Data_Gama)*Xishu;//振幅Y Data_Amplitude就是m Data_Amplitude决定摆线有多长 Data_Gama决定摆线的角度 Phase=Data_Phase; //相位差

三.总结

四matlab代码

%% 李萨如图形 MATLAB 可视化

% 对应 C 代码:x = a*sin(θ) , y = b*sin(nθ+Φ)

%%% a和b决定"画得多大"——是尺寸;theta 决定"现在画到哪儿"——是时间/角度; Phi决定画的图形 %% 1 参数(完全对应 C 代码) Period = 1.5; % 周期,秒(对应 C 的 Period_ms 转秒) fs = 200; % 采样率,Hz(为了曲线光滑) a = 1; % Amplitude_x 归一化 b = 1; % Amplitude_y 归一化 决定4画得多大8——是尺寸; n = 1; % 频率比,平常n=1,八字可设 2 Phi = pi/2; % 相位差,圆=pi/2,直线=0,椭圆=pi/3 决定画的图形 Xishu =1.4142; %√2补偿系数 Basic_Amplitude = 200; % 振幅 Data_Gama = pi/4; % 任意给一个角度 %% 2 时间轴 决定"现在画到哪儿"——是时间/角度; t = 0:1/fs:Period*3; % 0~Period 秒 theta = 2*pi*t/Period; % 归一化到 0~2π,对应 C 的 Alpha a=Basic_Amplitude * sin(Data_Gama) * Xishu b=Basic_Amplitude * cos(Data_Gama) * Xishu; %% 3 李萨如公式 x = a * sin(theta); y = b * sin(n*theta + Phi); z = linspace(0, 0.1, numel(t)); % 轻微起伏,便于 3D 观察 %% 4 画图 %% 创建 3D 动画窗口 fig = figure('Name','3D 李萨如圆动图'); set(fig,'Color','w'); ax = axes('Parent',fig); rotate3d(ax,'on'); % 打开鼠标拖动旋转 grid(ax,'on'); axis equal; xlabel(ax,'X'); ylabel(ax,'Y'); zlabel(ax,'Z'); title(ax,'实时描线——李萨如圆');

% 用 animatedline 实时画线 h = animatedline('Color','r','LineWidth',2,'Parent',ax);

%% 实时描线循环 for k = 1:length(t) addpoints(h, x(k), y(k), z(k)); drawnow limitrate; % 立即刷新画面 pause(0.005); % 控制描线速度(可调) end

%% 循环播放:描完后自动重播 while true clearpoints(h); % 清空轨迹 for k = 1:length(t) addpoints(h, x(k), y(k), z(k)); drawnow limitrate; pause(0.005); end end

五.matlab各种画图代码(各种图形,导入图片提取坐标)

%% ========= 可调参数 =========

r = 300; % 圆半径 N_c = 100; % 圆点数 N_t = 500; % 三角形边总点数 N_r = 400; % 矩形边总点数 N_s = 800; % 正弦波点数

%% ========= 1. 圆(已验证) ========= xc = r; yc = r; theta = linspace(0,2*pi,N_c+1); theta(end) = []; x_c = round(xc + r*cos(theta),2); y_c = round(yc + r*sin(theta),2);

%% ========= 2. 三角形(已验证) ========= A = [100 100]; B = [500 120]; C = [300 450]; A = round(A,2); B = round(B,2); C = round(C,2); nEdge = floor(N_t/3); edgeAB = [linspace(A(1),B(1),nEdge+1); linspace(A(2),B(2),nEdge+1)]; edgeBC = [linspace(B(1),C(1),nEdge+1); linspace(B(2),C(2),nEdge+1)]; edgeCA = [linspace(C(1),A(1),nEdge+1); linspace(C(2),A(2),nEdge+1)]; x_t = [edgeAB(1,:), edgeBC(1,2:end), edgeCA(1,2:end)]; y_t = [edgeAB(2,:), edgeBC(2,2:end), edgeCA(2,2:end)]; x_t = round(x_t,2); y_t = round(y_t,2);

%% ========= 3. 矩形(左下、右上两点定义) ========= R_bl = [150 50]; % 左下角 R_tr = [450 250]; % 右上角 R_bl = round(R_bl,2); R_tr = round(R_tr,2);

nEdgeR = floor(N_r/4); % 每条边点数 xR = unique(round([linspace(R_bl(1),R_tr(1),nEdgeR+1), ... linspace(R_tr(1),R_bl(1),nEdgeR+1), ... repmat(R_tr(1),1,nEdgeR), ... repmat(R_bl(1),1,nEdgeR)],2)); yR = unique(round([repmat(R_bl(2),1,nEdgeR), ... linspace(R_bl(2),R_tr(2),nEdgeR+1), ... linspace(R_tr(2),R_bl(2),nEdgeR+1), ... repmat(R_bl(2),1,nEdgeR)],2));

% 按顺序把四条边拼接成闭合折线 x_r = [linspace(R_bl(1),R_tr(1),nEdgeR+1), ... % 底 repmat(R_tr(1),1,nEdgeR), ... % 右 linspace(R_tr(1),R_bl(1),nEdgeR+1), ... % 顶 repmat(R_bl(1),1,nEdgeR)]; % 左 y_r = [repmat(R_bl(2),1,nEdgeR+1), ... linspace(R_bl(2),R_tr(2),nEdgeR), ... repmat(R_tr(2),1,nEdgeR+1), ... linspace(R_tr(2),R_bl(2),nEdgeR)]; x_r = round(x_r,2); y_r = round(y_r,2);

%% ========= 4. 正弦波 ========= % 定义 x 范围在第一象限内 xMinS = 50; xMaxS = 550; x_s = linspace(xMinS,xMaxS,N_s); y_s = 50 + 80*sin(2*pi*(x_s-xMinS)/(xMaxS-xMinS)); % 振幅 80,基线 50 x_s = round(x_s,2); y_s = round(y_s,2);

%% ========= 5. 绘图 ========= figure; hold on plot(x_c,y_c,'b.','MarkerSize',6,'DisplayName',sprintf('圆 (%d点)',numel(x_c))); plot(x_t,y_t,'r.','MarkerSize',6,'DisplayName',sprintf('三角形 (%d点)',numel(x_t))); plot(x_r,y_r,'g.','MarkerSize',6,'DisplayName',sprintf('矩形 (%d点)',numel(x_r))); plot(x_s,y_s,'m.','MarkerSize',6,'DisplayName',sprintf('正弦波 (%d点)',numel(x_s))); axis equal grid on xlabel('x'); ylabel('y'); title('离散点:圆 + 三角形 + 矩形 + 正弦波');

margin = 10; xlim([0, max([x_c x_t x_r x_s]) + margin]); ylim([0, max([y_c y_t y_r y_s]) + margin]); legend show

% 步骤1: 导入图像 imgPath = 'F:\\图片\\78.png'; % 替换为你的图像文件路径 img = imread(imgPath); % Windows 系统中的路径

% 检查图像是否成功加载 if isempty(img) error('无法加载图像,请检查文件路径和文件名是否正确。

'); end

% 步骤2: 图像处理 - 转换为灰度图并进行二值化处理 grayImg = rgb2gray(img); % 如果是彩色图像,先转换为灰度图 binImg = imbinarize(grayImg); % 进行二值化处理

% 步骤3: 形态学操作 - 腐蚀操作 se = strel('disk', 1); % 创建一个圆形的结构元素 erodedImg = imerode(binImg, se); % 进行腐蚀操作

% 提取腐蚀后的图像的轮廓 [B,L] = bwboundaries(erodedImg, 'noholes');

% 步骤4: 绘制原始图像和提取的轮廓点 figure; subplot(1, 2, 1); % 分割绘图窗口,左侧显示原始图像 imshow(img); title('原始图像');

subplot(1, 2, 2); % 右侧显示提取的轮廓点 imshow(erodedImg, 'InitialMagnification', 'fit'); % 显示腐蚀后的图像结果 title('提取的内部轮廓点'); xlabel('X坐标'); ylabel('Y坐标'); axis equal; xlim([1 size(erodedImg, 2)]); ylim([1 size(erodedImg, 1)]); axis ij; % 将坐标轴的方向设置为矩阵索引的方向 hold on;

% 动态绘制轮廓点 for k = 1:length(B) boundary = B{k}; x = boundary(:,2); y = boundary(:,1);

% 绘制当前轮廓 for i = 1:length(x) plot(x(i), y(i), 'r.', 'MarkerSize', 10); % 绘制当前点 drawnow; % 立即更新图形窗口 pause(0.05); % 暂停一段时间,以便观察绘制过程 end end

% 绘制完成后,显示图形 hold off;

% 步骤1: 导入图像 imgPath = 'F:\\图片\\78.png'; % 替换为你的图像文件路径 img = imread(imgPath); % Windows 系统中的路径

% 检查图像是否成功加载 if isempty(img) error('无法加载图像,请检查文件路径和文件名是否正确。

'); end

% 步骤2: 图像处理 - 转换为灰度图并进行边缘检测 grayImg = rgb2gray(img); % 如果是彩色图像,先转换为灰度图 binImg = imbinarize(grayImg); % 进行二值化处理 edges = bwperim(binImg); % 获取二值图像的轮廓

% 步骤3: 提取轮廓点坐标 % 提取轮廓的边界 [B,L] = bwboundaries(edges, 'noholes');

% 步骤4: 绘制原始图像和提取的轮廓点 figure; subplot(1, 2, 1); % 分割绘图窗口,左侧显示原始图像 imshow(img); title('原始图像');

subplot(1, 2, 2); % 右侧显示提取的轮廓点 imshow(edges, 'InitialMagnification', 'fit'); % 显示轮廓结果 title('提取的轮廓点'); xlabel('X坐标'); ylabel('Y坐标'); axis equal; xlim([1 size(edges, 2)]); ylim([1 size(edges, 1)]); axis ij; % 将坐标轴的方向设置为矩阵索引的方向 hold on;

% 动态绘制轮廓点 for k = 1:length(B) boundary = B{k}; x = boundary(:,2); y = boundary(:,1);

% 绘制当前轮廓 for i = 1:length(x) plot(x(i), y(i), 'r.', 'MarkerSize', 10); % 绘制当前点 drawnow; % 立即更新图形窗口 pause(0.05); % 暂停一段时间,以便观察绘制过程 end end

% 绘制完成后,显示图形 hold off;

相关文章