Le forum français des radios FrSKY

Telemetry Script :- F3F training

Voir le sujet précédent Voir le sujet suivant Aller en bas

Telemetry Script :- F3F training

Message par Sacre100 le Sam 26 Juil 2014 - 12:43

Bien que je ne fasse pas de F3F, je suis en train d'élaborer un script permettant de faire des entrainements de F3F.

La définition des bases et de la ligne de sécurité est faites avec 4 points.

[Vous devez être inscrit et connecté pour voir ce lien]

L'ordre des points est important sinon la détection du franchissement des bases ou de la ligne de sécurité n'est pas correct.

Vu le temps qu'il fait, je n'ai pas pû tester en "live" le script mais seulement dans Companion. C'est vraiment une première ébauche mais je le partage quand même si cela intéresse quelqu'un pour le tester et l'améliorer (peut-être fait-il beau ailleurs qu'en Suisse).

Code:

-- F3F Training

-- Ce telemetry script bip chaque fois que l'engin travers une base
-- Il bip aussi quand l'engin taverse la ligne de sécurité

-- L'espace de course est défini par quatre points :
-->> la ligne P1-P2 défini la base de gauche
-->> la ligne P2-P3 défini la ligne de sécurité
-->> la ligne P3-P4 défini la base de droite

-- Le script s'appuie sur la fonction isLeft pour savoir si l'engin est à gauche ou à droite d'une ligne

-- Copyright M. Ricci.
-- This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
-- This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-- without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-- See theGNU General Public License for more details.

-- No du switch logique qui s'il est ON rend le script silencieux.

local silenceSwitch = 32

-- Table des quatre points GPS délimitant le parcours F3F

local tablePoint = {}
-->>            Nom du lieu, Latitude,  Longitude, Distance, Fichier
tablePoint[1] = {46.515148, 6.998986}  -- Point devant à gauche
tablePoint[2] = {46.515336, 6.999425}  -- Point à gauche
tablePoint[3] = {46.516122, 6.998788}  -- Point à droite
tablePoint[4] = {46.515979, 6.998323}  -- Point devant à droite

-- Variable calculée à l'initialisation pour gagner un peu de temps par la suite


-- Variable de travail
local silencieux = true     -- Indicateur indiquant si les annonces vocales doivent être faites ou pas

local securityState = ""    -- Indique si l'engin est à gauche (true) ou à droite (false) de la ligne de sécurité
local securityCount = 0     -- Compte le nombre de pénalité (franchissement de la ligne de sécurité)

local firstBase = ""        -- Indique ...
local nextBase = ""         -- Indique la prochaine base à traverser
local baseCount = 0         -- Compte le nombre de bases franchies (un parcour F3F c'est 11 franchissements)
local baseStart = 0         -- timer au moment du premier franchissement
local baseTime  = 0         -- temps écoulé

-- isLeft(): tests if a point is Left|On|Right of an infinite line.
--    Input:  three points point, point1, and point2
--    Return: >0 for point left of the line through point1 and point2
--            =0 for point on the line
--            <0 for point right of the line

local function isLeft(point, point1, point2)
  return (point2[2] - point1[2]) * (point[1] - point1[1]) - (point[2] -  point1[2]) * (point2[1] - point1[1])
end


local function playBeep()
  if baseCount <=8 then
    playFile("SRIPTS/SOUNDS/beep.wav")
  elseif baseCount == 8 then
    playFile("SRIPTS/SOUNDS/beep2.wav")
  else
    playFile("SRIPTS/SOUNDS/beep3.wav")
  end
  if baseCount > 0 then
    playNumber(baseCount,0,0)
  end
end


-- Fonction appelée lors de la ré-initialisation du script
local function init()
end


-- Fonction appelée lorsque l'écran de télémétrie n'est pas affiché
local function background()
  silencieux = 1024 == getValue(99 + silenceSwitch) -- rend le script silencieux si silenceSwitch est ON.

  local pointActuel = {getValue("latitude"), getValue("longitude")} -- récupère le point GPS de l'engin
  
-->> Plusieurs points pour mes test.
--   pointActuel = {46.515680, 6.998899} -- Point de test entre les bases
--   pointActuel = {46.515100, 6.999298} -- Point de test à gauche de la base
--   pointActuel = {46.516197, 6.998295} -- Point de test à droite de la base

  -- test si l'engin est derrière la ligne de sécurité
  if 0 > isLeft(pointActuel, tablePoint[2], tablePoint[3]) then
    -- test si l'on vient de traverser la ligne de sécurité
    if securityState == "G" then
        securityCount = securityCount + 1
        -->> Beep de sécurité
    end
    securityState = "D"
  else
    securityState = "G"
  end
  
  -- test si l'engin est à gauche de la base gauche
  if 0 > isLeft(pointActuel, tablePoint[1], tablePoint[2]) then
    if nextBase == "" then -- Premier passage de l'intérieur vers l'extérieur (pas de beep)
      firstBase = "G"
    elseif nextBase == "G" then -- Nème passage de l'intérieur vers l'extérieur (beep)
      baseCount = baseCount + 1
      playBeep()
    end
    nextBase = "D"
  else
    if firstBase == "G" then -- premier passage de l'extérieur vers l'intérieur (départ -> beep)
        baseStart = getTime()
        playBeep()
        firstBase = "S"
        baseCount = 0
    end
  end

  -- test si l'engin est à droite de la base droite
  if 0 > isLeft(pointActuel, tablePoint[3], tablePoint[4]) then
    if nextBase == "" then -- Premier passage de l'intérieur vers l'extérieur (pas de beep)
      firstBase = "D"
    elseif nextBase == "D" then -- Nème passage de l'intérieur vers l'extérieur (beep)
      baseCount = baseCount + 1
      playBeep()
    end
    nextBase = "G"
  else
    if firstBase == "D" then -- premier passage de l'extérieur vers l'intérieur (départ -> beep)
        baseStart = getTime()
        playBeep()
        firstBase = "S"
        baseCount = 0
    end
  end
end

-- Fonction appelée lorsque l'écran de télémétrie est affiché
local function run(event)
  background()
  lcd.drawScreenTitle("F3F Training",0,0)
  lcd.drawText(10, 13, "Prochaine base :", SMLSIZE)
  lcd.drawText(100, 10, nextBase, MIDSIZE)
  lcd.drawText(10, 27, "Nombre de base :", SMLSIZE)
  lcd.drawText(100, 24, baseCount, MIDSIZE)
  lcd.drawText(10, 41, "Temps ecoule   :", SMLSIZE)
  lcd.drawText(100, 38, baseTime, MIDSIZE)

  if silencieux then lcd.drawText(10, 50, "Alerte OFF", MIDSIZE) end
end

-- Retourne à OpenTx les trois fonctions
return { init=init, background=background, run=run }
avatar
Sacre100

Messages : 1889
Date d'inscription : 30/11/2013
Age : 60
Localisation : Blonay - Suisse

Revenir en haut Aller en bas

Re: Telemetry Script :- F3F training

Message par Sacre100 le Sam 16 Aoû 2014 - 21:51

J'ai publié une nouvelle version du script. Je n'ai pas vraiment poursuivit les tests car le rafraichissement du GPS est trop lent (toutes les 2 secondes d'après mes tests) pour avoir quelque chose de réellement utilisable.

Tant que le GPS de Frsky ne fournira pas les coordonnées GPS plus fréquemment, je mets le développement de ce script en suspens.
avatar
Sacre100

Messages : 1889
Date d'inscription : 30/11/2013
Age : 60
Localisation : Blonay - Suisse

Revenir en haut Aller en bas

Re: Telemetry Script :- F3F training

Message par Deguelle J-Bastien le Lun 4 Mai 2015 - 15:26

Salut Sacre100,

Je reviens sur ton script LUA oh combien intéressant. J'ai vu qu'une version v2 du gps était sorti avec une fréquence de 1hz. 1s pourrait rendre ton script utilisable. Sais tu si ces 1hz sont réels?

Merci
JB
avatar
Deguelle J-Bastien

Messages : 37
Date d'inscription : 22/10/2013
Age : 34

Revenir en haut Aller en bas

Re: Telemetry Script :- F3F training

Message par Sacre100 le Lun 4 Mai 2015 - 15:45

Non, 1 fois par second à la vitesse où vol nos planeurs, c'est beaucoup trop lent.

A 36km/h, en 1s, on fait 10 mètres alors imagine un F3F qui vole facilement à plus de 100km/h, l'erreur dépasserait les 30m
avatar
Sacre100

Messages : 1889
Date d'inscription : 30/11/2013
Age : 60
Localisation : Blonay - Suisse

Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum