MOOS程序解析记录(6)uSimMarine解析2
前言
接上文继续,上文主要分析了关于uSimMarine中航向、深度、速度等值的计算公式和相关代码,本章内容将继续介绍uSimMarine APP的其他相关内容。
一、Simulation of External Drift
在AUV实际航行过程中,很可能会因为外部的环境发生坐标偏移,该部分内容主要是关于模拟XY坐标漂移的内容,如果进行环境仿真时,可以通过其他模拟海流APP进行外部漂移的计算,以此来对AUV在海流中行进状态进行模拟。
1.External X-Y Drift from Initial Simulator Configuration
在进行外部漂移设置时,可以通过设置参数:drift_x、drift_y来对坐标漂移进行设置,或者通过设置drift_vecor同时进行设置。
2.External X-Y Drift from Initial Simulator Configuration
关于海流漂移的uSIM订阅变量如下:
DRIFT X, DRIFT Y, DRIFT VECTOR,这三个变量可以对漂移大小进行设置
DRIFT VECTOR ADD:在当前漂移向量的基础上增加漂移量,下面是一段模拟风对AUV影响的脚本
DRIFT VECTOR MULT:该值对漂移的向量进行乘法,为2时,漂移向量增加2倍,为-1时向量方向反向
这些接口可以在 uTimerScript脚本中写,或者由其他模拟海流或者气流的MOOAapp来进行发布。
二、The ThrustMap Data Structure
推力图是一种数据结构,其主要目的是用来模拟推力和速度之间的关系。这是在uSimMarine配置块中配置的,推力映射参数包含逗号分隔的冒号分隔对列表。分隔列表中的每个元素都是一个映射组件。在每个组件中,冒号左边的值是推力值,另一个值是相应的速度。下面是一个以字符串形式给出的示例映射,并在下图中呈现。
1.Automatic Pruning of Invalid Configuration Pairs
推力图的域为【-100,+100】之间,整个推力映射设置是需要由小到大逐步递增。
设置格式如下:
thrust_map = -120:-5, -100:-3.5, -75:-3.2, -10:-2, 20:2.4, 50:4.2, 80:4.8, 100:5.0, 120:6
thrust_map = -100:-3.5, -75:-3.2, -10:-2, 20:2.4, 50:4.2, 80:4.8, 90:4, 100:5.0
thrust_map = -100:-3.5, -75:-3.2, -10:-2, 0:0, 20:2.4, 50:4.2, 80:4.8, 100:5.0
thrust_map = -100:-3.5, -75:-3.2, -10:-2, 0:1, 20:2.4, 50:4.2, 80:4.8, 100:5.0
对于第一种情况,对“-120:-5”和“120:6”将被忽略,因为它们在
(100−100)域。
在第二种情况下,对“90:4”将被忽略,因为它的包含将导致给定前一对“80:4.8”的非单调映射。
在第三种情况下,“0:0”将被有效地忽略,因为它隐含在所有的地图配置中。
在第四种情况下,pair“0:1”将被忽略,因为不允许从非零速度映射到零推力
2.Automatic Inclusion of Implied Configuration Pairs
译文:由于域[−100,100]是不可变的,当或如果用户提供没有明确映射−100或100推力值的配置时,推力映射会自动更改一点。在这种情况下,缺失的映射变为隐含映射。
代码如下:
thrust_map = -75:-3.2, -10:-2, 20:2.4, 50:4.2, 80:4.8
thrust_map = -100:-3.2, -75:-3.2, -10:-2, 20:2.4, 50:4.2, 80:4.8, 100:4.8
下面给一段关于添加推力图对的源码:
bool ThrustMap::addPair(double thrust, double speed)
{
if((thrust < m_min_thrust) || (thrust > m_max_thrust)) {
m_figlog.addWarning("Thrust Out of Range:" + doubleToString(thrust));
return(false);
}//超过范围不予记录,并发出讲稿
if(thrust > 0) {
if(speed >= 0) {
map<double, double> new_pos_mapping = m_pos_mapping;//按照map double对的形式来对变量对进行存储
new_pos_mapping[thrust] = speed;
if(isAscendingMap(new_pos_mapping))
m_pos_mapping = new_pos_mapping;
else {
m_figlog.addError("Non-Ascending pair rejected: ");
m_figlog.augError(doubleToStringX(thrust));
m_figlog.augError(":" + doubleToStringX(speed));
return(false);
}
}
else {// 不合逻辑的情况,推力大于0,速度小于0
m_figlog.addError("Mapping negative speed to positive thrust: ");
m_figlog.augError(doubleToStringX(thrust)+":");
m_figlog.augError(doubleToStringX(speed));
return(false);
}
}
else if(thrust < 0) {
if(speed <= 0) {
map<double, double> new_neg_mapping = m_neg_mapping;
new_neg_mapping[thrust] = speed;
if(isAscendingMap(new_neg_mapping))
m_neg_mapping = new_neg_mapping;
else {
m_figlog.addError("Non-Ascending pair rejected: ");
m_figlog.augError(doubleToStringX(thrust));
m_figlog.augError(":" + doubleToStringX(speed));
return(false);
}
}
else {
m_figlog.addError("Mapping positive speed to negative thrust: ");
m_figlog.augError(doubleToStringX(thrust)+":");
m_figlog.augError(doubleToStringX(speed));
return(false);
}
}
else if((thrust == 0) && (speed != 0)) {
m_figlog.addError("Mapping a non-zero speed to zero-thrust: ");
m_figlog.augError(doubleToStringX(speed));
return(false);
}
return(true);
}
总结
采用了两小节的篇幅,基本上将MOOS中的仿真模型部分解释清楚了,其优点在于方程非常直观易懂,每一个变量的在公式中的作用都解释的比较清楚,而且在一定程度上算是比较符合实际,但是也同样有一定的问题,比如:模型精度上肯定是远远不能和运动学动力学方程去比较。
如果要精细建模的话,建议在该方程基础上加入自己的模型去进行仿真,或者去进行模型预测等等。