前言

“车辆”这个词不太准确,但是官方用词翻译过来就是这个。在整个ivp的架构中,moosapp主要作用就是处理传感器数据和控制“车辆”的运动,而各种行为是封装好控制算法,Helm行为运行决策器,发布计算后得到的控制量。

转载请注明出处
原文链接

环境配置

vm虚拟机 ubuntu 18.04
QT版本随意
MOOS-ivp 19.8.1
MOOS-ivp的安装可以参考我之前的博文
QT构建moosapp

1、发布位置信息

在平时使用的定位传感器大多是GPS和北斗之类,它们的数据是用经纬度去表示,但在moos使用的坐标系是UTM,在.moos文件中LatOriginLongOrigin配置原点位置,而且moos中提供了转换库可以直接使用。

本次是在上一篇博客中构建的qt工程中添加
pqtMoosApp.moos文件添加,并将修改后的文件拷贝到qt工程生成的可执行文件路径下

// MOOS file

ServerHost = localhost //moosdb地址
ServerPort = 9000		//moosdb端口

LatOrigin  = 43.825300 
LongOrigin = -70.330400 //原点

ProcessConfig = pqtMoosApp
{
   AppTick   = 4
   CommsTick = 4
}

qtMoosAppMain.cpp文件需要修改,脚本生成时存在一点问题

//main函数中
string sMissionFile = "qtMoosApp.moos";
//改为 加一个p
string sMissionFile = "pqtMoosApp.moos";

pro文件

# qt工程的pro文件中添加依赖
INCLUDEPATH += $$MOOSADDER/MOOS/MOOSGeodesy/libMOOSGeodesy/include
LIBS += -L$$MOOSADDER/build/MOOS/MOOSGeodesy/lib -lMOOSGeodesy

头文件

//在qtMoosApp.h 引入头文件
#include "MOOS/libMOOSGeodesy/MOOSGeodesy.h"
//类中添加定义
  CMOOSGeodesy m_geodesy;
  double dNAV_Y,dNAV_X;
  double dLatorign,dLongorign;

cpp文件

//qtMoosApp.cpp文件中添加
//OnStartUp函数最后添加
  m_MissionReader.GetValue("LatOrigin", dLatorign);
  m_MissionReader.GetValue("LongOrigin", dLongorign);//从配置文件读取原点
  m_geodesy.Initialise(dLatorign, dLongorign);//初始化位置信息

//Iterate 函数添加
  //43.824和-70.329是传感器的经纬度
  m_geodesy.LatLong2LocalUTM(43.824,-70.329,dNAV_Y,dNAV_X);//转换
  Notify("NAV_X",dNAV_X);//发布
  Notify("NAV_Y",dNAV_Y);
  Notify("NAV_DEPTH",3.0);//深度
  Notify("NAV_HEADING",50.0);//偏航
  Notify("NAV_SPEED",2.0);//速度

在moos中显示出来

再创建一个moos配置文件,只运行MOOSDB、pNodeReporter和pMarineViewer ,其中pMarineViewer是moos自带的一个简易GUI,pNodeReporter会订阅app发布的NAV信息,然后打包成一个报表,具体可以参考官方说明

ServerHost = localhost
ServerPort = 9000
Simulator  = true
Community  = alder
MOOSTimeWarp = 1
LatOrigin  = 43.825300 
LongOrigin = -70.330400 
//------------------------------------------
// Antler configuration  block
ProcessConfig = ANTLER
{
  MSBetweenLaunches = 200
  Run = MOOSDB		@ NewConsole = false
  Run = pNodeReporter	@ NewConsole = false
  Run = pMarineViewer	@ NewConsole = false
}
//------------------------------------------
// pMarineViewer config block
ProcessConfig = pMarineViewer
{
  AppTick    = 4
  CommsTick  = 4

  TIFF_FILE            = forrest19.tif
  set_pan_x            = -90
  set_pan_y            = -280
  zoom                 = 0.65
  vehicle_shape_scale  = 1.5
  hash_delta           = 50
  hash_shade           = 0.4
  hash_viewable        = true

  scope = ODOMETRY_DIST

   // Appcast configuration
  appcast_height       = 75
  appcast_width        = 30
  appcast_viewable     = true
  appcast_color_scheme = indigo
  nodes_font_size      = medium
  procs_font_size      = medium
  appcast_font_size    = small
}

//------------------------------------------
// pNodeReporter config block
ProcessConfig = pNodeReporter
{
  AppTick	= 2
  CommsTick	= 2
  VESSEL_TYPE   = KAYAK
}

启动这个moos

pAntler moosTest.moos 

运行效果如下,海面上没有船只
在这里插入图片描述
编译qt工程并启动,会出现一个船只。
在这里插入图片描述
车辆位置的发布就是这样,其他传感器同理,根据行为的要求,发布到对应变量。

2、控制车辆运动

moos中的Helm行为会发布DESIRED_HEADING、DESIRED_SPEED、DESIRED_DEPTH三个变量,对应车辆的偏航,速度和深度。
车辆订阅这几个量,然后根据值控制运动即可。
这部分可以看一下pMarinePID这个行为的源码,这是moos自带的模拟器,可以看看它订阅了哪些变量。
路径在~/moos-ivp/ivp/src/pMarinePID下。

  Register("DESIRED_HEADING", 0);
  Register("DESIRED_SPEED", 0);
  Register("DESIRED_DEPTH", 0);

3、总结

moosapp部分基本完成,下一篇博客会简单写一下如何从多个moos社区(多个moosdb)中获取数据,供其他程序使用(例如网页的指控端),然后会开始写和行为相关的部分。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐