3D 矩阵作为 Simulink 模型中 Matlab 函数的输出

Posted

技术标签:

【中文标题】3D 矩阵作为 Simulink 模型中 Matlab 函数的输出【英文标题】:3D Matrix as output of a Matlab Function in a Simulink model 【发布时间】:2014-11-25 15:21:01 【问题描述】:

我有以下问题。

我有一个 SIMULINK 模型,在这个模型中我有一个块:Matlab 函数,以下 http://it.mathworks.com/help/simulink/slref/matlabfunction.html

对于我输入的函数:

一个向量 (N x 1) 一个常数 (1 X 1)

在输出中我想要一个 3D 矩阵,所以矩阵 R 的尺寸为 (3 X 3 X N)。

但我收到以下错误:

Data 'R' (#41) is inferred as a variable size matrix, while its specified
type is something else.
Component: MATLAB Function | Category: Coder error

你能帮帮我吗?

块中的函数如下:

function R = fcn(u,n_robots)

% u is the vector of the quaternions.
% If there are 2 robots involved the u will look like this:
% u=[w1 x1 y1 z1 w2 x2 y2 z2]'
%#eml
assert(n_robots<10);
% Initialization of the variables. If you remove this it won't work because
% code generation doesn't support dynamic changing size variables.
w=zeros(n_robots,1);
x=zeros(n_robots,1);
y=zeros(n_robots,1);
z=zeros(n_robots,1);
n=zeros(n_robots,1);

Rxx=zeros(n_robots,1);
Rxy=zeros(n_robots,1);
Rxz=zeros(n_robots,1);
Ryx=zeros(n_robots,1);
Ryy=zeros(n_robots,1);
Ryz=zeros(n_robots,1);
Rzx=zeros(n_robots,1);
Rzy=zeros(n_robots,1);
Rzz=zeros(n_robots,1);

R=zeros(3,3,n_robots);

for i=0:n_robots-1

    w(i+1) = u( 1+3*i );
    x(i+1) = u( 2+3*i );
    y(i+1) = u( 3+3*i );
    z(i+1) = u( 4+3*i );

    n(i+1) = sqrt(x(i+1)*x(i+1) + y(i+1)*y(i+1) + z(i+1)*z(i+1) + w(i+1)*w(i+1));

    x(i+1) = x(i+1)/ n(i+1);
    y(i+1) = y(i+1)/ n(i+1);
    z(i+1) = z(i+1)/ n(i+1);
    w(i+1) = w(i+1)/ n(i+1);

    Rxx(i+1) = 1 - 2*(y(i+1)^2 + z(i+1)^2);
    Rxy(i+1) = 2*(x(i+1)*y(i+1) - z(i+1)*w(i+1));
    Rxz(i+1) = 2*(x(i+1)*z(i+1) + y(i+1)*w(i+1));

    Ryx(i+1) = 2*(x(i+1)*y(i+1) + z(i+1)*w(i+1));
    Ryy(i+1) = 1 - 2*(x(i+1)^2 + z(i+1)^2);
    Ryz(i+1) = 2*(y(i+1)*z(i+1) - x(i+1)*w(i+1) );

    Rzx(i+1) = 2*(x(i+1)*z(i+1) - y(i+1)*w(i+1) );
    Rzy(i+1) = 2*(y(i+1)*z(i+1) + x(i+1)*w(i+1) );
    Rzz(i+1) = 1 - 2 *(x(i+1)^2 + y(i+1)^2);

    R(:,:,i+1) = [
        Rxx(i+1),    Rxy(i+1),    Rxz(i+1);
        Ryx(i+1),    Ryy(i+1),    Ryz(i+1);
        Rzx(i+1),    Rzy(i+1),    Rzz(i+1)];
end

【问题讨论】:

我相信您不能在 simulink 中制作输出可变大小。 R的大小HAS每次都一样,所以需要独立于n_robots。 如何在端口和数据管理器中定义输出R?我不确定 MATLAB Function 块是否支持可变大小的信号,这就是 R 的含义。检查uk.mathworks.com/help/simulink/ug/…。 你可以做的(而且会更简洁)是为每个机器人创建一个功能,然后将这些功能块放入模型中。 我不能这样做,因为将来我将拥有 N 个机器人,我需要将软件尽可能地参数化。 【参考方案1】:

您可能需要对整个模型进行参数化,以便使用不同数量的机器人重复模拟并收集结果。

要么这样,要么找出机器人的最大数量,并确保所有变量都设置为最大容量 - 用 0 或 -1 或 NaN 填充机器人未使用的空间以将其标记为未使用(任何适合您的。

【讨论】:

【参考方案2】:

我同意@James 给出的答案,即使用尺寸参数化模型是理想的。您可以将 n_robots 声明为 MATLAB 功能块的 non-tunable parameter,然后在每次仿真期间该值将被视为常量。这反过来会使R 在每次模拟期间固定大小。但是,可以在模拟之间更改该值以处理其他数量的机器人。

但是,为了完整起见,您可以将输出信号R 设置为可变大小。在 MATLAB Function Block 编辑器中,单击“编辑数据”。查找并选择 R 的条目。选中“可变大小”复选框并输入适当的上限。 [3,3,10] 似乎从您的代码中就足够了。

有关在 MATLAB 功能块中使用可变大小数据的更多信息,请访问:

http://www.mathworks.com/help/simulink/variable-size-data.html

【讨论】:

那么,如果我没记错的话,你告诉我让 n_robots 保持可调,R 保持可变大小并指定 R 上限?感谢回复 @minidiable,我的观察是可以做你提到的事情。但是,如果 n_robots 在模拟的任何一次运行期间都没有发生变化,那么将其设为不可调整并保持 R 固定大小是否更有意义? 是的。现在,我确信 n_robots 在某个模拟期间不会改变。它肯定会在不同的模拟之间发生变化,但如果我将 n_robots 设置为不可调整,这应该不是问题。

以上是关于3D 矩阵作为 Simulink 模型中 Matlab 函数的输出的主要内容,如果未能解决你的问题,请参考以下文章

3D数学基础矩阵

simulink如何导入workspace中的三维矩阵?

如何在opengl中计算给定3D点及其2D屏幕位置的投影/模型视图矩阵

为啥不在卡通着色中的法线向量上应用模型视图矩阵(Lighthouse3d 教程)?

Matlab-Simulink (Mac OSX) 中的模型加速

6.Simulink基础建模操作——矩阵运算for循环