Двумерная пропорциональная навигация в Netlogo - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь реализовать двумерную пропорциональную навигацию в 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

И, сложив все вместе, тета это:

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

И затем я вычисляю разницу с ранее вычисленной тэтой, поскольку первая формула использует ее дифференциалумножьте его на постоянную и преобразуйте в градусы:

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

Когда я запускаю его, происходит следующее (обе черепахи имеют одинаковую скорость, один движется вправо, другой вверх) (он не изменяетсядля большинства значений N от 3 до 5)

enter image description here

Я предполагаю, что у меня есть некоторая ошибка в понимании последнего шага, так как я думаю, чтоКомпоненты должны быть в порядке. Чтобы задать вопрос: Что мне делать с тэтой (или дельта тэтой), чтобы получить изменение в заголовке?

Редактировать: вот где происходит фактический поворот:

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: текущее состояние таково, что я думаю, что формула, приведенная для тета, на самом деле уже является производной тета, потому что использование тета вместо дельта-тета дает мне желаемое поведение (или, по крайней мере,похоже это).Мне все еще нужно подтверждение для этого, но я буду держать ветку обновленной.

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Было подтверждено, что тета уже является разницей, поэтому вычисление дельта-тета не требуется.Кроме того, вычисление координат не учитывало форму тора мира, что вызывало дополнительную путаницу.

; 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
0 голосов
/ 09 июня 2018

Это не ответ, но он слишком длинный для комментариев.Ниже приведена полная модель с использованием вашего кода.Мне кажется, что вычисление угла в порядке, но вы уверены в формуле для тета?Я получаю очень маленькие числа для тэты (напечатанные с радианами в градусной коррекции) независимо от начального угла для хищника.

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.

...