【发布时间】:2022-08-15 19:46:20
【问题描述】:
我在 Matlab 中有一个 ROV(遥控车辆)的数学模型,我试图在 c# 程序中使用它。 c#程序将调用Rov模型并将一些值传递给模型,然后在程序中使用模型的结果。
我试图用谷歌搜索错误消息并找到一些答案,例如目录不正确或错误消息中的函数“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的输入是一个元胞数组。eta是x的子集,x是函数的输入。因此,x是元胞数组而不是数值数组。在我看来,将 C# double 数组转换为 MATLAB 数组的方式是错误的。我对 C# 一无所知,因此无法帮助您修复它,但希望这能给您一个提示。 -
我建议从一个更简单的脚本开始,它只打印输入数据的属性和值。这样你就可以检查你是否正确地进行了互操作。