niedziela, 4 lutego 2018

OpenCL, ROCm na Ubuntu 17.10 i Radeonie 580

Otwarta implementacja OpenGL sprawuje się świetnie w przypadku współczesnych kart AMD. Niestety z OpenCL nie jest tak łatwo i chcąc wykorzystać kartę do obliczeń, trzeba zainstalować implementację własnościową. Na szczęście AMD wydało zunifikowany sterownik, i teraz można dowolnie mieszać otwarte i własnościowe implementacje OpenGL, OpenCL i  Vulkana.

W chwili pisania tego postu ze strony AMD można pobrać sterownik w wersji 17.50.

Rozpakowujemy go w dowolnym miejscu, szukamy skryptu amgpu-pro-install i nadajemy mu prawo wykonywalności. Teraz nie pozostało nic więcej jak zainstalowanie samego OpenCL, bez naruszania OpenGL:

sudo ./amdgpu-pro-install --opencl=legacy,rocm --headless


Sprawdzenia działania OpenCL można dokonać używając komendy clinfo

Potem nie pozostaje nic więcej jak uruchomienie potrzebnej nam aplikacji.


Problemy

  1. Po instalacji sterownika może się okazać że ekran czasami przypadkowo migocze. Tę usterkę naprawia zainstalowanie kernela 4.15.
  2. Przed instalacją lepiej usunąć repozytorium PPA Oibaf-a, jeśli takiego używamy.
Nie, nie zrobiłem tego by kopać kryptowaluty. Świadomie odmawiam udziału w tej szkodliwej dla rynku podzespołów komputerowych, a także niszczącej środowisko działalności.

sobota, 27 sierpnia 2016

FreeCAD: TechDraw (rzuty 2D), elementy bazowe PartDesign

Ta krótka notka ma za zadanie przedstawić kilka ciekawych zmian i nowych funkcji programu FreeCAD.

Elementy bazowe i ciało (Body) modułu PartDesign

Wcześniej każdy nowy szkic musiał być umieszczony na geometrii istniejącej części. Stawało się to często bardzo niewygodne, wystarczy sobie wyobrazić dodanie segmentu do wałka przez obrót - na jednej z podstaw trzeba było wyciągnąć najpierw jakiś prostopadłościan, a dopiero potem narysować na nim docelowy szkic.

Niedawno został wprowadzony kontener Body, który likwiduje ten problem. Szkice mogą być umieszczane na dowolnych powierzchniach płaskich, a operacje z nich powstałe oddziałują na całą geometrię wewnątrz jednego kontenera.


Zadanie jeszcze bardziej ułatwiają elementy bazowe: płaszczyzny, osie i punkty. Więcej o budowie nowego PartDesign można przeczytaj na forum tutaj.

TechDraw - rzuty 2D

Wcześniej mieliśmy oficjalny moduł dokumentacji 2D tworzonej z modeli 3D nazwany Drawing i nieoficjalny Drawing Dimensioning. Pierwszy z nich nie umożliwiał łatwego wymiarowania ani tworzenia przekrojów, drugi dawał sobie radę z wymiarami, ale nie były one aktualizowane po zmianie kształtu części.

Nowy TechDraw rozwiązuje wszystkie te problemy. Wątek na forum.

 
Jak można zauważyć na powyższym zrzucie, jeszcze nie wszystko da się ustawić tak aby odpowiadało to zasadom rysunku technicznego. No, ale minęło dopiero półtora miesiąca od pierwszego wydania TechDraw - jest on cały czas dopracowywany. 

Nowości w module MES (FEM)

Moduł wspomagający obliczenia metodą elementów skończonych jest tak szybko i tak szeroko rozbudowywany, że trudno byłoby streści wszystkie zmiany.

Na pewno warto zwrócić uwagę na symulacje termomechaniczne opisane w tym wątku na forum.
 

Inną ciekawostką jest zaawansowany postprocesing z wykorzystaniem VTK - więcej tutaj.

Instalacja freecad-daily na Ubuntu

Opisane powyżej nowości (prócz postprocesingu VTK,który wymaga kompilacji ze źródeł) można znaleźć w prekompilowanych paczkach freecad-daily. 

Tematy warte uwagi w przyszłości

"Robust References" Redux - rozwiązanie problemu topologicznego nazewnictwa. Do tej pory było tak, że program do utrzymywania referencji numerował geometrię danego typu nie przejmując się jej położeniem czy znaczeniem. Przykład: płytka z kilkoma otworami, w jednym z nich robimy fazę. Potem zmniejszamy liczbę otworów, co się dzieje z fazą? Pojawia się na jednej z pozostałych krawędzi części, niekoniecznie w którymś z otworów. Ten problem powinien już niedługo być przeszłością.


update on FreeCAD + OpenFOAM fluid dynamic computation - pierwsze kroki w kierunku integracji solwera OpenFOAM i symulacji przepływu płynów.

piątek, 10 czerwca 2016

Otwarta fotogrametria: openMVG i openMVS

Fotogrametria pozwala na przeniesienie kształtu rzeczywistego do wirtualnego środowiska 3D za sprawą zaledwie kilku zdjęć i mocy obliczeniowej, której jest pod dostatkiem w w twoim czy moim domu. Specjalnie odniosłem się do naszych komputerów, bo chcę pokazać, że nie trzeba wykorzystywać oprogramowania w stylu Autodesk 123D Catch i obliczeń "w chmurze".

Nie potrzebny będzie też żaden drogi sprzęt, ani nawet wysokiej klasy aparat cyfrowy. Zdjęcia na potrzeby wygenerowania modelu rękawiczki, który powinieneś widzieć poniżej, zostały zrobione tym antykiem. Kosztował on mnie  450 zł jakieś 12 lat temu. Telefon, który masz w kieszeni, pewnie robi znacznie lepsze zdjęcia.


Uwaga: poniższy tekst nie jest tutorialem, a raczej luźnymi notatkami, które mają tak samo służyć mi za kilka miesięcy lub lat, jak i innym czytelnikom. Może przestawiać nieoptymalny przebieg procesu.

Jeśli nie widzisz obracalnego modelu 3D (bo przeglądarka nie obsługuje WebGL lub serwis ShareMy3D padł), to poniżej znajduje się statyczny zrzut ekranu.


Oprogramowanie - kompilacja

Opis bazuje na założeniu, że użytkownik korzysta z jakiejś współczesnej dystrybucji Linuksa. W moim przypadku jest to Kubuntu 16.04 64-bit.

Utworzyłem jeden katalog dla całego oprogramowania do fotogrametrii. W tym katalogu skompilowałem dwa pakiety:
  1. openMVG, zgodnie z oficjalnymi instrukcjami,
  2. openMVS, zgodnie z oficjalnymi instrukcjami,
  3. dodatkowo zainstalowałem MeshLab - wygodną przeglądarkę i edytor chmur punktów oraz modeli 3D, znajdziesz go w swoim ulubionym menedżerze pakietów.
O ile openMVG nie powinno sprawić problemów, to openMVS może zrobić niemiłą niespodziankę.
Pierwszym problemem w Ubuntu 16.04 jest niestabilna wersja (3.3-beta) pakietu libeigen-dev. Obszedłem ten problem pożyczając od Debiana paczkę deb w wersji 3.2.
Drugim okazało się vcglib i błąd związany z przestrzenią nazw:
error: ‘isinf’ was not declared in this scope
error: ‘isnan’ was not declared in this scope
Wystarczyło odszukać plik vcglib/vcg/math/base.h i zamienić
template int IsNAN(T t) { return isnan(t) || isinf(t); }
na
template int IsNAN(T t) { return std::isnan(t) || std::isinf(t); }

Ogólny model postępowania

Pakiet oprogramowania openMVG będzie karmiony wykonanymi przez nas zdjęciami, próbując znaleźć położenie punktów składających się na obiekt i stworzyć rzadką chmurę. Etap ten opisany jest w dokumentacji SfM: Structure from Motion. Chmura punktów będzie podstawą do pracy openMVS, które kolejno zagęści chmurę, utworzy siatkę wielokątów i w końcu oteksturuje ją.

Na początek potrzebujemy kilku zdjęć przy dobrym oświetleniu, bez użycia flesza, najlepiej z niezbyt dużym przesunięciem między nimi.

Sprytnym trikiem jest podłożenie pod obiekt czegoś o charakterystycznym wzorze, jak gazeta, czy (w moim przypadku) mapa. To znacznie poprawia skuteczność algorytmów SfM. Problematyczne okazują się za to obiekty o znacznych powierzchniach w jednolitym kolorze, odbijających światło lub częściowo przezroczystych.

Proces krok po kroku

Zakładam że openMVS i openMVG zostały skompilowane w wspólnym katalogu:
ls -l
razem 28
drwxrwxr-x  7 adi adi 4096 cze 10 20:49 ceres_build
drwxrwxr-x 12 adi adi 4096 cze  9 18:54 ceres-solver
drwxrwxr-x  6 adi adi 4096 cze  9 19:44 openMVG
drwxrwxr-x 12 adi adi 4096 cze  9 21:07 openMVG_Build
drwxrwxr-x  8 adi adi 4096 cze  9 18:42 openMVS
drwxrwxr-x  8 adi adi 4096 cze  9 19:41 openMVS_build
drwxrwxr-x  9 adi adi 4096 cze  9 18:34 vcglib
Wykonałem 10 zdjęć rękawiczki położonej na mapie Polski i wrzuciłem je (niezbyt elegancko) do katalogu openMVG_Build/software/SfM/lapka_in

Kolejny krok to uruchomienie skryptu Pythona:
python SfM_GlobalPipeline.py lapka_in lapka_global_out
I już tutaj pojawił się pierwszy zgrzyt. OpenMVG poinformowało o braku modelu aparatu cyfrowego w bazie:
Warning & Error messages:
IM000217" model "Photosmart M407" doesn't exist in the database
Wystarczyło otworzyć plik openMVG/src/openMVG/exif/sensor_width_database/sensor_width_camera_database.txt i dodać odpowiednią pozycję.

W konsoli powinniśmy zobaczyć m.in.:
Structure estimation took (s): 1.861.
#landmark found: 12600
...Generating SfM_Report.html
Found a sfm_data scene with:
 #views: 10
 #poses: 10
 #intrinsics: 1
 #tracks: 12600
10 zdjęć i 10 rozpoznanych pozycji, to dobry znak. Otwierając chmurę punktów lapka_global_out/reconstruction_global/colorized.ply w programie MeshLab zobaczymy coś takiego:

To chmura rzadka, stąd nie przypomina jeszcze naszego fotografowanego obiektu, ale warto zwrócić uwagę na zielone punkty. To pozycje aparatu podczas robienia zdjęć.

Musimy wyeksportować wyniki z openMVG do formatu przyjaznego openMVS (dokumentacja):
../../Linux-x86_64-RELEASE/openMVG_main_openMVG2openMVS -i \
lapka_global_out/reconstruction_global/sfm_data.bin -d lapka_out -o lapka_out/scene.mvs
Teraz, już używając openMVS, zagęszczamy chmurę:
../../../openMVS_build/bin/DensifyPointCloud lapka_out/scene.mvs
Tak wygląda chmura gęsta otwarta w MeshLab (plik lapka_out/scene_dense.ply):

Pozostało tylko wygenerować siatkę wielokątów i oteksturować ją:
../../../openMVS_build/bin/ReconstructMesh lapka_out/scene_dense.mvs
../../../openMVS_build/bin/TextureMesh lapka_out/scene_dense_mesh.mvs
Efekt końcowy powinien być taki jak na początku wpisu.

 

Q&A:

Q: Ile trwa cały proces?
A: Kilkanaście sekund do kilku minut, dla zadań jak w powyższym opisie.

Q: Nie masz ładniejszego przykładu niż zmiętoszona rękawiczka?
A: 30-letni misiu może być?

 
Q: W czym jest to lepsze od popularnych rozwiązań "w chmurze"?
A: Nie ma ograniczenia co do liczby zdjęć (np. Autodesk 123D Catch pozwala tylko na 70 zdjęć), nie trzeba czekać na wysłanie zdjęć na serwer, łatwiej zdiagnozować problem w razie niepowodzenie i nie trzeba zaptaszać żadnych cyrografów podczas instalacji. Bardziej zaawansowani użytkownicy mogą usprawnić proces pisząc skrypty czy przyjazne GUI (pewnie już ktoś to zrobił).

Q: Czy opisywane oprogramowanie działa na Windows?
A: Oczywiście, że tak.

Q: Coś jeszcze?
A: Obracaj modelem rękawiczki lub misia od patrząc na niego od wewnątrz a ulegniesz złudzeniu optycznemu.