我正在学习根据SOLIDWORKS设计的模型在MATLAB中进行3D仿真。
有一个示例:SIMULINK + SOLIDWORKS

这里使用的方式是:


在SOLIDWORKS中创建3D模型
创建适用于通过SimMechanics Link导入到MATLAB的xml文件
将模型导入到MATLAB / SIMULINK。创建了Simulink系统。完成这些步骤后,将在SIMULINK中实现对系统的控制。我想更灵活,将任何算法应用于模型。而使用matlab * .m文件进行控制是更有效的方法。

所以我的问题是:有什么方法可以通过仅使用* .m文件进行控制而不再使用SIMULINK来进行3D仿真(MATLAB + SOLIDWORKS)?

所有模型信息都将包含在* m.file中。也许步骤1和2是继承的,但步骤3是不同的。

评论

基本上,由于SimMechanics,您需要一个Simulink文件。但是如果可能的话,可以从* .m文件中“控制” simulink文件。确保禁用优化“内联参数”,以便能够轻松设置simulink的所有参数。只需使用sim()命令开始仿真。如果您可以更精确地尝试实现目标,那么我可以给出更好的答案。

谢谢你的评论。我在MATLAB中为四足动物制作了一个控制器,并在2D中制作了动画。我看到这段视频中的模拟非常有趣。所以我想为自己的工作实现3D模拟。

我通常创建一个模拟m文件,使我能够控制系统的任何输入(创建偏移量,提供测量数据....)并为每个非内联设置参数。这样您就可以轻松进行DoE仿真等等。

您能更清楚地解释一下吗?我还是不明白你的意思。什么是能源部模拟?

我创建了一个聊天室以避免在评论中进行讨论:chat.stackexchange.com/rooms/26108/…

#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 equalhold 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