Jump to content

Spezielle Lösungen in lua


Empfohlene Beiträge

Hallo,

vor 4 Stunden schrieb Hawkeye:

An einer Ampel z.B. muss jeder "virtuelle" Fahrer eines Fahrzeuges beim Umschalten von Grün auf Gelb eine Entscheidung in Abhängigkeit seiner Geschwindigkeit und dem aktuellen Abstand zur Ampel treffen. Soller er bremsen, um noch rechtzeitig an der Haltelinie der Ampel zum Stehen zu kommen oder soll er beschleunigen, um vor dem Umschalten der Ampelphase von Gelb auf Rot noch über die Ampel zu huschen. ;)

vor 4 Stunden schrieb Hawkeye:

Hast du nicht Lust, dich auch mal mit solchen Aufgabestellungen zu beschäftigen? 

... habe ich mal aus Spaß an der Freude gemacht...

Bild001.thumb.jpg.7f0a5407df3953471d38d7622fad9b3c.jpg

--[[
* -> in die Klammer entsprechende Referenzspur eintragen

** Verknüpfte Objekte mit Referenzspur:
   (Gleiskontakte und Fahrzeuge werden mit der Referenzspur automalisch verknüpft!)
   Gleiskontakt "GKe" mit Schlagwort "GKref" sehr nahe am Ende der
   Referenzspur (nicht am Übergang) plazieren, so daß die Zuordnung zu Referenzspur
   eindeutig gegeben ist.

*** wenn zu stark abgebremst werden müßte -> durchfahren
--]]

local blink=layout:getEntitiesLinkedTo($("Bremsspur 1"))-- * ; **
local ref=0 -- Dummyeintrag
local auto=0 -- Dummyeintrag
for i,v in ipairs(blink) do -- verknüpfte Objekte
  if v.variables["GKref"]==keyword then -- Referenzkontakt?
    ref=v
  end
  local res=false
  res,auto=pcall(function(x) x:hasEngine() return x end,v)-- Fahrzeug mit Antrieb?
end
if auto~=0 and ref~=0 then
  auto.currentSpeed=auto.currentSpeed -- evtl. Beschleunigung abbrechen
  -- Bremsweg berechnen (Vorderkante Auto -> Ende Spur)
  local pos1=ref.transformation.position
  local pos2=auto.transformation.position
  local dx=pos1.x-pos2.x
  local dy=pos1.y-pos2.y
  local la=auto.length/2
  local l=math.sqrt(dx^2+dy^2)-la

  -- benötigte Verzögerung berechnen...
  local v=auto.currentSpeedAbs
  v=v/3.6
  local a=(v^2)/(2*l)
  vehicle.deceleration=a
  if a<20 then -- ***
    vehicle.targetSpeed=0
  end
end


Bremsversuch 01.mbp

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 31 Minuten schrieb EASY:

habe ich mal aus Spaß an der Freude gemacht...

😁👍
 

@Neo Die Berechnung des Bremsweges über die Position könnte man sich sparen, wenn es die Möglichkeit gäbe, den Abstand eines Fahrzeuges zu einem Gleiskontakt per Lua abzufragen. Dann könnten auch in Kurven tatsächliche Spurlängen ausgelesen werden und nicht nur der lineare Abstand zweier Punkte.

Dieser Punkt wurde schon häufig gewünscht und trotz verschiedener Ansätze dieses auf anderem Wege zu lösen komme ich immer wieder auf die Notwendigkeit einer solchen Funktion zurück.

Läßt sich das nicht doch realisieren?

VG,

Hawkeye

Bearbeitet von Hawkeye
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

ich habe zu dem Bremsproblem am Gleis-Ende ein kleines Demo-Beispiel gemacht:

Abbrems-Demo.thumb.jpg.31423cb1585e506c890b46af5caeb504.jpg

Weiches Abbremsen am Gleisende.mbp

Die Demo besteht aus 3 identischen Gleisabschnitten, die jeweils mit derselben Lok bestückt sind. Für eine weiche Verzögerung habe ich 0,4 m/s² eingestellt. Mit dem Taster im Vordergrund werden die Loks simultan vorwärts (Taster an) oder rückwärts (Taster aus) gestartet und auf 50 km/h beschleunigt. Der Unterschied zwischen den 3 Anordnungen besteht nun darin, dass beim der hinteren Lok die automatische Verzögerung eingeschaltet ist. Deshalb hält sie vor dem Prellbock (rechts) oder dem offenen Gleis-Ende (links) jeweils mt etwas Abstand an. Bei der mittlere Lok ist die automatische Verzögerung ausgeschaltet, weshalb sie mit unverminderter Geschwindigkeit auf den Prellbock auffährt und auch am anderen Gleis-Ende abrupt angehalten wird. Auch bei der vorderen Lok ist die automatische Verzögerung ausgeschaltet. Dort befinden sich aber unter dem Prellbock und auch am anderen Ende des Gleises jeweils ein Bremskontakt (gut sichtbar, wenn das Bild durch Anklicken vergrößert wird). Dieser bewirkt ein sanftes Abbremsen der Lok auch dann, wenn dort keine automatische Verzögerung eingestellt ist. Die Lok kommt dann mit dem Puffer genau in der Mitte des Bremskontakts sanft zum Stehen.

Ich vermute, dass genau dies in der vorangehenden Diskussion angestrebt wurde.

Viele Grüße
BahnLand

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo an alle,

ich wollte hier spezielle Lösungsansätze in lua vorstellen. Wenn es alternative Lösungsansätze gibt, macht das bitte in einem eigenen Thema, sonst wird dieses Thema aus dem Zusammenhang gerissen, wie leider schon viele Themen in diesem Forum.

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 20 Stunden schrieb EASY:

ich wollte hier spezielle Lösungsansätze in lua vorstellen

Hallo Easy, 

nimmst du denn Aufträge an? 😉 Ich versuche es einfach mal 😂

Eine nützliche Funktion wäre die Neusortierung einer Liste ab einem bestimmten Platz in der Liste.

Beispiel: Ein Kreisverkehr oder eine Kreuzung gleichberechtigter Straßen (Rechts vor Links-Regel) hat an jeder Ein- und Ausfahrt Gleiskontakte die in Listen die Vorfahrtsregeln (Objekte sind Gleiskontakte) enthalten. In den Listen der Gleiskontakte sind die gleichen Objekte vorhanden. Die Listen unterscheiden sich nur in einer Reihenfolge, wie die Objekte in den Listen stehen müssen. Damit nicht in jedem Gleiskontakt eine Liste gespeichert werden muß, wäre ein Funktion nützlich, die anhand eines Parameters der vom Gleiskontakt gesetzt wird, nur auf eine Liste zurückgreift und die Liste in der gewünschten Reihenfolge sortiert zurückgibt. So das die Liste in der Kreuzung existiert und die Gleiskontakte über diese Funktion anhand ihres Parameters die Liste neu sortiert erhalten.

Liste  (gespeichert in der Kreuzung) mit den Objekten: 

1 = GK-01 ;  2 = GK-02 ; 3 = GK-03  ; 4 = GK-04

Wird die Funktion vom jeweiligen Gleiskontakt aufgerufen, soll das folgende Ergebnis zurückgegebenen werden.

Bei Aufruf von

GK-1: Rückgabe (der Liste) in der Reihenfolge 2; 3; 4; 1

GK-2: Rückgabe in der Reihenfolge 3; 4; 1; 2

GK-3: Rückgabe in der Reihenfolge 4; 3; 2; 1

GK-4: Rückgabe in der Reihenfolge 1; 2; 3; 4

Wäre das was für dich?

VG,

Hawkeye

Bearbeitet von Hawkeye
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Hawkeye,

Ich könnte Dir folgende (logische) Reihe anbieten:

[16:54:04] Gleiskontakt wird ausgelöst -> GK-1, Golf 1, 1
[16:54:04]     Gleiskontakt wird ausgelöst
[16:54:04]         Gleiskontakt: GK-1 hat ausgelöst
[16:54:04]         Liste:
[16:54:04]         GK-2
[16:54:04]         GK-3
[16:54:04]         GK-4
[16:54:04]         GK-1
[16:54:16] Gleiskontakt wird ausgelöst -> GK-2, Golf 1, 1
[16:54:16]     Gleiskontakt wird ausgelöst
[16:54:16]         Gleiskontakt: GK-2 hat ausgelöst
[16:54:16]         Liste:
[16:54:16]         GK-3
[16:54:16]         GK-4
[16:54:16]         GK-1
[16:54:16]         GK-2
[16:54:24] Gleiskontakt wird ausgelöst -> GK-3, Golf 1, 1
[16:54:24]     Gleiskontakt wird ausgelöst
[16:54:24]         Gleiskontakt: GK-3 hat ausgelöst
[16:54:24]         Liste:
[16:54:24]         GK-4
[16:54:24]         GK-1
[16:54:24]         GK-2
[16:54:24]         GK-3
[16:54:31] Gleiskontakt wird ausgelöst -> GK-4, Golf 1, 1
[16:54:31]     Gleiskontakt wird ausgelöst
[16:54:31]         Gleiskontakt: GK-4 hat ausgelöst
[16:54:31]         Liste:
[16:54:31]         GK-1
[16:54:31]         GK-2
[16:54:31]         GK-3
[16:54:31]         GK-4

... dies wäre allerdings eine andere Reihenfolge bei GK-3 als Du angegeben hast.

vor 3 Stunden schrieb Hawkeye:

GK-3: Rückgabe in der Reihenfolge 4; 3; 2; 1

Hast Du Dich da vertippt oder muß es die von Dir angegebene Reihenfolge sein?

Gruß
EASY

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Minuten schrieb EASY:

... dies wäre allerdings eine andere Reihenfolge bei GK-3 als Du angegeben hast.

vor 3 Stunden schrieb Hawkeye:

GK-3: Rückgabe in der Reihenfolge 4; 3; 2; 1

Hast Du Dich da vertippt oder muß es die von Dir angegebene Reihenfolge sein?

 

Hallo Easy,

Du hast natürlich recht, da habe ich mich verschrieben. 🙄  Bei GK- 3 ist die Folge 4,1,2,3 das richtige Ergebnis.

Aber genau um solche Fehler geht es auch. Wie schnell baut man beim stupiden Kopieren der Listen und Ändern der Reihenfolge logische Fehler ein, die man dann nur sehr schwer identifizieren kann. 😊

Super gemacht, danke. 👍👍👍😃
 

Ich finde, das solche kleinen Funktionen für Listen sehr hilfreich sein können.

@Goetz hatte mal eine ähnliche Funktion zum Umkehren einer Liste geschrieben die aus 1,2,3,4 dann 4,3,2,1 macht. Diese ist auch sehr hilfreich.

VG,

Hawkeye

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo @Hawkeye,

... eine kleine Demoanlage zu Deinem Anliegen...
Bild001.thumb.jpg.44b96630c0e87116ad65a72effc7bfda.jpg

Gleiskontakt wird betreten sieht so aus...

* Die Funktion teilt einen String am Seperator in Teilstrings auf
Beispiel: Gleiskuntaktname: "GK-1" -> Seperator="-"
ergibt die beiden Teilstrings "GK" (a[1]) und "1" (a[2])
a[2] dient als Zahlengrundlage für das zyklische Anlegen der Ausgabeliste

Achtung: Mit diesem Verfahren liegt die Referenzzahl im Namen des Gleiskontaktes!
-> der Name darf im MBS Projekt nur einmal vorkommen!

** alternativ kann auch eine Zahlenvariable im Gleiskontakt verwendet werden
die Zeile **(a) entfällt und bei **(b) a[2] durch die Variable ersetzen.
--]]

local ausgabe={}-- Ausgabeliste
local a={}-- teporäre Liste für GK-x Namen zerlegen
local gk=contact.name -- Name des Gleiskontaktes
print("Gleiskontakt: "..gk.." hat ausgelöst")
gk:gsub("[^-]+",function(c) table.insert(a,c) end)--* / **(a)
local gkx=$("Kreuzung 1").variables["GK x"]--Liste in der Kreuzung
n=#gkx --Anzahl der Einträge in der Liste
print("Liste:")
for i=1+a[2],n+a[2]do --Liste vom Anfangswert her zyklisch erstellen **(b)
  local x=math.tointeger((i % n))-- Ergibt den Rest einer Division
  if x==0 then -- Rest=0
    table.insert(ausgabe,gkx[n])-- maximalen Wert nehmen
  else -- Rest>0
    table.insert(ausgabe,gkx[x])-- Restwert nehmen
  end
end
for i,v in ipairs(ausgabe)do --Ausgabetabelle
  print(v.name)
end

Anmerkung: Ich habe das Ereignis allen 4 Gleiskontakten zugeordnet (sinnvoll wäre evtl. mit Schlagworten zu arbeiten)...

2024-02-18-Zyklische Liste erstellen 01.mbp

Gruß
EASY2024-02-18-Zyklische Liste erstellen 01.mbp2024-02-18-Zyklische Liste erstellen 01.mbp2024-02-18-Zyklische Liste erstellen 01.mbp2024-02-18-Zyklische Liste erstellen 01.mbp

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Easy, 

vor 18 Minuten schrieb EASY:

.. eine kleine Demoanlage zu Deinem Anliegen...

super, vielen Dank. :)  Perfektes Ergebnis (y) 

vor 19 Minuten schrieb EASY:

Anmerkung: Ich habe das Ereignis allen 4 Gleiskontakten zugeordnet (sinnvoll wäre evtl. mit Schlagworten zu arbeiten)...

Ich baue es mir als function() für ein Skript-Ereignis um, dann kann ich es beliebig einsetzten. 

VG, 

Hawkeye

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Easy, 

vor 14 Stunden schrieb EASY:
gk:gsub("[^-]+",function(c) table.insert(a,c) end)--* / **(a)

Wow, das geht über meinen Horizont und übersteigt meine Kenntnisse in Lua!  :$

vor 14 Stunden schrieb EASY:
Achtung: Mit diesem Verfahren liegt die Referenzzahl im Namen des Gleiskontaktes!
-> der Name darf im MBS Projekt nur einmal vorkommen!

Danke für den Hinweis, deshalb ist mir diese Variante zu unsicher. Dann kann man die Kreuzung mit den Gleiskontakten nicht kopieren, ohne alle Bezeichnungen zu überarbeiten. Ich favorisiere deshalb deine zweite Variante mit Übergabe einer Nummer. 

Screenshot2024-02-19094538.thumb.jpg.ffda4c831779537a02939cee035ef346.jpg

Funktioniert super. 

Screenshot2024-02-19095430.thumb.jpg.c3ed1da9478640f09ca9d20039fb0ebf.jpg

Wieder was dazu gelernt. Nochmals danke. 

Damit lässt sich doch was anfangen. :D

VG, 

Hawkeye 

Bearbeitet von Hawkeye
Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...