【问题标题】:Using a mathmatical model made in Matlab, in c# program使用 Matlab 制作的数学模型,在 c# 程序中
【发布时间】:2022-08-15 19:46:20
【问题描述】:

我在 Matlab 中有一个 ROV(遥控车辆)的数学模型,我试图在 c# 程序中使用它。 c#程序将调用Rov模型并将一些值传递给模型,然后在程序中使用模型的结果。

问题是当 c# 程序运行时,会显示一条错误消息:

我试图用谷歌搜索错误消息并找到一些答案,例如目录不正确或错误消息中的函数“mod”不在许可证和其他解决方案中,但没有人帮助解决此错误。

使用的 Matlab 版本是 2022a 和 Visual Studio 2022。

c#中调用Matlab函数的代码如下。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace WayPointModel
{
    public class ROV
    {
        public static Data ROVmini(double[] x, double[] tau, double[] vCurrNed)
        {
            object[] x1 = x.Select(d=> (object)d).ToArray();
            object[] tau1 = tau.Select(d=> (object)d).ToArray();
            object[] vCurrNed1 = vCurrNed.Select(d => (object)d).ToArray();
            MLApp.MLApp matlab = new MLApp.MLApp();
            matlab.Execute(@\"cd C:\\Users\\abdhab\\Documents\\MATLAB\\DP\\1DautodepthTest\");
            object result = null;
            matlab.Feval(\"ARSmini\", 2, out result, x1, tau1, vCurrNed1);
            double[] res = result as double[];
            double [] xDot = res[..12];
            double[] vCurrBody = res[11..];
            return new Data { xDot = xDot, vCurrBody=vCurrBody };
            
        }
    }
}

Matlab函数如下。

function [xdot, v_curr_body] = ARSmini(x, tau, v_curr_ned)

if (length(x) ~= 12),error(\'x-vector must have dimension 12!\'); end
if (length(tau) ~= 6),error(\'tau-vector must have dimension 6!\'); end

nu = x(1:6);
u = nu(1);
v = nu(2);
w = nu(3);
p = nu(4);
q = nu(5);
%nu(6) = 0.1;
r = nu(6);

eta = x(7:12);
phi = mod(eta(4),2*pi);
theta = mod(eta(5),2*pi);
psi = mod(eta(6),2*pi);



tau_u = tau(1);
tau_v = tau(2);
tau_w = tau(3);
tau_p = tau(4);
tau_q = tau(5);
%tau(6)=0.01;
tau_r = tau(6);


if (nargin == 2)
    v_curr_ned = [0 0 0]\';
else
    R_n_b = Rzyx(phi, theta, psi)\';
    v_curr_body = R_n_b*v_curr_ned;
end
    
nu_r = nu - [v_curr_body\' 0 0 0]\';

M_RB = [...
    90 0 0 0 0 0
    0 90 0 0 0 0
    0 0 90 0 0 0
    0 0 0 10 0 0
    0 0 0 0 15 0
    0 0 0 0 0 13];
M_A = [...
    54 0 0 0 0 0
    0 72 0 0 0 0 
    0 0 360 0 0 0
    0 0 0 11 0 0
    0 0 0 0 43.5 0
    0 0 0 0 0 5.2];
M = M_RB + M_A;

D_lin = [...
    250 0 0 0 0 0
    0 200 0 0 0 0
    0 0 175 0 0 0
    0 0 0 20 0 0
    0 0 0 0 20 0
    0 0 0 0 0 15];
D_n = [...
    350*abs(nu_r(1)) 0 0 0 0 0
    0 350*abs(nu_r(2)) 0 0 0 0
    0 0 400*abs(nu_r(3)) 0 0 0
    0 0 0 100*abs(nu_r(4)) 0 0
    0 0 0 0 100*abs(nu_r(5)) 0
    0 0 0 0 0 75*abs(nu_r(6))];
D = D_lin + D_n;


W = 90*9.81;
B = W/0.99;
r_bg = [0 0 0.18];
r_bb = [0 0 0];
 
g = gvect(W, B, theta, phi, r_bg, r_bb);

C = [...
    0 0 0 0 450*nu_r(3) -162*nu_r(2)
    0 0 0 -450*nu_r(3) 0 144*nu_r(1)
    0 0 0 162*nu_r(2) -144*nu_r(1) 0
    0 450*nu_r(3) -162*nu_r(2) 0 18.2*nu_r(6) -66.5*nu_r(5)
    -450*nu_r(3) 0 144*nu_r(1) -18.2*nu_r(6) 0 21*nu_r(4)
    162*nu_r(2) -144*nu_r(1) 0 66.5*nu_r(5) -21*nu_r(4) 0];

J = eulerang(eta(4),eta(5),eta(6));

area_rov =  [0.65*0.5; 0.9*0.5; 0.9*0.65];
cd = [1.05; 1.05; 1.75];
f_curr = 0.5 * 1000.*area_rov.*nu_r(1:3).*abs(nu_r(1:3)).*cd;

xdot = zeros(12,1);
xdot = [...
    M \\ (tau - D * nu - g - C*nu_r - [f_curr;0 ; 0 ;0])
    J * nu];% + [v_curr_ned\' 0 0 0]\'];

end
  • mod是matlab中的一个基本函数,没有工具箱什么的。它只是模数。问题是 MATLAB 代码不正确。 eta(4) 似乎是 cell array,函数不接受。在该 matlab 函数中编写一些输入解析,例如某些类型断言,以确保您实际上输入了您认为的类型。
  • 在 C# 中使用 Matlab 脚本的第一步是确保 Matlab 脚本运行。 Here\'s a link to a similar question 在 Matlab 中心。
  • phi = mod(eta(4),2*pi) 给出的错误是 mod 的输入是一个元胞数组。 etax 的子集,x 是函数的输入。因此,x 是元胞数组而不是数值数组。在我看来,将 C# double 数组转换为 MATLAB 数组的方式是错误的。我对 C# 一无所知,因此无法帮助您修复它,但希望这能给您一个提示。
  • 我建议从一个更简单的脚本开始,它只打印输入数据的属性和值。这样你就可以检查你是否正确地进行了互操作。

标签: c# matlab


【解决方案1】:

问题是缺少 Matlab 包。缺少的包是 MSS(海洋系统模拟器),下载包后一切顺利。感谢所有对这个问题发表评论的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-19
    • 2015-08-16
    • 1970-01-01
    • 2016-07-31
    • 2018-10-04
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多