继上一篇文章继续对实验进行记录
一组MOOS应用通常需要多个终端界面来进行打,这使得其操作变得很麻烦,而pAntler可以将这些内容通过一个mission文件进行表达,在这个文件中,一行代码声明的所有app都可以通过调用pAntler来启动。pAntler
基本上所有的.moos文件的配置程序的第一部分都是pAntler。一般使用ProcessConfig = Anlter声明如下内容:
ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB @ NewConsole = true/false
Run = AnotherApp @ NewConsole = true/false
...
Run = AnotherApp @ NewConsole = true/false
}
其中,MSBetweenLaunches = 200是设定启动进程之间的毫秒数,这里设置为200毫秒。其后每一行都指定了需要打开的应用以及是否为其打开控制台窗口。除了普通的启动配置之外,启动配置还包括了用别名给应用进行启动以及配置更详细的参数进行启动,具体内容可以参见网站的文档。
这里做一个实验,我们使用pAntler来启动MOOSDB的同时启动uXMS。
1.首先先创建一个mission文件并且将其保存为db_and_uxms.moos。其内容为:
// (wget http://oceanai.mit.edu/2.680/examples/db_and_uxms.moos)
ServerHost = localhost
ServerPort = 9000
Community = alpha
ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB @ NewConsole = false
Run = uXMS @ NewConsole = true
}
ProcessConfig = uXMS
{
AppTick = 4
CommsTick = 4
VAR = DB_CLIENTS, DB_UPTIME, DB_TIME
DISPLAY_SOURCE = true
DISPLAY_TIME = true
COLOR_MAP = DB_CLIENTS, red
}
当然也可以通过更简单的方式获得输入以下命令,从官网中下载示例文件:
wget --no-check-certificate http://oceanai.mit.edu/2.680/examples/db_and_uxms.moos
接下来输入以下命令进行执行
pAntler db_and_uxms.moos
这位uXMS打开了一个新的命令控制窗口,并且通过初始配置打开了source和time,但是没有community
如下图所示:
3.uXMS的配置块内容可以通过在命令行输入:
uXMS --example
来进行查看,此时实验要求对启动文件进行修改,使其可以查看DB_UPTIME变量的历史消息记录,以及打开一个新的控制台窗口。修改启动文件如下:
ServerHost = localhost
ServerPort = 9000
Community = alpha
ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB @ NewConsole = false
Run = uXMS @ NewConsole = true
}
ProcessConfig = uXMS
{
AppTick = 4
CommsTick = 4
history_var = DB_UPTIME
DISPLAY_SOURCE = true
DISPLAY_TIME = true
COLOR_MAP = DB_UPTIME, red
content_mode = history // default (or history,procs)
}
添加进去了启动模式为history,修改了scope的变量,修改之后输出界面为:
因为此部分内容需要知道一些关于uTimerScript模块参数的配置,所以需要先对其进行格式上的学习,具体资料可以参考网站:
uTimerScript
uTimerScript模块可以让用户编写一些预先配置好的设置发布到MOOSDB中,以下是配置事件列表的具体格式
event = var=<MOOSVar>, val=<value>, [time=<time-of-event>]
关键词event、val、var、time都不区分大小写,但是<>中的内容需要注意大小写。
1.设置时间范围 time-of-evet
此时间设置必须是一个大于等于零的值,其代表含义是启动app或者从暂停状态再启动之后所经历的时间。在配置表中列举的配置内容不需要自己进行排列,uTimerScript会按照顺序执行。而我们在设置时间的时候可以把时间设置成如下形式,其中5:10的意思是在5s-10s的时间内概率平均的发生此事件。
event = var=COUNTER_A, val=10, time=5:10
2.重置脚本
一个脚本的重置,可以通过脚本之外的变量重置来实现,或者脚本内部来进行设置。 外部设置UTS_RESET为“reset 或者“ture”可以对脚本进行重置。如果要重置这个参数的名字,用另外的参数进行替代,可以用调用以下格式:
reset var = <moos-variable> // Default is UTS RESET
设置reset的时间参数,这个参数也可以设置为all-posted,表示所有时间发布结束后重置,当UTS_RESET发生设置的时候,不论reset的时间设置为多少都会立即重置:
reset time = <time-or-condition> // Default is "none"
以下参数用来配置可以重置的最大次数,一般默认是nolimit不对其进行限制:
reset max = <amount> // Default is "nolimit"
以下配置可以在重新启动时指定脚本重新计算相关的时间参数
shuffle = false // Default is "true"
如果要对脚本进行暂停可以使用以下命令,其参数是一个bool量,为真时暂停,为假时关闭暂停。而下面的命令是对外部应用发布控制暂停的变量进行命名,默认是UTS_PAUSE
paused = <Boolean>
pause var = <MOOSVar> // Default is UTS PAUSE
使用逻辑条件来对脚本进行暂停,下面是一个示例的用法
condition = <logic-expression>
condition = NAV_DEPTH < 0.2
1.练习要求:
(1)将代码进行改进,使得一开始是暂停状态,可以通过uPokeDB来进行启动
(2)同时打开两个uXMS界面进行变量观察,观察的变量分别命名为COUNTER_A和COUNTER_B,分别在两个uTimerScript模块中进行计数
(3)加入一个逻辑条件语句来控制变量的计数,使得COUNTER_A>5的时候COUNTER_B开始进行计数。
(4)添加pLogger模块使得可以观察脚本运行的系统日志
2.通过上面的解释我们可以通过设置
paused=ture
来使得脚本一开始处于暂停状态,启动脚本可以输入如下命令进行启动:
uPokeDB UTS_PAUSE=false utscript.moos
3.建立两个uTimerScript模块需要分别起不同的名字,可以看到在是否启动控制台选项之后就可以对模块单独进行起名。
ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB @ NewConsole = false
Run = uXMS @ NewConsole = true ~uXMS_COUNTER_A
Run = uXMS @ NewConsole = true ~uXMS_COUNTER_B
Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_A
Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_B
Run = pLogger @ NewConsole = false
}
启动界面时可以看到出现两个控制台,分别观察两个不同变量
4.需要加入一个条件语句来,使得COUNTER_A>5的时候COUNTER_B开始进行计数。
condition = COUNTER A > 5
5.在脚本中,添加pLogger模块
ProcessConfig = pLogger
{
AsyncLog = true
WildCardLogging = true
WildCardOmitPattern = *_STATUS
}
运行结束之后可以找到脚本日志,可以通过下面的命令查看跟变量相关的具体内容
aloggrep COUNTER_A COUNTER_B MOOSLog_29_9_2020_____15_37_36/MOOSLog_29_9_2020_____15_37_36.alog
可以看到脚本内容如下所示:
7.所有脚本代码:
ServerHost = localhost
ServerPort = 9000
Community = alpha
ProcessConfig = ANTLER
{
MSBetweenLaunches = 200
Run = MOOSDB @ NewConsole = false
Run = uXMS @ NewConsole = true ~uXMS_COUNTER_A
Run = uXMS @ NewConsole = true ~uXMS_COUNTER_B
Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_A
Run = uTimerScript @ NewConsole = false ~uTimerScript_COUNTER_B
Run = pLogger @ NewConsole = false
}
ProcessConfig = uXMS_COUNTER_A
{
AppTick = 4
CommsTick = 4
VAR = COUNTER_A, DB_CLIENTS, DB_UPTIME
COLOR_MAP = COUNTER_A, red
HISTORY_VAR = COUNTER_A
}
ProcessConfig = uXMS_COUNTER_B
{
AppTick = 4
CommsTick = 4
VAR = COUNTER_B, DB_CLIENTS, DB_UPTIME
COLOR_MAP = COUNTER_B, red
HISTORY_VAR = COUNTER_B
}
ProcessConfig = uTimerScript_COUNTER_A
{
AppTick = 4
CommsTick = 4
paused = true
pause_var = UTS_PAUSE
event = var=COUNTER_A, val=1, time=0.5
event = var=COUNTER_A, val=2, time=1.0
event = var=COUNTER_A, val=3, time=1.5
event = var=COUNTER_A, val=4, time=2.0
event = var=COUNTER_A, val=5, time=2.5
event = var=COUNTER_A, val=6, time=3.0
event = var=COUNTER_A, val=7, time=3.5
event = var=COUNTER_A, val=9, time=4.5
event = var=COUNTER_A, val=10, time=5.0
reset_max = nolimit
reset_time = all-posted
}
ProcessConfig = uTimerScript_COUNTER_B
{
AppTick = 4
CommsTick = 4
paused = true
pause_var = UTS_PAUSE
condition = COUNTER_A > 5
event = var=COUNTER_B, val=1, time=0.5
event = var=COUNTER_B, val=2, time=1.0
event = var=COUNTER_B, val=3, time=1.5
event = var=COUNTER_B, val=4, time=2.0
event = var=COUNTER_B, val=5, time=2.5
event = var=COUNTER_B, val=6, time=3.0
event = var=COUNTER_B, val=7, time=3.5
event = var=COUNTER_B, val=8, time=4.0
event = var=COUNTER_B, val=9, time=4.5
event = var=COUNTER_B, val=10, time=5.0
reset_max = nolimit
reset_time = all-posted
}
ProcessConfig = pLogger
{
AsyncLog = true
WildCardLogging = true
WildCardOmitPattern = *_STATUS
}
我以为两个篇章能写完,结果内容有点多,我扩充到三篇来写吧。
2011年8月16日,北京798艺术中心。台上,雷军每公布一项技术参数,台下就传来一阵几乎要掀翻屋顶的声浪。一位记者问:“这都是哪请来的托,太敬业了!”工作人员只得实话实说:“都是自己来的,我们也没想到。”这一幕,像极了4年前乔布斯在旧金山。“手机键盘、触控笔?谁要这些玩意儿呢?”在莫斯康尼会议中心举行的第一代iPhone发布会上,乔布斯向全世界宣布:苹果要重新发明手机!这...
面试是公司选择你,Offer 是你选择公司。程序员这个职业在初期,门槛比较低,快速掌握一门编程语言,在工作中能参与有挑战且持续的项目,加入有活力和学习氛围的团队,初级程序员很快就能成长为高级工程师。这也是很多老程序员的焦虑所在,一旦自己稍微松懈一点,没能及时迭代自己的能力模型,那行业内不断涌入的新人就可能对自己形成威胁,无论是技术水平,还是充沛的体力和精力,新人都充满竞争力,并且,企业需要付给...
var listData = [ {id:"1234",name:"bob"}, {id:"2451",name:"mary"}, {id:"6666",name:"tom"}, {id:"5675",name:"jerry"}, {id:"8421",name:"ken"},]let index = listData.findIndex( item...
一、概述在APP的开发过程中,可能需要利用手势操作去实现一些功能或者效果。UIKit框架提供了检测常见手势的预定义手势识别器。 在手势开发上,最好尽可能使用预定义的手势识别器,因为它们的简单性减少了我们的的代码量。当然,我们也可以自定义一些特殊的手势,具体的可以查看官方文档学习:Creating a Custom Gesture Recognizer。iOS中的事件可以分为3大类型:触
一开始以为 将图片导入Unity时, 将其 图片转为sprite 以为就可以直接 load为sprite了,可是 一直报null异常原来是 加载后Debug出来是这个类型因为 加载的时候 是Texture2D类型,而我硬生生将其 转为 sprite,难怪会报异常了,其实 用 Load方法的话,一般会Loade第一个,而不会load子物体(sprite),然后sprit...
项目简介1、最近学习了Python,Python这么火确实是有原因的。比较容易上手,当然也得有基础知识才好上手。语法比较人性化,既面向过程也可以面向对象。最喜欢它的缩进!太英明了,大大减少数括号的工作~2、正好有个外贸网站的项目,就采用DJANGO框架写了一个,速度快!DJANGO建站的速度那是杠杠的。正好Paypal又有Python的SDK,虽然是2.7的。改吧改吧也就能用了,不过这里面坑比...
一、ViVim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。下面的基础知识内容都来自于前辈博客Vim 有以下几个模式:正常(normal)模式,缺省的编辑模式;下面如果不加特殊说明,...
本文首发于“小白学视觉”微信公众号,欢迎关注公众号本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。前面我们通过图像直方图反向投影的方式在图像中寻找模板图像,由...
用jquery获取form表单值的方法总结 用jquery获取form表单值的方法总结: jquery获取radio单选按钮的值 $("input[name='items']:checked").val(); jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关 获取一组radio被选中项的值 var item
这种错误一般是tensorflow中的类或对象指定错误。第十一行第十一行在contrib.后加上layers.
获取脑图方式请看最下面!JVM类文件(Class文件)结构ClassFile {u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info constant_pool[constant_pool_count-1];u2 access_flags;u2
本人最近因为自身需求,开始接触了XML技术,利用dom4j做一个对XML读写操作的时候,给原XML添加一条数据时遇到了这个错误。下面分享一下自己解决的心路历程吧。这是xml文件的内容: 张三 20 男 杭州 001 李四