前言
“车辆”这个词不太准确,但是官方用词翻译过来就是这个。在整个ivp的架构中,moosapp主要作用就是处理传感器数据和控制“车辆”的运动,而各种行为是封装好控制算法,Helm行为运行决策器,发布计算后得到的控制量。
转载请注明出处
原文链接
环境配置
vm虚拟机 ubuntu 18.04
QT版本随意
MOOS-ivp 19.8.1
MOOS-ivp的安装可以参考我之前的博文
QT构建moosapp
1、发布位置信息
在平时使用的定位传感器大多是GPS和北斗之类,它们的数据是用经纬度去表示,但在moos使用的坐标系是UTM,在.moos文件中LatOrigin和LongOrigin配置原点位置,而且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)中获取数据,供其他程序使用(例如网页的指控端),然后会开始写和行为相关的部分。