有一个示例:SIMULINK + SOLIDWORKS
这里使用的方式是:
在SOLIDWORKS中创建3D模型
创建适用于通过SimMechanics Link导入到MATLAB的xml文件
将模型导入到MATLAB / SIMULINK。创建了Simulink系统。完成这些步骤后,将在SIMULINK中实现对系统的控制。我想更灵活,将任何算法应用于模型。而使用matlab * .m文件进行控制是更有效的方法。
所以我的问题是:有什么方法可以通过仅使用* .m文件进行控制而不再使用SIMULINK来进行3D仿真(MATLAB + SOLIDWORKS)?
所有模型信息都将包含在* m.file中。也许步骤1和2是继承的,但步骤3是不同的。
#1 楼
我使用CAD软件生成3D模型,将3D模型转换为STL格式,然后使用以下脚本将这些STL文件加载到Matlab:function [points,success] = LoadSTL(path)
% LoadSTL loads an ASCII STL file with units in [mm].
% The output is a structure array where each element in the array is
% a vertex.
%
% [points , success] = LoadSTL(path)
%
% path = String containing the path and extension of the file to be loaded.
% points = Matrix of locations where each column is a vertex, rows are x/y/z/1:
% points(1,:) = x
% points(2,:) = y
% points(3,:) = z
% points(4,:) = 1
% NOTE - every three columns is a new face/facet.
% success = Bit indicating if the file was successfully opened or not.
success = 0;
fileID = fopen(path);
if fileID <0
fprintf('File not found at path %s\n',path);
return;
end
fprintf('Loading Path %s...\n',path);
fileData = fread(fileID,'*char');
eol = sprintf('\n');
stlFile = strsplit(fileData',eol);
fclose(fileID);
fprintf('Done.\n')
pause(0.25);
clc
assignin('base' , 'stlFile' , stlFile)
pointsTracker = 1;
for i=2:size(stlFile,2)
if mod(pointsTracker,100)==0
clc
fprintf('Parsing file at %s...\n',path);
fprintf('Currently logged %d points\n',pointsTracker);
end
testLine = stlFile{i};
rawStrip = strsplit(testLine , ' ' , 'CollapseDelimiters' , true);
if numel(rawStrip) == 5
points(1,pointsTracker) = str2double(rawStrip{1,3})/1000;
points(2,pointsTracker) = str2double(rawStrip{1,4})/1000;
points(3,pointsTracker) = str2double(rawStrip{1,5})/1000;
points(4,pointsTracker) = 1;
pointsTracker = pointsTracker + 1;
end
end
disp('Done.')
pause(0.25);
clc;
if mod(size(points,2),3) > 0
disp('File format in an unexpected type.')
disp('Check the file specified is an STL format file with ASCII formatting.')
disp('(Error - number of vertices not a multiple of 3)')
disp(numel(points.x))
return;
end
success = 1;
return;
我将结果输出(点)保存为.mat文件,并仅从该.mat而不是STL文件加载,因为.mat文件的加载速度比每次解析STL文件都要快得多。
加载文件后,您可以使用以下命令在Matlab中快速绘制STL文件:
myPlotColor = [0.5 0.5 0.5];
nFaces = size(points,2)/3;
patch(...
reshape(points(1,:),3,nFaces) , ...
reshape(points(2,:),3,nFaces) , ...
reshape(points(3,:),3,nFaces) , ...
myPlotColor);
至此,标准的Matlab绘制命令起作用了。例如,
axis equal
,hold on
等。现在,考虑到如何从m文件中加载和显示Matlab图中的STL文件,您可以执行任何所需的控制形式。使用由旋转矩阵$ R $和转换向量$ s $组成的任何4x4转换矩阵来转换CAD文件:
$$
\ mbox {transformedPoints} = \ begin {bmatrix}
&R&&s \\
0&0&0&1 \\
\ end {bmatrix}
\ mbox {points}
$$
使用上面显示的
patch
命令绘制变换后的点。只要您生成了CAD模型,使得3D模型的原点与数学模型的原点相对应,则数学模型围绕其原点的任何移动/旋转都可以正确地应用于CAD模型,然后可以我要重申的是,此文件加载的是ASCII格式的STL文件,其单位为毫米,生成的图的单位为米,但是您当然可以更改在文件加载过程中使用
/1000
缩放比例。 评论
$ \ begingroup $
听起来很棒!谢谢您的回答。您可以分享给我一个例子,还是建议我去寻找有关此方法的更多信息?
$ \ endgroup $
–潘
15年7月23日在4:19
评论
基本上,由于SimMechanics,您需要一个Simulink文件。但是如果可能的话,可以从* .m文件中“控制” simulink文件。确保禁用优化“内联参数”,以便能够轻松设置simulink的所有参数。只需使用sim()命令开始仿真。如果您可以更精确地尝试实现目标,那么我可以给出更好的答案。谢谢你的评论。我在MATLAB中为四足动物制作了一个控制器,并在2D中制作了动画。我看到这段视频中的模拟非常有趣。所以我想为自己的工作实现3D模拟。
我通常创建一个模拟m文件,使我能够控制系统的任何输入(创建偏移量,提供测量数据....)并为每个非内联设置参数。这样您就可以轻松进行DoE仿真等等。
您能更清楚地解释一下吗?我还是不明白你的意思。什么是能源部模拟?
我创建了一个聊天室以避免在评论中进行讨论:chat.stackexchange.com/rooms/26108/…