Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
2 participants
Page 1 sur 1
Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
Pas d'innovation dans ce sujet, juste l'adaptation du travail de nicephore
On part donc de son Tracker
Le but est d'en sortir un mode ou le tracker prend le controle du tilt et du yaw de la nacelle pour les 3D ou le yaw de la machine pour les 2D.
Phase 1 inverser les valeur de tilt et de pan afin de porter le tracker (sol-air) vers la nacelle (air-sol), personnellement étant donné que j'ai autant de connaissances en lua qu'en mathématiques quantiques c'est déja un défi. Résolu
Phase 2 Créer dans la taranis une phase de vol ou les valeurs du script prennent le contrôle des voies yaw et tilt, afin que la nacelle soit sous contrôle en dehors de la phase de suivi.
Phase 3 Trouver le moyen d'injecter les coordonnées GPS d'un point précis, parceque faire le suivi du point de décollage ça n'a que peu d'intérêt.
S'il y a des points impossibles à réaliser n'hésitez pas à les soulever
On part donc de son Tracker
- Code:
--[[
Tracker d’antenne LUA
Version 1.0
Bruno Van de Velde et les membres du forum http://frskytaranis.forumactif.org
]]
local function round(val, decimal) -- fonction arrondir
-- non utilisée mais conserve pour l’avenir
if (decimal) then
return math.floor( (val * 10^decimal) + 0.5) / (10^decimal)
else
return math.floor(val+0.5)
end
end --end function round(val, decimal)
local function map2(val, fromLow, fromHigh, toLow, toHigh)
return (val - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow;
end --end function map2(val, in_min, in_max, out_min, out_max)
local function get_gps_home_info()
local HOME_lat = 0
local HOME_lon = 0
HOME_lat = getValue("pilot-latitude") -- récup. LATITUDE, LONGITUDE de station de base
HOME_lon = getValue("pilot-longitude")
return HOME_lat, HOME_lon
end --end function get_gps_home_info()
local function get_gps_uav_info()
local UAV_Lat = 0
local UAV_Lon = 0
local UAV_alt = 0
UAV_Lat = getValue("latitude") -- récup. LATITUDE, LONGITUDE, ALTITUDE du modèle
UAV_Lon = getValue("longitude")
UAV_alt = getValue("gps-altitude")
return UAV_Lat, UAV_Lon, UAV_alt
end --end function get_gps_uav_info()
local function calc_pan_tilt(lon1, lat1, lon2, lat2, alt)
local R = 6371000.0 --rayon de la terre 6371km
local a, tc1, c, dist, dLat, dLon, azimut, elev
dist = 0
lon1=lon1/180*math.pi
lat1=lat1/180*math.pi
lon2=lon2/180*math.pi
lat2=lat2/180*math.pi
a = math.atan2(math.sin(lon2-lon1)*math.cos(lat2), math.cos(lat1)*math.sin(lat2)-math.sin(lat1)*math.cos(lat2)*math.cos(lon2-lon1))
azimut = a*180/math.pi
if (azimut < 0) then
azimut = math.floor(360 + azimut)
end
-- Calcul de la distance en l'UAV et la station de base (home)
dLat = (lat2-lat1)
dLon = (lon2-lon1)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(lat1) * math.cos(lat2)
c = 2* math.asin(math.sqrt(a))
dist = 6371000 * c
elev = math.atan(alt/dist)
elev = math.floor(elev*360/(2*math.pi))
return azimut , elev, dist
end --end function calc_pan_tilt()
local function azimut_elev_to_ppm(azimut, elev)
local azimut_ppm_value = 0
local elev_ppm_value = 0
if (azimut >= 270 and azimut <= 360) or (azimut >= 0 and azimut <= 90) then
if (azimut >= 1 and azimut <= 90) then
azimut_ppm_value = math.floor(map2(azimut, 0, 90, 0, 1024))
else
azimut_ppm_value = math.floor(map2(azimut, 270, 360, -1024, 0))
end
elev_ppm_value = math.floor(map2(elev, 0, 90, -1024, 0))
else
if (azimut >= 90 and azimut <= 180) then
azimut_ppm_value = math.floor(map2(azimut, 90, 180, -1024, 0))
else
azimut_ppm_value = math.floor(map2(azimut, 180, 270, 0, 1024))
end
elev_ppm_value = math.floor(map2(elev, 90, 0, 0, 1024))
end
return azimut_ppm_value, elev_ppm_value
end -- end azimut_elev_to_ppm()
local function run()
local HOME_lat = 0
local HOME_lon = 0
local UAV_Lat = 0
local UAV_Lon = 0
local UAV_alt = 0
local AZIMUT = 0
local ELEV = 0
local DIST = 0
local AZIMUT_PPM_VALUE = 0
local ELEV_PPM_VALUE = -1024
HOME_lat, HOME_lon = get_gps_home_info()
if (HOME_lat ~= 0) and (HOME_lon ~= 0) then
UAV_Lat, UAV_Lon, UAV_alt = get_gps_uav_info()
if UAV_alt < 0 then
UAV_alt = 0
end
AZIMUT, ELEV, DIST = calc_pan_tilt(HOME_lon, HOME_lat, UAV_Lon, UAV_Lat, UAV_alt)
AZIMUT_PPM_VALUE, ELEV_PPM_VALUE = azimut_elev_to_ppm(AZIMUT, ELEV)
else
AZIMUT_PPM_VALUE = 0
ELEV_PPM_VALUE = -1024
end
return AZIMUT_PPM_VALUE, ELEV_PPM_VALUE
end --end function run()
return { run=run, output={ "PAN", "TILT"} }
Le but est d'en sortir un mode ou le tracker prend le controle du tilt et du yaw de la nacelle pour les 3D ou le yaw de la machine pour les 2D.
Phase 1 inverser les valeur de tilt et de pan afin de porter le tracker (sol-air) vers la nacelle (air-sol), personnellement étant donné que j'ai autant de connaissances en lua qu'en mathématiques quantiques c'est déja un défi. Résolu
Phase 2 Créer dans la taranis une phase de vol ou les valeurs du script prennent le contrôle des voies yaw et tilt, afin que la nacelle soit sous contrôle en dehors de la phase de suivi.
Phase 3 Trouver le moyen d'injecter les coordonnées GPS d'un point précis, parceque faire le suivi du point de décollage ça n'a que peu d'intérêt.
S'il y a des points impossibles à réaliser n'hésitez pas à les soulever
Dernière édition par maxxhimum le Lun 27 Avr 2015 - 10:22, édité 1 fois
maxxhimum- Messages : 112
Date d'inscription : 22/12/2014
Re: Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
J'ai rapatrié les messages du sujet Zaggo
La réponse de Nicéphore nous évite une modif de script, il suffit d'inverser les voies si le contrôle ne convient pas, j'aurais pu y penser, j'ai honte !!! bon ca va permettre de tester la fonction suivi, reste l'injection des coordonnées en cours de vol !!!
maxxhimum a écrit:nicephore a écrit:Hello tous
Pour le suivi d'objet en lua dans mon script tracer y-a tous ce dont vous avez besoin sauf que la valeur du tilt sera à inverser puis que je suis au sol c'est le modèle que je suis
L'idéal serait d'avoir des entrées et ainsi donner la distance de départ ensuite le lua ferais le calcul par lui même
Ou encore avec les données GPS et décollage au plus près de la cible
Je vais regarder ça de plus près car c'est une super idée
Depuis mon machin truc phone
Salut. Effectivement Nicephore ton lua de tracker est adapté pour le lua de nacelle si on inverse les valeurs, cependant le suivi n'est qu'une fonction, il faut donc pouvoir l'activer et la désactiver, pour l'entrée ce n'est pas nécessaire si on active la fonction au dessus de l'objectif. Mais de mémoire un lua s'active à l'allumage, j'ai bon ?
maxxhimum a écrit:nicephore a écrit:Hello tous
Pour le suivi d'objet en lua dans mon script tracer y-a tous ce dont vous avez besoin sauf que la valeur du tilt sera à inverser puis que je suis au sol c'est le modèle que je suis
L'idéal serait d'avoir des entrées et ainsi donner la distance de départ ensuite le lua ferais le calcul par lui même
Ou encore avec les données GPS et décollage au plus près de la cible
Je vais regarder ça de plus près car c'est une super idée
Depuis mon machin truc phone
Salut. Effectivement Nicephore ton lua de tracker est adapté pour le lua de nacelle si on inverse les valeurs, cependant le suivi n'est qu'une fonction, il faut donc pouvoir l'activer et la désactiver, pour l'entrée ce n'est pas nécessaire si on active la fonction au dessus de l'objectif. Mais de mémoire un lua s'active à l'allumage, j'ai bon ?
maxxhimum a écrit:nicephore a écrit:Mon tracker d'antenne fonctionne depuis 2 servo 180° (pan et tilt) et donc en fonction du montage il peux être nécessaire d'inverser la course d'un ou des servo. Et ça tu le fait depuis la Taranis directecment pas utile de modifier le script.
Que veux tu dire par:
pas nécessaire si on active la fonction au dessus de l'objectif
En fait sur le principe ton tracker a pour vocation de fonctionner dès le décollage, donc il s'active à l'allumage de la taranis et s'initialise dès la première mesure reçue à l'allumage de la machine afin de commencer le tracking.
En revanche sur le principe le suivi de nacelle a pour vocation de fonctionner uniquement à l'activation de la fonction par un inter, et c'est là que ça se complique, il faut que le LUA enregistre comme point zéro la position de l'objectif, et donc dans l'idéal on se positionne audessus, on active l'inter de tracking de cible, le LUA enregistre la position et à partir de ce moment la la caméra ne quitte plus l'objectif des yeux. Quand la prise de vue est terminée on désactive l'inter et on repasse en contrôle semi automatique.
Il y a toujours une combine qui consiste à couper la radio au dessus de l'objectif et de la rallumer avant que le failsafe ne prenne la main, mais si on peut faire plus sécurisé je pense que c'est mieux
https://frskytaranis.forumactif.org/t2163-lua-suivi-de-sujet-par-nacelle-2-ou-3d-portage-du-lua-tracker-de-nicephore#24275
La réponse de Nicéphore nous évite une modif de script, il suffit d'inverser les voies si le contrôle ne convient pas, j'aurais pu y penser, j'ai honte !!! bon ca va permettre de tester la fonction suivi, reste l'injection des coordonnées en cours de vol !!!
Dernière édition par maxxhimum le Lun 27 Avr 2015 - 10:23, édité 1 fois
maxxhimum- Messages : 112
Date d'inscription : 22/12/2014
Re: Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
La phase 1 est résolue par Nicéphore, je vais tester et m'atteler à la phase 2
maxxhimum- Messages : 112
Date d'inscription : 22/12/2014
Re: Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
nicephore a écrit:ha ok je viens de comprendre tu ne parles pas du tracker mais d'un pointeur afin de la caméra reste pointée sur un objectif ...
j'ai pas pris le temps de revoir ça ... Mais:
il serait possible de faire le point GPS près de la cible, enregistrer dans 2 variables ces coordonnées, dans 2 autres variable les coordonnées GPS du modèle en vol, modifier le script en conséquence par exemple
local HOME_lat = valeur GPS de la cible
local HOME_lon = valeur GPS de la cible
Ou aussi d'utiliser des input en lua.
Pour que ceci soit plus parlant
HOME_lat et lon deviens CIBLE_lat et lon
ensuite dans la fonction AZIMUT, ELEV, DIST = calc_pan_tilt(CIBLE_lon, CIBLE_lat, UAV_Lon, UAV_Lat, UAV_alt)
et d'inverser le résultat de la variable
elev = math.floor(elev*360/(2*math.pi))
elev = elev * -1
Je te laisse tester ça mais d'après moi ce serait très simple de faire comme ça.
maxxhimum- Messages : 112
Date d'inscription : 22/12/2014
Re: Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
Je reviens ici pour la suite.
Les inputs sont visible dans la fenêtre du LUA sur la partie de gauche (mais de mon coté pas encore utilisé ce type d'entrée). La déclaration d'input se fait de la sorte:
local inputs = { {“la valeur”, SOURCE } }
et le return comme ça:
return { run=run_sub, output=outputs, input=inputs}
En supposant donc un inter en source, il serait donc possible de demander à la fonction de récupérer les info GPS de l'objet pointé. Si l'opération est en vol (au dessus de la cible) alors il faudra également enregistrer l'altitude car cette dernière est utilisée dans la fonction calc_pan_tilt.
Ou encore faire un getValue sur l'inter SF (inter à 2 positions) dans la boucle run.
en position haute sa valeur est de -1024 et basse elle passe à 1024 donc:
if (getValue(97) > 0 ) then
et dans ce if enregistrer les positions GPS de la cible.
Les inputs sont visible dans la fenêtre du LUA sur la partie de gauche (mais de mon coté pas encore utilisé ce type d'entrée). La déclaration d'input se fait de la sorte:
local inputs = { {“la valeur”, SOURCE } }
et le return comme ça:
return { run=run_sub, output=outputs, input=inputs}
En supposant donc un inter en source, il serait donc possible de demander à la fonction de récupérer les info GPS de l'objet pointé. Si l'opération est en vol (au dessus de la cible) alors il faudra également enregistrer l'altitude car cette dernière est utilisée dans la fonction calc_pan_tilt.
Ou encore faire un getValue sur l'inter SF (inter à 2 positions) dans la boucle run.
en position haute sa valeur est de -1024 et basse elle passe à 1024 donc:
if (getValue(97) > 0 ) then
et dans ce if enregistrer les positions GPS de la cible.
nicephore- Messages : 612
Date d'inscription : 14/06/2014
Localisation : Créteil
Re: Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
Ok j'essaie d'appliquer tes consignes petit à petit, pour l'instant je me contente d'essayer de comprendre la syntaxe et les différents blocks de calcul.
1 Pilote et home ont été remplacés par cible
2 Les commentaires ont étés adaptés au suivi de cible
3 j'ai ajouté la ligne "ELEV = ELEV * -1" pour renvoyer la valeur inverse de l'élévation
4 j'ai ajouté la ligne "AZIMUT = AZIMUT + 180" pour renvoyer la valeur inverse de l'AZIMUT
Quand tu dis "en supposant donc un inter source" ou "ou encore en faisant un get value" ce sont deux façons différentes d'obtenir les données ? ou la même ?
1 Pilote et home ont été remplacés par cible
2 Les commentaires ont étés adaptés au suivi de cible
3 j'ai ajouté la ligne "ELEV = ELEV * -1" pour renvoyer la valeur inverse de l'élévation
4 j'ai ajouté la ligne "AZIMUT = AZIMUT + 180" pour renvoyer la valeur inverse de l'AZIMUT
- Code:
--[[
POursuite de cible
Version 1.0
Bruno Van de Velde et les membres du forum http://frskytaranis.forumactif.org
]]
local function round(val, decimal) -- fonction arrondir
-- non utilisée mais conservée pour l’avenir
if (decimal) then
return math.floor( (val * 10^decimal) + 0.5) / (10^decimal)
else
return math.floor(val+0.5)
end
end --end function round(val, decimal)
local function map2(val, fromLow, fromHigh, toLow, toHigh)
return (val - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow;
end --end function map2(val, in_min, in_max, out_min, out_max)
local function get_gps_CIBLE_info()
local CIBLE_lat = 0
local CIBLE_lon = 0
CIBLE_lat = getValue("CIBLE-latitude") -- récup. LATITUDE, LONGITUDE de station de base
CIBLE_lon = getValue("CIBLE-longitude")
return CIBLE_lat, CIBLE_lon
end --end function get_gps_CIBLE_info()
local function get_gps_uav_info()
local UAV_Lat = 0
local UAV_Lon = 0
local UAV_alt = 0
UAV_Lat = getValue("latitude") -- récup. LATITUDE, LONGITUDE, ALTITUDE du modèle
UAV_Lon = getValue("longitude")
UAV_alt = getValue("gps-altitude")
return UAV_Lat, UAV_Lon, UAV_alt
end --end function get_gps_uav_info()
local function calc_pan_tilt(lon1, lat1, lon2, lat2, alt)
local R = 6371000.0 --rayon de la terre 6371km
local a, tc1, c, dist, dLat, dLon, azimut, elev
dist = 0
lon1=lon1/180*math.pi
lat1=lat1/180*math.pi
lon2=lon2/180*math.pi
lat2=lat2/180*math.pi
a = math.atan2(math.sin(lon2-lon1)*math.cos(lat2), math.cos(lat1)*math.sin(lat2)-math.sin(lat1)*math.cos(lat2)*math.cos(lon2-lon1))
azimut = a*180/math.pi
azimut = azimut + 180
if (azimut < 0) then
azimut = math.floor(360 + azimut)
azimut = azimut + 180
end
-- Calcul de la distance entre l'UAV et la cible (cible)
dLat = (lat2-lat1)
dLon = (lon2-lon1)
a = math.sin(dLat/2) * math.sin(dLat/2) + math.sin(dLon/2) * math.sin(dLon/2) * math.cos(lat1) * math.cos(lat2)
c = 2* math.asin(math.sqrt(a))
dist = 6371000 * c
elev = math.atan(alt/dist)
elev = math.floor(elev*360/(2*math.pi))
elev = elev * -1
return azimut , elev, dist
end --end function calc_pan_tilt()
local function azimut_elev_to_ppm(azimut, elev)
local azimut_ppm_value = 0
local elev_ppm_value = 0
if (azimut >= 270 and azimut <= 360) or (azimut >= 0 and azimut <= 90) then
if (azimut >= 1 and azimut <= 90) then
azimut_ppm_value = math.floor(map2(azimut, 0, 90, 0, 1024))
else
azimut_ppm_value = math.floor(map2(azimut, 270, 360, -1024, 0))
end
elev_ppm_value = math.floor(map2(elev, 0, 90, -1024, 0))
else
if (azimut >= 90 and azimut <= 180) then
azimut_ppm_value = math.floor(map2(azimut, 90, 180, -1024, 0))
else
azimut_ppm_value = math.floor(map2(azimut, 180, 270, 0, 1024))
end
elev_ppm_value = math.floor(map2(elev, 90, 0, 0, 1024))
end
return azimut_ppm_value, elev_ppm_value
end -- end azimut_elev_to_ppm()
local function run()
local CIBLE_lat = 0
local CIBLE_lon = 0
local UAV_Lat = 0
local UAV_Lon = 0
local UAV_alt = 0
local AZIMUT = 0
local ELEV = 0
local DIST = 0
local AZIMUT_PPM_VALUE = 0
local ELEV_PPM_VALUE = -1024
CIBLE_lat, CIBLE_lon = get_gps_CIBLE_info()
if (CIBLE_lat ~= 0) and (CIBLE_lon ~= 0) then
UAV_Lat, UAV_Lon, UAV_alt = get_gps_uav_info()
if UAV_alt < 0 then
UAV_alt = 0
end
AZIMUT, ELEV, DIST = calc_pan_tilt(CIBLE_lon, CIBLE_lat, UAV_Lon, UAV_Lat, UAV_alt)
AZIMUT_PPM_VALUE, ELEV_PPM_VALUE = azimut_elev_to_ppm(AZIMUT, ELEV)
else
AZIMUT_PPM_VALUE = 0
ELEV_PPM_VALUE = -1024
end
return AZIMUT_PPM_VALUE, ELEV_PPM_VALUE
end --end function run()
return { run=run, output={ "PAN", "TILT"} }
Quand tu dis "en supposant donc un inter source" ou "ou encore en faisant un get value" ce sont deux façons différentes d'obtenir les données ? ou la même ?
maxxhimum- Messages : 112
Date d'inscription : 22/12/2014
Re: Lua Suivi de sujet par nacelle 2 ou 3D (portage du LUA Tracker de Nicephore)
maxxhimum,
Lorsque je parle de CIBLE_lat et lon c'est seulement pour que le script soit plus parlant aussi il faut nommer la variable par un nom explicite mais pas le paramètre de getValue car la paramètre CIBLE-latitude ne fait pas partie des constantes de la Taranis. Donc écrire:
CIBLE_lat = getValue("pilot-latitude")
Concernant l'inter il semble possible d'utiliser également la fonction getValue en lui passant le bon paramètre qui là est 97 ou aussi "SF". La fonction getValue vas te renvoyer la valeur de l’interrupteur "SF" exemple:
VALEUR_SF = getValue(97)
if (VALEUR_SF > 0)
-- récup. LATITUDE & LONGITUDE de la cible.
end
Regarde le guide de référence LUA tu comprendra mieux (http://www.open-tx.org/2014/07/19/Lua-reference-guide/)
Lorsque je parle de CIBLE_lat et lon c'est seulement pour que le script soit plus parlant aussi il faut nommer la variable par un nom explicite mais pas le paramètre de getValue car la paramètre CIBLE-latitude ne fait pas partie des constantes de la Taranis. Donc écrire:
CIBLE_lat = getValue("pilot-latitude")
Concernant l'inter il semble possible d'utiliser également la fonction getValue en lui passant le bon paramètre qui là est 97 ou aussi "SF". La fonction getValue vas te renvoyer la valeur de l’interrupteur "SF" exemple:
VALEUR_SF = getValue(97)
if (VALEUR_SF > 0)
-- récup. LATITUDE & LONGITUDE de la cible.
end
Regarde le guide de référence LUA tu comprendra mieux (http://www.open-tx.org/2014/07/19/Lua-reference-guide/)
nicephore- Messages : 612
Date d'inscription : 14/06/2014
Localisation : Créteil
Sujets similaires
» Question nacelle et branchement.
» Nacelle Brushless pour TBS discovery
» Config slider pour nacelle Alexmos
» Tuto : script Lua pour lisser le tilt d'une nacelle
» Comment retrouver très rapidement la coordonnée GPS pour retrouver son drône ?
» Nacelle Brushless pour TBS discovery
» Config slider pour nacelle Alexmos
» Tuto : script Lua pour lisser le tilt d'une nacelle
» Comment retrouver très rapidement la coordonnée GPS pour retrouver son drône ?
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum