MOOS-ivp 实验七 关于Helm Autonomy的介绍(2)
本节承接上一节的内容,开始从无到有新建一个自己的mission文件
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
五、建立第一个自治任务 - The Bravo Mission
从这里我们开始从无到有新建一个自己的自治任务,我们主要用到Loiter behavior,但是也有机会会用到Waypoint, ConstantDepth,ConstantSpeed, 和 Timer behaviors。一开始我们先建立一个水面的自治任务,随后我们会深入学习,去建立一个水下的自治任务。
需要用到的各种行为(behaviours)的资料和helm的相关文档可以在网站Guide to helm中找到。
在这个部分我们会实现以下目的:
(1)从头新建一个执行任务(missions)
(2)熟悉Loiter行为
(3)介绍以下运行状态的概念
(4)理解perpetual标志在behaviour中的应用
1.Loiter的.bhv文件配置
Bravo任务应该具备以下功能:
(1)应该有一个Loiter行为,它在初始部署时为活动的。
(2)Loiter行为位置重心应为x=100,y=-75,半径为30米,loiter多边形有8个顶点。它的转速设置为2.5 m/s。它应该是逆时针的。
(3)它应该有一个Waypoint行为,当变量RETURN=true时,简单地将vehicle返回到车辆的起始位置x=0,y=0,就像在alpha任务中一样。
(4)Loiter行为应该利用duration参数在150秒后自动“完成”,触发返回路径点行为。
为实现上述功能,在.bhv文件添加以下行为,具体一些关键量的信息我都在代码中进行了备注:
//-------- FILE: alpha.bhv -------------
initialize DEPLOY = false //初始化参数
initialize RETURN = false
//----------------------------------------------
Behavior=BHV_Loiter
{
name = west_zone
pwt = 100
condition = DEPLOY = true
condition = RETURN = false
endflag = RETURN = true
duration = 150 //行为执行150s后,行为结束
updates = LOITER_UPDATE
perpetual = true
// 题目要求的相关参数设定
// ------------------------------------
acquire_dist = 10 // default
capture_radius = 3 // default
center_activate = false // default
clockwise = false // default
slip_radius = 15 // default
speed = 2.5 // default
spiral_factor = -2 // default
polygon = radial:: x=100,y=-75,radius=30,pts=8 // 重心、半径、定点数
post_suffix = HENRY // example
// 在界面上画出相关的图形
visual_hints = vertex_size = 1 // default
visual_hints = edge_size = 1 // default
visual_hints = vertex_color = dodger_blue // default
visual_hints = edge_color = white // default
visual_hints = nextpt_color = yellow // default
visual_hints = nextpt_lcolor = aqua // default
visual_hints = nextpt_vertex_size = 5 // default
visual_hints = label = west_zone // example
}
//返回点配置
Behavior=BHV_Waypoint
{
name = waypt_return
pwt = 100
condition = RETURN = true
condition = DEPLOY = true
perpetual = true
updates = RETURN_UPDATE
endflag = RETURN = false
endflag = DEPLOY = false
endflag = MISSION = complete
speed = 2.0
capture_radius = 2.0
slip_radius = 8.0
points = 0,0
}
.moos文件不需要进行什么改动。
2.duration和perpetual
(1)duration参数
duration参数是以秒为单位,来指定完成任务之前的执行时间。如果设定为false那么就是不指定具体的任务执行时间。默认情况下,在helm开始启动之后,duration开始计时,如果在途中进入空闲状态,保持计时。如果helm控制停车,duration仍旧计时。当计时完成之后,会发布一个endflag标志。这个behaviour可以配置通过duration_status参数,来发布一个超时前所剩余的时间,下面是其使用格式:
duration = value (positive numerical)
duration_status = value (variable name)
注意一点,只有当behaviour处于执行状态时,duration 才会被发布。duration 的状态会以最接近的四舍五入的整数来发布,直到还剩余10s的时候,以小数发布(这都是废话)。如果想要在behaviour处于空闲状态的时候,暂停duration 的计时,可以使用下面的语句进行配置:
duration_idle_decay = false // The default is true
(2)perpetual参数
当一个行为进入了完成状态之后,那么默认情况下,行为就保持在完成状态。如果将perpetual参数设置为true的话,那么虽然行为已经完成,但是还是可以发布一些跟结束相关的状态,比如发布endflag等。其格式如下:
perpetual = value
当一个行为执行时间到达之后(duration设置的),如果当perpetual参数是真的情况下,那么在行为计时结束之后,将会发布结束标志。但是行为(behaviour)也会重置其状态,当符合行为发生条件的时候duration也会重新开始计时。
3.任务示意
六、Bravo Double Loiter任务
在此部分,我们将:
探索一个不连续的任务-一个在切换模式的任务
熟悉 duration, endflag, perpetual等行为参数
学习Timer行为
我们将在Bravo任务中增加第二个Loiter任务,使得vehicle能够周期性的在两个地点切换,第二个Bravo任务将配置以下功能:
新的bravo任务应该有第二个Loiter行为,它在初始部署时不是活动的。它的位置应该是x=160,y=-50,半径为20米,Loiter多边形应该有8个顶点。它的转速应设置为2.5 m/s。
利用condition参数使两个loiter行为互斥,如condition=LOITER_REGION=west
利用duration, endflag, perpetual参数完成周期性切换,将每个持续时间设置为150s,在每个行为中使用两个endflag参数从而
-(1)触发另一个Loiter行为的condition
-(2)取消行为结束的condition
将perpetual参数设置为true,使行为永久运行,等待它的condition再次得到满足。
注意:您可能需要了解 duration timer是如何工作的。回想一下,duration特性是为所有行为定义的。默认情况下,一旦倒计时结束,计时器立即重新启动,同时perpetual设置为true,所以说在不满足行为condition时,该行为的计时器也在持续运行中。您可能希望您的行为等待,直到它再次运行(逻辑条件得到满足),然后再恢复持续时间计时器倒计时。在这种情况下,需要将duration_idle_decay设置为false。默认值为true
1. Double Loiter的文件配置
啰嗦了这么半天,主要就是设置condition,把一个行为的结束发布的endflag作为另一个行为的condition。从而实现任务在这两者之间不断进行循环,下面是.bhv的文件配置
代码如下(示例):
Behavior = BHV_Loiter
{
// General Behavior Parameters
// ---------------------------
name = loiter_west // example
pwt = 100 // default
condition = RETURN = false
condition = DEPLOY = true
condition = LOITER_REGION = west
updates = LOITER_UPDATES // example
duration = 150
endflag = LOITER_REGION = east
duration_idle_decay = false
perpetual = true
// Parameters specific to this behavior
// ------------------------------------
acquire_dist = 10 // default
capture_radius = 3 // default
center_activate = false // default
clockwise = false // default
slip_radius = 15 // default
speed = 2.5 // default
spiral_factor = -2 // default
polygon = radial:: x=100,y=-75,radius=30,pts=8 // example
post_suffix = HENRY // example
visual_hints = vertex_size = 1 // default
visual_hints = edge_size = 1 // default
visual_hints = vertex_color = dodger_blue // default
visual_hints = edge_color = white // default
visual_hints = nextpt_color = yellow // default
visual_hints = nextpt_lcolor = aqua // default
visual_hints = nextpt_vertex_size = 5 // default
visual_hints = label = zone3 // example
}
//-------------------------------------------------------
Behavior = BHV_Loiter
{
// General Behavior Parameters
// ---------------------------
name = loiter_east // example
pwt = 100 // default
condition = RETURN = false
condition = DEPLOY = true
condition = LOITER_REGION=east
updates = LOITER_UPDATES // example
duration = 150
endflag = LOITER_REGION = west
duration_idle_decay = false
perpetual = true
// Parameters specific to this behavior
// ------------------------------------
acquire_dist = 10 // default
capture_radius = 3 // default
center_activate = false // default
clockwise = false // default
slip_radius = 15 // default
speed = 2.5 // default
spiral_factor = -2 // default
polygon = radial:: x=160,y=-50,radius=20,pts=8 // example
post_suffix = HENRY // example
visual_hints = vertex_size = 1 // default
visual_hints = edge_size = 1 // default
visual_hints = vertex_color = dodger_blue // default
visual_hints = edge_color = white // default
visual_hints = nextpt_color = yellow // default
visual_hints = nextpt_lcolor = aqua // default
visual_hints = nextpt_vertex_size = 5 // default
visual_hints = label = zone3 // example
}
别忘记在开头进行初始化操作。
2.显示画面
3.附加内容
如何实现鼠标左键处生成一个多边形图案,使得水下机器人先绕着生成的图案航行,之后按照之前的设置在另一个方向的图形中航行,下面是修改代码:
修改.bhv文件内容:
非常简单,将update处的更新配置去掉
对于moos文件的修改:
left_context[loiter_point] = VIEW_POLYGON = format=radial,x=$(XPOS),y=$(YPOS),radius=20, pts=8, edge_size=1,label=loiter_west
left_context[loiter_point] = LOITER_UPDATES = "polygon = format=radial, x=$(XPOS), y=$(YPOS), radius=20, pts=8, snap=1, label=loiter_west "
left_context[loiter_point] = DEPLOY=true
left_context[loiter_point] = MOOS_MANUAL_OVERIDE=false
left_context[loiter_point] = RETURN=false
增加了对于LOITER_UPDATES的内容配置,其原理跟自动返航原理基本类似,需要配置的格式可以在The Loiter Behavior中看到。
下面是内容展示:
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。