Netlogo中的二维比例导航

时间:2018-06-09 11:43:05

标签: navigation netlogo

我正在尝试在Netlogo中实现二维比例导航,因为它是由这些公式定义的:

Prop Navigation

Definition of theta

其中v_r是速度的差异,r是视线,phi是角度。 θ应该是视线的变化,N是导航常数。因为我是二维的,所以我正在使用罪恶的公式。

我有点失落,因为在我目前的实施过程中,两个移动的物体根本不会发生碰撞。

所以,目前我正在计算这样的v_r和r,我相当确定这是正确的,因为用预定义的位置/方向测试会产生预期的结果:

;; line of sight
let rx [xcor] of target - xcor
let ry [ycor] of target - ycor
; difference in velocity components
let vx ([dx] of target * speed) - dx * predator-speed
let vy ([dy] of target * speed) - dy * predator-speed

角度是这样计算的,也应该是正确的:

let dot  (vx * rx + vy * ry)
let det  (vx * ry - vy * rx)
set angle atan det dot

总而言之,theta就是这样:

let theta (sqrt (vx ^ 2 + vy ^ 2) * sin angle) / sqrt(rx ^ 2 + ry ^ 2)

然后我计算与先前计算的theta的差异,因为第一个公式使用它的差值,将它乘以常数并将其转换为度数:

let delta-theta theta - theta-old
set theta-old theta
let turn-rate (delta-theta * N * 180 / pi)
turn-at-most turn-rate max-hunt-turn

当我运行它时,会发生以下情况(两只海龟的速度相同,一只向右移动,一只向上移动)(对于3到5之间的大多数N值,它不会发生太大变化)

enter image description here

我认为在理解最后一步时我有一些错误,因为我认为组件应该没问题。 将其置于一个问题中:我如何处理theta(或delta theta)才能更改标题?

编辑:这是实际转弯的地方:

to turn-at-most [turn max-turn]  ;; turtle procedure
  ifelse abs turn > max-turn
    [ ifelse turn > 0
        [ rt max-turn ]
        [ lt max-turn ] ]
    [ rt turn ]
end

编辑2:当前状态是我认为为theta给出的公式实际上已经是theta的衍生物了,因为使用theta而不是delta-theta给了我期望的行为(或者至少看起来像它) 。我仍然需要对此进行确认,但我会更新主题。

2 个答案:

答案 0 :(得分:2)

这不是一个答案,但是评论的时间太长了。以下是使用您的代码的完整模型。在我看来,角度的计算很好,但你确定theta的公式?无论捕食者的起始角度如何,我都会得到非常小的数字(用弧度打印到度数校正)。

globals [N]

breed [predators predator]
breed [preys prey]
turtles-own [speed]
predators-own [angle theta-old]

to setup
  clear-all
  create-preys 1
  [ setxy 0 10
    set heading 90
    set speed 1
    set color blue
  ]
  create-predators 1
  [ setxy 0 0
    set heading 0         ; experiment with this
    set speed 1
    set color red
  ]
  set N 4
  reset-ticks
end

to go
  ask one-of predators
  [ let target one-of preys
    ;; line of sight
    let rx [xcor] of target - xcor
    let ry [ycor] of target - ycor
    ; difference in velocity components
    let vx ([dx] of target * [speed] of target) - dx * speed
    let vy ([dy] of target * [speed] of target) - dy * speed
    ; calculate change in direction
    let dot  (vx * rx + vy * ry)
    let det  (vx * ry - vy * rx)
    set angle atan det dot
    type "Angle is: " print angle
    let theta (sqrt (vx ^ 2 + vy ^ 2) * sin angle) / sqrt (rx ^ 2 + ry ^ 2)
    type "Theta is: " print round (180 * theta / pi)
    let delta-theta theta - theta-old
    type "change in theta is: " print round (180 * delta-theta / pi)
    set theta-old theta
    let turn-rate (delta-theta * N * 180 / pi)
    turn-at-most turn-rate 360
  ]
  ask turtles [forward speed]
end

to turn-at-most [turn max-turn]  ;; turtle procedure
  ifelse abs turn > max-turn
    [ ifelse turn > 0
        [ rt max-turn ]
        [ lt max-turn ] ]
    [ rt turn ]
end

NetLogo没有使用公式,而是有一些很好的基元来处理方向。这似乎是subtract-headings的工作。

答案 1 :(得分:0)

已经确认,θ已经是差值,因此不需要计算δ-θ。 此外,坐标的计算没有考虑到世界的圆环形状,这引起了进一步的混乱。

; calculation of LOS using shortest distance in a torus world
let dist-target [distance myself] of target
let angle-target towards target
let rx sin angle-target * dist-target
let ry cos angle-target * dist-target
; difference in velocity components
let vx ([dx] of target * speed) - dx * predator-speed
let vy ([dy] of target * speed) - dy * predator-speed

; angle
let dot  (vx * rx + vy * ry)
let det  (vx * ry - vy * rx)
let angle 0
set angle atan det dot
; finally, theta
let theta (sqrt (vx ^ 2 + vy ^ 2) * sin angle) / sqrt(rx ^ 2 + ry ^ 2) / pi * 180
turn-at-most theta * interceptN max-hunt-turn