MOOS程序解析记录(6)uSimMarine解析2

14 篇文章 0 订阅

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中的仿真模型部分解释清楚了,其优点在于方程非常直观易懂,每一个变量的在公式中的作用都解释的比较清楚,而且在一定程度上算是比较符合实际,但是也同样有一定的问题,比如:模型精度上肯定是远远不能和运动学动力学方程去比较。
如果要精细建模的话,建议在该方程基础上加入自己的模型去进行仿真,或者去进行模型预测等等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值