C++Guns – RoboBlog blogging the bot

23.01.2017

Mehr Gedanken zur Automatik

Filed under: Allgemein — Tags: , — Thomas @ 14:01

Da wären wir schon bei der nächsten Idee zur Automatik. Die Automatik unterteilt sich also in drei Module: Fahrstrassensicherung, Halbautomatik, Vollautomatik.
Hier die einzelnen Aufgaben:
Die Fahrstrassensicherung hat zur Aufgabe, dass erst alle Weichen in der richtigen Position, alle beteiligen Signale auf Halt, und alle Züge die Blockstrecke verlassen haben, bevor das gewünschte Signal auf Fahrt geschaltet werden kann. Dies ist einfach durch eine Reihe von Relais zu realisieren, die alle hintereinander geschaltet sind.
So ergibt sich eine Abhänigkeit, welche Weichen/Signale von welchen Weichen/Signale/Blockstrecken abhängig sind.

In der Halbautomatik ist eingelötet, WELCHE Weichen/Signale geschaltet werden müssen, um eine Fahrstrasse zu erstellen. Die Aufgabe ist ähnlich der Fahrstrassensicherung, aber die Implementierung ist anders. Hier nochmal die genauen Unterschiede: Die Fahrstrassensicherung leitet ein Signal zum Umschalten einer Weiche/Signal erst dann durch, wenn alle anderen Weichen/Signale in der vorgegebenen Position sind. Und die Halbautomatik gibt das Signal, dass jetzt diverse Weichen/Signale umschalten sollen.
Zum besseren Verständnis ein Beispiel:
Zug auf Gleis 2 soll los fahren (also der Mensch drückt die Taste "Signal2 Fahrt"). Bevor das Signal wirklich umspringt, müssen ja folgende Bedingungen erfüllt sein:
1) Die Ausfahrtweiche muss auf Gleis2 umspringen.
2) Das Signal auf Gleis 1 muss auf Halt stehen
3) Die Blockstrecke hinter dem Bahnhof muss frei sein.

Damit die Weiche umschaltet, müssen folgende Bedingungen erfüllt sein:
4) Das Signal auf Gleis 1 muss auf Halt stehen.
5) Das Signal auf Gleis 2 muss auf Halt stehen.
6) Die Blockstrecke hinter dem Bahnhof muss frei sein.

Einige Bedingungen wie z.B. 2) und 4) kommen doppelt vor. Das wird später Optimiert. Momentan geht es nur um das Verständnis.
Was sind also die genauen Aufgaben der Fahrstrassensicherung und der Halbautomatik?
Für die Halbautomatik gilt:
Benutzer sagt Signal Gleis 2 Fahrt, dann Weiche auf Gleis 2 schalten und Signal Gleis 1 auf Halt.
Aber es passiert noch nichts, erst kommt die Fahrstrassensicherung.
Das Signal auf Gleis 1 kann eigentlich sofort auf Halt gesetzt werden. Wir haben soweit ich das beurteilen kann, keine Möglichkeit festzustellen, "dass ein Zug komplett aus dem Bahnhof ausgefahren ist".
Für die Weiche sieht es anders aus. Beide Signale stehen auf Halt. Und ein paar Sekunden später ist der Zug auch aus der Blockstrecke rausgefahren. Nun sind alle Bedingungen erfuellt und das Signal an die Weiche weitergeleitet. Diese Springt um. Damit sind auch alle Bedingungen für das Signal auf Gleis 2 erfüllt und es springt um auf Fahrt.

21.01.2017

Idee: Halbautomatik

Filed under: Allgemein — Tags: , — Thomas @ 11:01

Mir kam gerade eine recht witzige Idee: Eine Halbautomatik.
Es gibt ja einige Schaltvorgänge, die müssen immer zusammen ausgeführt werden. Zum Beispiel dreht ein Zug auf Gleis 1 seine Runden. Nun soll der Zug auf Gleis 2 los fahren. Was ist im Prinzip zu tun?
Signal Gleis 1 Halt.
Weiche (Ausfahrt) auf Gleis 2 umschalten.
Signal Gleis 2 Fahrt.

Und äquivalent, wenn der Zug auf Gleis 1 losfahren soll:
Signal Gleis 2 Halt.
Weiche auf Gleis 1 umschalten.
Signal Gleis 1 Fahrt.

Es gibt also 2 Sachen die immer passieren:
Die Weiche schaltet immer auf das Gleis mit dem Signal welches Fahrt zeigt. Beide Signale sind niemals gleichzeitig grün.

Also für die Halbautomatik gilt:
Wird ein Signal auf Fahrt geschaltet, wird automatisch das andere Signal auf Halt gestellt und die Weiche gestellt.

Dank der modularen Bauweise ist das super einfach zu realisieren. Es bedarf im Grunde nur ein paar Drahtbrücken auf einer extra Platine. Ich bin gespannt ob damit die Arbeit beim Gleisbildstellwerk vereinfacht wird.

Update 1:
Also die Idee ist gut. Das macht schon ordentlich was her, wenn die Weichen automatisch springen, nachdem man das Signal betätigt hat. Aber leider hat es nicht ganz so funktioniert wie geplant. Mir war nicht bewusst, dass die Tasterleitung, die zu den Flipflops geht, nach Masse geschaltet werden, nachdem das FF betätigt wurde. Das ist wohl ein Resultat der Taster/Relais/FF Verriegelung. Aber es ist nicht so schlimm. Die endgültige Implementierung der Halbautomatik muss sowieso mit der automatischen Fahrstrassensicherung und der eigentlichen Automatik dann abgestimmt werden.

Weiter gehts hier

How do I sort two vectors containing relative entries, using STL?

Filed under: Allgemein — Tags: — Thomas @ 11:01

How do I sort two vectors containing relative entries, using STL? [1]

Da ich mir kein Account auf stackoverflow machen konnte, (ka. warum es passierte einfach nichts), gibt es jetzt hier die richtige Antwort.
Der Ansatz von Nikos Athanasiou war schon richtig, leider total krank programmiert und mit zu vielen Schleifen. So hat der Algo. quatratische Laufzeit und ist unbrauchbar fuer grosse Datenmengen.
Ich uebernehme seinen Ansatz und tausche nur die Funktion rearrange_vector() aus. So ergibt sich eine linear-logaritmische Laufzeit dominiert durch die Sortierung. Und einen linearen Speicherverbrauch. Da aber nur integer indices gespeichert werden, ist der Zusatzverbraucht sehr gering. Gerade einmal 4byte pro Namen. Also ca. 4MB pro eine Millionen Namen. Das sollte nun wirklich niemand stören.


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <numeric>

using namespace std;

void rearrange_vector(const vector<int> indices, vector<string> &v) {
    for(int idx1=0; idx1 < v.size(); ++idx1) {
        int idx2 = indices[idx1];
        // nur dann tauschen, wenn nicht schonmal getauscht wurde,
        // und wenn ein tausch ueberhaupt notwenig ist
        if(idx2 > idx1) {
            swap(v[idx1], v[idx2]);
        }
    }
}

int main() {
    // 1. Problem space
    vector<string> firstnames = {"Dennis",  "Alexander", "Bjarne",      "James",   "James" };
    vector<string> lastnames  = {"Ritchie", "Stepanov",  "Stroustrup",  "Coplien", "Gosling" };

    // 2. vector of indices - sorted according to the order of firstnames
    vector<int> indices(firstnames.size());
    // create sequenz 0,1,2,3,...
    iota(begin(indices), end(indices), 0);

    sort(begin(indices), end(indices), [&](int i1, int i2) {
        return firstnames[i1] < firstnames[i2];
    });

    // debug
    cout << "Sorted indices\n";
    for(auto i : indices) {
        cout << i << " ";
    }
    cout << "\n";

    // 3. rearrangement according to the sorted indices
    rearrange_vector(indices, firstnames);
    rearrange_vector(indices, lastnames);

    // 4. print results
    for (size_t i=0; i < indices.size(); ++i) {
        cout << firstnames[i] << " " << lastnames[i] << endl;
    }

    return 0;
}

[1] http://stackoverflow.com/questions/25085015/how-do-i-sort-two-vectors-containing-relative-entries-using-stl

18.01.2017

Dachschaden

Filed under: Allgemein — Thomas @ 12:01

Der letzte Sturm hat zum ersten mal Ziegel runter gerissen. Drei Stück sind in den Hof geklatscht. Zum Glück nichts weiter passiert.

dachschaden2

dachschaden1

17.01.2017

Alle Aktoren per Hand steuerbar

Filed under: Allgemein — Tags: , — Thomas @ 09:01

Alle Weichen und Signale können nun per Hand ferngesteuert werden. Ein großes Zwischenziel auf dem Weg hin zur automatischen Steuerung wurde erreicht!
Das ist aber auch wirklich komfortabel. Man muss den Tisch nicht mehr vor rücken, einmal drumherum laufen und aufpassen, dass keine Kühe und Menschen beschädigt werden, wenn einfach nur die Weiche umgeschaltet werden soll. Auch das Signal kann nun bequem vom Sitzen aus gesteuert werden. Nur der Fahrstrom ist noch nicht durch das Signal geleitet. Aus Platzgründen (der liebe Gott hat den Berg nun einmal so eng erschaffen) konnte nur ein Signal für zwei Bahnsteige gebaut werden. Daher muss der Fahrstrom je nach Weichenstellung umgeschaltet werden. Und die Lokführer müssen ein wenig mehr aufpassen, wer nun fahren darf ;)

bergbahnhofsignal1

bergbahnhofsignal2

14.01.2017

Compile Icecat

Filed under: Allgemein — Tags: — Thomas @ 16:01

Get the source

wget http://mirror.gutscheinrausch.de/gnu/gnuzilla/45.5.1/icecat-45.5.1-gnu1.tar.bz2
tar xjf icecat-45.5.1-gnu1.tar.bz2
mkdir build-icecat-45.5.1

Install dependencies

apt-get install libgtk2.0-dev libgconf2-dev libdbus-glib-1-dev yasm libasound2-dev libpulse-dev libxt-dev

Perhaps you need these too

libnotify-dev libiw-dev mesa-common-dev checkinstall

Configure and compile

../icecat-45.5.1/configure --prefix=/home/kater/bin/icecat-45.5.1 --disable-gstreamer
make

gstreamer is bad software, like systemd, written from mental health people. So disable it.
You may have to correct [:space:] to [[:space:]] in the configure script.
And you may need to


cd icecat-45.5.1/browser/branding/
ln -s official/ unofficial

http://www.gnewsense.org/Documentation/3/MiscellaneousGuides/CompileGnuIcecatSeventeen

Trouble

mozalloc.h: In function ‘void* operator new(size_t, const std::nothrow_t&)’:
mozalloc.h:192:28: error: ‘malloc’ was not declared in this scope

Fixed in 48 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=822716
Use an older compiler version.

CXX=g++-5 CC=gcc-5 ../icecat-45.5.1/configure --prefix=/home/kater/bin/icecat-45.5.1 --disable-gstreamer

Powered by WordPress