Autor Wątek:  Ekrany w lokomotywach.  (Przeczytany 7401 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline mamut

  • Zasłużony dla Symulatora
  • Wiadomości: 30
    • Zobacz profil
  • Otrzymane polubienia: 0
Ekrany w lokomotywach.
« dnia: 13 Października 2012, 18:39:59 »
Witam, mam propozycję ożywienia ekranów montowanych w lokomotywach (na chwilę obecną to chyba kwestia jedynie ET22-2000 oraz ST45 która ekran w MaSzynie ma wyłączony, ale spodziewam się, że z czasem więcej nowoczesnego taboru pojawi się w zasobach MaSzyny). Propozycja sprowadza się do “zlecenia” dynamicznego tworzenia tekstury wyświetlacza językowi skryptowemu (moja propozycja to Python, z założenia tekstura wyświetlacza tworzona była by od nowa przy każdym kolejnym renderowaniu scenerii/kabiny).

Jako, że nie jest to propozycja idealna zacznę od negatywów tego podejścia:
* zachodzi potrzeba dodania do paczki plików wykonywalnych Pythona (aby nie zachodziła potrzeba instalacji środowiska wykonalnego; około 80MB)
* Python nie jest mistrzem szybkości (problem dotyczy większości języków interpretowalnych) co może powodować spowolnienia symulacji (w tym miejscu trudno mi określić jak duży wpływ na symulację może to być, rozwiązania typu tworzenie tekstury co którąś klatkę potencjalnie mogą wchodzić tutaj do gry jako niwelacja spowolnień)
* tworzenie tekstry sprowadzi się do wykonania praktycznie dowolnego kodu, co oznacza, że w którymś momencie osoby o złych intencjach mogły by w nieoficjalnych dodatkach próbować przemycić tutaj potencjalnie szkodliwy kod (teoretycznie można spróbować ograniczyć środowisko wykonywalne tak aby np. funkcje sieciowe pythona nie były dostępne; z drugiej strony pytanie czy ktoś by się pokusił na taki atak na mimo wszystko stosunkowo małą społeczność)

Na co pozwoliło by wprowadzenie tego pomysłu w życie:
* możliwość tworzenia dowolnie zachowującego się wyświetlacza w lokomotywie bez potrzeby dalszych zmian w exe (“program wyświetlacza” ładowany by był w trakcie procesu inicjacji kabiny) na podstawie wcześniej ustalonego zestawu danych przesyłanego z symulatora
* pełna kontrola nad zachowaniem wyświetlacza - aktualnie wyświetlacz w ET22-2000 jest realizowany przez nakładanie kolejnych tekstur na siebie, co w momencie gdy użytkownik nie włączy podświetlenia instrumentów - co zmienia teksturę wyświetlacza z wyłączonego na włączony - widzi kontrolki nakładane na teksturę wyłączonego wyświetlacza, co wygląda poniekąd komicznie.

Stworzyłem małe demo / proof of concept takiego rozwiązania - kręcący się sześcian teksturowany dynamicznie przez Pythona. Dla zainteresowanych udostępniam do pobrania paczkę ze źródłami programu (i kawałkiem Pythona potrzebnym do kompilacji; przykład dla Visual Studio 2010 (budować w konfiguracji Release); bez kawałka Pythona potrzebnym do uruchomienia) oraz paczkę uruchomieniową zawierającą wszystko co jest potrzebne w momencie uruchomienia.

Kod: ( http://eu07.pl/userfiles/21430/priv-py_screen_src.7z ) (458 KB)
Demo: ( http://eu07.pl/userfiles/21430/priv-py_screen_bin.7z ) (16,5 MB)

(do uruchomienia może być potrzebna paczka bibliotek visual studio 2010 do pobrania tutaj: http://www.microsoft.com/en-us/download/details.aspx?id=5555 )

Demo co minutę zmienia program wykorzystany do generowania tekstury sześcianu:
* prosty zegarek
* interfejs mający symulować ET22-2010 na podstawie
&feature=g-u-u

* Hasler nowego typu (żółte diody chyba się w rzeczywistości tak nie zapalają, ale chciałem pokazać coś więcej)
(naciśnięcie klawisza r włącza i wyłącza rotacje, naciśnięcie klawisza p przełącza tryby odświeżania tekstury przez Pythona)

Trochę dłuży opis proponowanej architektury  jest następujący: Symulator podczas ładowania inicjuje klasę Pythona po której wszystkie klasy odpowiadające za rysowanie ekranów dziedziczą. Klasa ta implementuje inicjację identyfikatora tekstury i może zwrócić go do symulatora, z wykorzystaniem wrapperów dla OpenGL wysyła teksturę do środowiska OpenGL - dzięki wykorzystaniu pyOpenGL nie ma potrzeby przesyłania obrazu pomiędzy symulatorem a pythonem gdyż jest to realizowane na poziomie kodu pyOpenGL. Klasy implementujące poszczególne ekrany implenetują dwie funkcje: konstruktor który ma zainicjować teksturę (poprzez wywołanie dziedziczonego konstruktora) oraz załadować do pamięci wszystkie potrzebne obrazy oraz metodę renderującą ekran zwracającą obiekt obrazu (PIL.Image; dziedziczone metody wywołane przez symulator zajmą się resztą - aktualizacją tekstury) przyjmującą jako argument słownik (mapę) z aktualnym stanem symulacji pojazdu.
Do inicjacji klasy potrzebna jest ścieżka do pliku w którym jest zawarta oraz jej nazwa.

Jako, że w przypadku Visual Studio wszystkie opcje kompilacji zaszyte są w plikach konfiguracji, ekwiwalent flag kompilacji dla g++ prezentował by się następująco: -Lpython/lib -Ipython/include -lpython33

W przypadku gdy pomysł zostanie zaakceptowany i wdrożony w życie spodziewam się, że w połączeniu ze skanowaniem torów na potrzeby prowadzenia pojazdów przez AI mogło by to być wyjściem dla stworzenia MaSzynowej sygnalizacji kabinowej. (luźna propozycja)

Kolejnym tematem do rozważenia po integracji Pythona i symulatora może być przekazanie części sterownia maszynami sterowanymi przez mikroprocesory - dla przykładu ET22-2000 i tempomat. W ramach planów wprowadzenia obsługi elektryki lokomotyw przez schematy drabinkowe można rozważyć taką współpracę (nie wiem w jakim stopniu schematy drabinkowe miały by być używane, jak również zdaję sobie sprawę że za ich pomocą można odwzorować sterowanie poprzez mikroprocesory - bo przecież tak je się programuje - ale wykorzystanie tutaj typowego języka programowania wydaje się ciut prostszym rozwiązaniem). (luźna propozycja)

Z mojej strony oferuję się z pomocą przy integracji proponowanego rozwiązania w exe, jak również przygotowania krótkiego kursu tworzenia ekranów na przykładzie tych zawartych w demo. Jako, że nie mam kontaktu z lokomotywami dla tworzenia bardziej rzeczywistych programów ekranów potrzebował bym dodatkowych materiałów i opisów od ludzi którzy mają z nimi styczność na co dzień.

Osobiście uważam, że zastosowanie języka skryptowego może zmobilizować pewną grupę użytkowników (zapewne niewielką) mającą umiejętności programistyczne ale nie wykorzystującą ich do rozwoju symulatora z uwagi na dostępu do kodu exe i przekonanie, że nie mają wystarczająco dużo czasu aby się o taki dostęp starać - w przypadku użycia języków skryptowych rozwój rozszerzenia jest niezależny od exe (z dokładnością do ustalonych struktur danych)

Wprawne oko mogło zauważyć, że czas na animacji “prostego zegarka” podlega drganiom podczas animacji rotacji, jest to wynik przyjętego przeze mnie podejścia do obracania elementów - dysponując jedynie metodą obrotu wokół środka ze względów wydajnościowych obracam obraz wokół środka i wyliczam gdzie punkt środka powinien zostać umieszczony po obrocie, a następnie obrazy są łączone - jako, że operacja łączenia obrazów wymaga zaadresowania przestrzeni adresem pikseli wkrada się tutaj “błąd zaokrągleń” powodujące drgania nakładanego obrazu w każdej kolejnej ramce - jest to też powód dla którego Hasler nie używa igły bazującej na zdjęciu. Wstępne oględziny innej biblioteki pyGame - często używana dotworzenia gier 2D - wskazują, że jej wykorzystanie z tym problemem by nie pomogło. Powiększenie obrazu do odpowiednich rozmiarów dające przesunięcie środka daje satysfakcjonujące wyniki, ale czas łączenia obrazów jest większy. (na chwilę obecną trudno mi powiedzieć na ile animacja obracania będzie w przyszłości potrzebna, więc trudno mi stwierdzić czy jest to problem dyskwalifikujący to rozwiązanie - np. żółte diody na Haslerze obracane są w taki sam sposób, ale jako, że kąt obrotu dla każdej jest stały nie mają żadnych problemów tego typu)

Kolejnym słówkiem komentarza, jako że środowisko Pythonowe jest w większym stopniu odseparowane od tego co się dzieje w exe, realizacja ekranów działających na zasadzie “widok z kamery” nie będzie do zrealizowania o ile widok z tych kamer nie zostanie odpowiednio przesłany do programu pythonowego w momencie wywołania funkcji rysującej ekran. (takie przyszłościowe myślenie)

Jako, że ogólna myśl poprawy obsługi ekranów zapewne zostanie ciepło przyjęta tematem dyskusji powinno być czy proponowane podejście technologiczne jest akceptowalne. Ze szczególnym zwróceniem uwagi, że wszystko tak naprawdę mogło by być zrealizowane z poziomu exe (zapewne dużo, dużo większym nakładem pracy), czy za pomocą dynamicznie ładowanych .dll (osobiście w C++ tego nie robiłem, w Delphi działało w miarę bezboleśnie) gdzie spodziewał bym się większej wydajności przy w dalszym ciągu ciut większym nakładzie pracy ale już z możliwością rozwoju niezależnego od exe.

(Podczas testów na Windows XP na maszynie wirtualnej otrzymałem błąd inicjacji tekstury ET22 wraz z ostrzerzeniem o wewnętrznym będzie maszyny wirtualnej, jeśli ktoś jeszcze z takiego windowsa korzysta prosił bym o potwierdzenie lub zaprzeczenie występowaniu takiego zjawiska - starsza wersja tego ekranu działała w tej konfiguracji)

Offline queuedEU

  • Zasłużony dla Symulatora
  • Wiadomości: 1265
    • Zobacz profil
    • Celebrity Maszyna
  • Otrzymane polubienia: 33
Odp: Ekrany w lokomotywach.
« Odpowiedź #1 dnia: 14 Października 2012, 14:30:23 »
W imieniu deweloperow oraz wszystkich aktywnie uczestniczacych w projekcie witam bardzo cieplo kolege programiste w naszym maszynowym gronie, ktory jako jeden z niewielu na 'dziendobry' przedstawia nam konkretne propozycje mimo braku wczesniejszej jawnej obecnosci na forum. Jestes bodajze druga osoba,
ktora znikad pojawia sie z tak smialymi planami i z duza checia pomocy w rozwoju Symulatora Pojazdow Szynowych MaSZyna, pomimo znikomej wiedzy o funkcjonowaniu koleji (info z drugiej reki). Tak samo zaczynal kolega @Ra coby nieco pozniej odwrocic kijem zrodla maszyny w innym, lepszym kierunku - w kierunku postepu i rewolucji. Sam tez znam 'na poziomie komunikatywnym' dwa jezyki - c++ (borland c++ builder v5.02) w ktorym jest pisana MaSZyna oraz Pascal w srodowisku Delphi a takze OpenGL.
Wprowadzenie jezyka skryptowego omawiane bylo juz dziesiatki razy, jednak zawsze na ogien szly rzeczy wazniejsze (prostsze?). Teraz gdy juz dolaczyles, masz okazje skonfrontowac swoje umiejetnosci z zawilym kodem MaSZyny w celu rozwiniecia go o jezyk skryptowy tak bardzo potrzebny do dalszej ewolucji symulatora.
Zyczymy wytrwalosci i postepow w poznawaniu zrodel MaSZyny i sukcesow w wdrazaniu planowanych implementacji.
« Ostatnia zmiana: 14 Października 2012, 14:37:16 wysłana przez queuedEU »

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6308
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 337
Odp: Ekrany w lokomotywach.
« Odpowiedź #2 dnia: 27 Października 2012, 18:47:25 »
Może ja się nie znam, ale jakoś sobie nie potrafię wyobrazić, aby się dało wtrynić Pythona do obecnego kodu. Ale OK, może się to uda. Uwadze polecam także SPT, bo tam już coś z Pythonem mocno do przodu było.
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni

Offline Jeżyk

  • Wiadomości: 161
    • Zobacz profil
  • Otrzymane polubienia: 0
Odp: Ekrany w lokomotywach.
« Odpowiedź #3 dnia: 27 Października 2012, 19:40:16 »
Hmm... blender daje możliwości bezpośredniego edytowania skryptów i programów mających pytona, potrafi zapisać to w exe itp. jest jak dobry notatnik pokazujący czy coś nie jest źle itp. Na pewno ułatwiło by to samą edycję. Ale bardziej chciałbym dodać iż posiadana on rozbudowany Logic Edytor, jak nazwa wskazuje jest on do edytowania logicznych połączeń między obiektami ale można je zamienić na polecenia itp a potem kliknięciem przekształcić w cały system umożliwiający za pomocą np. naciśnięcia ustawionego przycisku wykonać różnie polecenia np. animacja. Wszystko jest przekształcane na język pythona i zapisywane do kodu, który można wyeksportować do *exe. Innymi słowy jest to gigantyczne ułatwienie(logic edytor) dla osoby chcącej stworzyć obwody lokomotywy...

Po zatym dzięki zastosowaniu pythona bezpośrednio z blendera zaistniała by możliwość exportu do t3d modeli wraz z mappingiem, animacją i resztą. Jako, że blend posiada wbudowany silnik graficzny obsługujący najnowocześniejsze(prawie) rozwiązania, istniała by też możliwość podglądu całych scn wraz z widokiem na tory, budynki, trakcję a nie na linie czy kwadraty mające robić za te obiekty... także gotowe składy wagonów do podglądu. <-No ale to wymagało by dostosowania prostych jak i bardzo skomplikowanych skryptów.
Powróciło średniowiecze, ale bronią nie są miecze...

Offline Ra

  • Zasłużony dla Symulatora
  • Wiadomości: 6308
  • Ostatni gasi światło...
    • Zobacz profil
    • Instalator+Starter+Edytor
  • Otrzymane polubienia: 337
Odp: Ekrany w lokomotywach.
« Odpowiedź #4 dnia: 27 Października 2012, 20:04:10 »
Ja rozumiem, że jest to fajne, ale przy prowizoryczności i zasupłaniu niektórych rozwiązań w EXE trudno mi sobie wyobrazić, jak by to miało być zapięte. To raz. Dwa, że trudno mi uwierzyć w wydajność rozwiązań opartych na interpretacji języka, kiedy ja każdy kwant FPS muszę wręcz wydzierać. No ale być może da się to zrobić i nawet będzie działało.
¯\_( ͡° ͜ʖ ͡°)_/¯ Ra

Polecam: kręgarz Wojciech Walczak, projekt masarni

Offline ShaXbee

  • Administrator
  • Wiadomości: 1984
    • Zobacz profil
  • Otrzymane polubienia: 2
Odp: Ekrany w lokomotywach.
« Odpowiedź #5 dnia: 29 Października 2012, 08:37:14 »
@mamut: Propozycja wyglada super, pojawia sie tylko problem w postaci przywiazania obecnego kodu symulatora do Borland C++ Buildera (czesc kodu jest w Pascalu). Mimo wszystko jest to mozliwe do zrobienia - byc moze w nieco uproszczonej formie. Nalezy wygenerowac plik eksportu .lib do python33.dll i owrapowac recznie (przy pomocy C API Pythona) klase wedlug Twojego pomyslu. Na poczatek proponowalbym przetestowanie prostego callbacka ktory bedzie przyjmowal jako pierwszy argument uchwyt na teksture / adres do bufora / whatever, a nastepnie kwargs lub normalny argument z parametrami (prad, cisnienie, wlaczony / wylaczony). Powinno sie to latwo zintegrowac ze starym kodem.

Co do SPT - edytor jest w Pythonie ze wstawkami C++. Klient mial wrappery C++/Python, ale to jest dosyc upierdliwe i jesli kiedykolwiek znajde czas na ruszenie SPT to bedzie to raczej w formie klienta w C++ i uslug w Pythonie komunikujacych sie za pomoca socketow/ipc wiadomoscami zapakowanymi za pomoca protobuf.

Edit:
@Ra: da sie to zrobic w sposob relatywnie bezbolesny dla FPS - uzywamy dwoch PBO, symek uzywa PBO z poprzedniego przebiegu skryptu, skrypt w osobnym watku szykuje kolejna ramke.
« Ostatnia zmiana: 29 Października 2012, 09:33:00 wysłana przez ShaXbee »

Offline mamut

  • Zasłużony dla Symulatora
  • Wiadomości: 30
    • Zobacz profil
  • Otrzymane polubienia: 0
Odp: Ekrany w lokomotywach.
« Odpowiedź #6 dnia: 29 Października 2012, 12:20:17 »
@ShaXbee: Przeprowadziłem udaną kompilacje z wykorzystaniem Borlandowego kompilatora w wersji 5.5 prostszego przykładu połączenia z Pythonem (bez OpenGL), niestety wersja 5.2 nie radzi sobie z tym (brak wchar.h a zarazem brak obsługi typu wchar_t).

Co do wydajności przetwarzania mogę przytoczyć gdzieś zasłyszany cytat (chyba dotyczy sytuacji w onet.pl)
Cytuj
- jak napisać wydajny kod w Pythonie?
- napisać go w C
tutaj leżące pod spodem biblioteki graficzne są właśnie w taki sposób implementowane (mam wrażenie, że Blender na tej samej zasadzie jest napisany)

W pierwszej kolejności chce sprawdzić jak by to wyglądało przy renderowaniu do pamięci nowej tekstury wyświetlacza co którąś ramkę, dalej osobno renderowanie tekstury do pamięci w jednej ramce, a potem wysłanie jej z pamięci do OpenGL w drugiej.  Mam wrażenie, że na forum czytałem, że jak na razie nie ma wielowątkowości w MaSzynie stąd jej wprowadzanie uważam za ostateczność (trudniejszy debug, różne dziwne zachowania). [tutaj jeszcze nie wiem co oferuje Borland głównie robiłem takie rzeczy forkami na linuxie i przez OpenMP co tutaj raczej nie ma zastosowania]

Offline ShaXbee

  • Administrator
  • Wiadomości: 1984
    • Zobacz profil
  • Otrzymane polubienia: 2
Odp: Ekrany w lokomotywach.
« Odpowiedź #7 dnia: 29 Października 2012, 13:07:12 »
@mamut: Bezpieczniej ze względu na kompatybilność z Borlandem jest przesyłać do callbacku uchwyt na zmapowaną pamięć, a wywołania OpenGL trzymać po stronie C++ - dzięki temu oszczedzisz sobie też dużej zależności w postaci PyOpenGL. Jeśli chodzi o wchar_t można to obejść używając Python'a 2.7 - tam stringi są jednobajtowe.