Monday, July 6, 2020

Events during my blogging hiatus: Part 1

My previous post was on August 20, 2016.
I went to a hiatus from blogging for certain reasons.


The fall of a small robotics company
In July 2015, I joined a small robotics start-up company called Bionic Robotics GmbH in Darmstadt. The company was not really that young at that time. It started as a spin-off project from the Technical University of Darmstadt. I found the job there as a software engineer satisfying, despite the under-average salary.

At the end of August 2016, the company's financial status forced it to file for a temporary insolvency. Unfortunately in October 2016, the final negotiation with the only remaining possible new investor hit the wall. Consequently the company had to be shut down.

I could have prepared myself during the temporary insolvency to look out for a new job. But I did not, because I wanted to remain loyal and I was optimistic of the company's future. After all, we did sell most of our robots.

Reflection

I took pride in staying with the company till the very end. The experience from working there was absolutely educative.
I learned to use Linux, coded with Python, worked with the Robot Operating System (ROS) framework, improved my skills with the Qt framework, and most important of all: I did delve into robotics. My job there covered the software development, as well as the practical handling of the robotic arms. I can say that I did practice my profession as a mechatronics engineer.



As an employee of a small and understaffed company, I acknowledged that I was expected to do more than just software development. I was sent out for integration and reparation jobs at customers' sites and support the company's booth at certain industrial fairs.


My last outstation assignment was in Switzerland, where I spent one day to conduct an instruction course for our Swiss customers - in full German.





Next: Being jobless for two months in Germany.

Saturday, August 20, 2016

Robotics, Coding, Linux, and Version Controlling

At this time, the author works for a small robotics company in Darmstadt, Germany. The company's product is an industrial lightweight robotic arm - aiming for collaborative robotics solutions in automotive, pharmaceutical, and every other industries.

Fig. 1: Self-built 3 DOF robot - using 3 servos, LEGO pieces, Arduino board, and ROS.


[YouTube gave a warning that the video below is unlisted - "Think twice before you share." The author has decided to go ahead as the author himself is featured in the video.]





Coding

The author has to delve into software development with ROS (Robot Operating System): supporting the further development of the software to operate the robotic arm above. The languages C++ and Python and the Qt library play pivotal roles for ROS.

The author took a crash course for Python on Codecademy, right before taking the current job.

Linux

For ROS, the author has to opt to Ubuntu. At the office, the Unity desktop is set to default (K.I.S.S. - keep it simple, stupid). But at home, the author has also installed Ubuntu on his main and old laptops: with the desktop Gnome for the former and KDE for the latter.

Consequently the author has come to enjoy coding with Bash scripting on Linux terminal. The author has put this newly acquired skill in the maintenance of his comic book archives.

Version Controlling

Version controlling with Git is also a part of the job - thus making the author shifting slowly to Git from SVN, which the author has accustomed to since his postgraduate days at Hochschule Darmstadt.

For private / independent projects, the author uses his Dropbox for repository purposes. This is not ideal, as it doubles the storage usage for every single project on the local drive. Another option is to use the public repository provided by Github, or use its other paid options.

Tuesday, June 30, 2015

Job Hunting in Germany

The author has started to look for a job as soon as he graduated in the end of January 2015. The job search started seriously in February and then became more aggressive from April 2015 until the middle of May 2015. This post summarizes the process of job hunting by the author. With pleasure, the author has ended this hunt recently. The rōnin has finally found a new master to serve.

 

Online Profile

As suggested by local peers, the author has set up his profile on the website XING.com, considered as the top network site in Germany, Austria, and Switzerland. It turned out to be positive, as the author has been approached by recruiters per e-mails and telephones. Apart from that, other websites have also been used, namely StepStone.de, MONSTER.de, and access.de. The author strongly  advises readers to avoid their facebook profiles from being accessible to prospective employers.

 

Resumé / CV

The author has prepared 2-page CVs - in German and English. The 2 pages were due to the intention of being simple and direct / straight to the point, as these are common in Germany. One of the recruiters, hinted on how the author's resumé / CV can be improved. The recruiter suggested to add the summary of the 2 theses written by the author into the CV. Consequently the author added 2 more pages to each CV - 1 page of summary for each thesis. The following figures give an overview of the author's German CV.
Figure 1 - The author's CV, written in German.

Figure 2 - 2 summaries in the CV for the 2 theses by the writer.  

Results

The following figure sums up the job applications sent by the author.
Figure 3 - The numbers of sent job applications, rejections, and interviews experienced by the writer from February 2015 until middle of June 2015.

  Interviews

Prior to certain face-to-face interviews, there were phone interviews. Regardless of the type of an interview, job hunters must do their homework ahead. The expected questions were - academic background, projects, earlier experience, thesis/dissertation, expected salary, etc.

If an interview is conducted far away from the residence of the job hunter, reimbursement for the travel expenses can be requested after the interview. Regarding the travel method, there were 2 times when the author had to switch to express bus, instead of long distance train. These were due to the strikes by Gewerkschaft Deutscher Lokomotivführer or GDL (trade union for German train crews).

The author went as far as to München / Munich for a job interview. There were also interviews in the cities Herzogenaurach (near Nürnberg / Nuremberg), Rüsselsheim, and Stuttgart. Finally the author has landed a job in Darmstadt, near to his former college.

 

Salary, Taxes, and Living Costs

This article by IngenieurKarriere.de can help engineering graduates to estimate an expected salary for entry level. On the other hand, several websites also provide assistance in calculating monthly income after taxes, e.g., Steuerklassen.com and Brutto Netto Rechner.

The main factor for the author to estimate an expected salary is the total of living costs per month. This consists of:

  • rent and utilities,
  • broadcasting services tax,
  • cellphone bill,
  • laundry,
  • commute/train ticket, and
  • workdays' expenses.
 Save before spending. Spend what is left after saving.
[Credits to Warren Buffett]

Apart from that, savings money for general purposes and investments is also crucial.

 

Conclusion

It has been very adventurous and challenging in finding a job in Germany. Foreign job hunters are advised to sharpen and refresh their German language skill, which will be definitely advantageous during any interview. The author looks forward to share this experience with other Malaysian students, probably in a formal presentation session or talk.

Tuesday, February 3, 2015

3D Point Cloud Processing with PCL

"What's better than 2D?"

Three dimensional (3D) point cloud can be understood as a set of points in the Euclidean coordinate system, with every point has X-, Y-, and Z-coordinates. Combined with the corresponding normal vectors or normals, this set forms oriented points - providing 6 degrees of freedom (DOF). This article aims to briefly introduce readers to the 3D point cloud processing with an open source library called Point Cloud Library (PCL). Two examples of using PCL are given and visualized.





A 3D point cloud can be acquired using range sensors such as Microsoft Kinect, ASUS Xtion, or laser scanners. These devices apply either triangulation or time-of-flight (TOF). Apart from that, using the autofocus system on conventional industrial cameras can also deliver 3D point clouds.

To process and visualize 3D point clouds, PCL offers various modules, e.g., filtering, segmentation, I/O, data structures, and visualization. The author has been tasked to implement several of these features in the open source application for image processing called MILAN. The implementations are available within one particular plug-in of MILAN. The following images are examples of using MILAN with PCL.

Figure 1 - The features of PCL in MILAN are accessible via a toolbox docked to the right side as seen above. This is also where the Kinect sensor can be used and controlled.

Figure 2: PCL Downsampling Filter, to reduce the size of an input cloud (left - 63792 vertices) to an output (right - 20462 vertices).
Figure 3: PCL Euclidean Cluster Segmentation, to segmentize spatially isolated point clouds.

Before using MILAN, the author has used the PCL tutorials and implemented them in separate Microsoft Visual Studio (MSVS) 2008 projects. The Service Packet 1 (SP 1) of this IDE needs to be installed, otherwise the developers can only code in Release mode.

Another alternative to MSVS is the Qt Creator. The author has covered this in one post on the app FingKinector 2.0. It was developed with Qt 4 along OpenCV 2.4.5. Without writing any .PRO file for the Qt project, the author used a CMakeLists.txt entirely to build this Qt project.

Sunday, December 7, 2014

Hands-on Learning OpenCV with Qt Creator in Ubuntu

"One App to learn them all,
One App to find them,
One App to apply them all and in the Creator bind them."

In this entry the writer presents his results from putting some lessons from the book OpenCV 2 Computer Vision Application Programming Cookbook by Robert Laganière into practice by incorporating the implementations into just one application. The IDE chosen for this is Qt Creator on the OS Ubuntu Gnome (a Linux variant). Initially the application is intended to comply with the principle of K.I.S.S. - Keep It Simple and Stupid. The designated application is supposed to process an input image according to the lessons by respective chapter of the book. The application should consist only of buttons and space for output images. After a certain point, the writer halted and decided to revisit some fundamentals in software architecture.

The cookbook mentioned above is de facto the standard book to learn OpenCV 2 for beginners. Consisting of 10 chapters, the book begins by introducing the steps to install OpenCV, then moves to the creating of OpenCV projects in MS Visual Studio and Qt. Various algorithms for image processing are elaborated in the next chapters - filtering, morphological operations, etc.



Previously the writer had successfully installed OpenCV in Windows XP and Windows 7. Taking the next level, the writer challenges himself to try OpenCV in a Linux system, which in this case refers to Ubuntu. By using Qt in Ubuntu, the usage of a CMakeLists is replaced with the editing the .pro file for the Qt project. Designing and implementing the GUI file for the application happen within the same platform - Qt Creator.

The result is an application called FingsCV, seen here in the Fig. 0 below.

Fig. 0 - Overview of the application FingsCV (No copyright infringement is intended for the Transformers' Decepticon logo. For academic and non-commercial purpose only).

The Simple and Stupid Design

Fig. 1 below shows the design of the GUI in the designer section of Qt Creator. The GUI consists only of one button to trigger a dialog window to load an input image. The main part of the GUI is only a tab widget that has several tabs that signify the respective chapters.

Fig. 1 - The design of the GUI in Qt Creator.

Results

Fig. 2 below displays the input image used for the operations in the tab Ch. 1 and Ch. 2.

Fig. 2 - Test image (Photo courtesy of a popular cosplayer's Instagram page - no copyright infringement is intended. For academic purpose only).
Chapter 1 of the cookbook is basically about one of the simplest operations in image processing and editing - reflecting or flipping of an image. The result from flipping the test image is shown in Fig. 3 below.

Fig. 3 - The output of flipping the test image from Fig. 2.
Then in Chapter 2, more operations are introduced  - putting salt and pepper (white and black pixels) effect, color reducing, and image sharpening. Fig. 4 below shows the after-effect of random and synthetic white pixels (the 'salt') on the test image.

Fig. 4 - Test image with added random salt - marked by the tiny white pixels.

Discussion

In the beginning, the writer used OpenCV's HighGUI for visualization of images. This had a conflict with Qt, while the latter has its own built-in implementations for image displays. Albeit no error and just warnings, the writer switched to just use Qt's features such as QImage, QPixmap, etc for the visualizations.

The writer decided to stop this development until Chapter 2, because the Chapter 3 requires more interactions via the GUI - input parameters, signal buttons, etc. This ought to be done in a separate application. To implement the next lessons, the application should be more interactive and pragmatic. 

Future Prospects

The predicaments from Chapter 3 led the writer to refer a book from his college's library - Software Architecture - Foundations, Theory, and Practice by Richard N. Taylor.

From this book by R. Taylor, it looks like the process of software development shouldn't be taken lightly. In simple words, the development of a software can be summed up in these steps:

  • Listing of the requirements
  • Designing
  • Implementing - the coding
  • Analysis and testing
  • Evolution and maintenance


Thus, the K.I.S.S. should be modified to 'Keep It Stupid and Simple - enough'. The last word 'enough' implies that a certain degree of requirements must be firstly met.

At the moment, the writer considers that every version of this app should be dedicated to only one chapter of the cookbook. Therefore separate Qt projects for all the chapters of the cookbook.


Friday, May 30, 2014

FingKinector 2.0 - on Qt Creator with PCL and OpenCV

How can one build a Qt project that implements both OpenCV and Point Cloud Library (PCL)? The writer aims to have the best of both worlds available on the same platform. This article briefs on the writer's attempt to achieve that objective with one CMakeLists file and the development within the Qt Creator. The project in this article is FingKinector 2.0, the writer's updated version of a simple application for Microsoft Kinect sensor.




Mainly the writer deals with 3-dimensional point clouds, which is why the PCL is used for most of the writer's C++ code. But when it comes to situations that require linear algebra calculations especially matrix operations (e.g. transformation), the writer finds OpenCV library to be convenient. The OpenCV library enables one to deal with n-dimensional images, which one usually treats them as matrices.

For personal/independent projects, the writer aims to develop one simple application on the platform of Qt Creator and uses both PCL and OpenCV. Previously the writer has developed the 'stupid and simple' app: FingKinector. This first version only had access to the joint motor functions of the Kinect sensor. Furthermore it was developed on Microsoft Visual Studio. For the sake of variety, the writer thought this time the upgrading of this app should be done on Qt Creator.

CMake Build Process


The following images show the step by step in the build process of the software for FingKinector 2.0, within the Qt Creator, instead of the CMake GUI.

Step 1: Open file CMakeLists.txt (Fig. 1)

Figure 1: Open File - CMakeLists.txt


Step 2: Specify the directory for the build (Fig. 2)

Figure 2: Specify the directory for the build process


Step 3: Run CMake (Figs. 3.1 and 3.2)

Figure 3.1: Run CMake

Figure 3.2: Finish the build process


Step 4: Done - start coding! (Fig. 4)

Figure 4: Start coding on Qt Creator


Source Codes


The writer finds it prudent to divide the codes for Kinect motor functions and its image processing in different 2 separate files. The figure (Fig. 5) shows the source files for this application:

Figure 5: Source codes and other files for the project


1) main: contains the function int main()
2) FingKinectorWindow: manages the actions/signals on the GUI
3) KinectFunkts: manages Kinect initialization and frame grabber
4) PCLOpenCV: manages the processing of 3D-point clouds and its visualization.

The writer has decided not to make these source codes available for others. However the writer welcomes suggestions and questions from all readers.

New Features


In the first version of FingKinector, one could only toy with the joint motor feature of the Kinect sensor. For this new version, FingKinector offers two options for point cloud acquisition:

i) the fundamental single mode / one shot, and
ii) convoluted triple shots - at 3 different angles: 27°, 0° and -27°.

The following figures 6.1 until 6.3 show the feature of every tab on the app FingKinector.

Fig. 6.1: FingKinector - Initialization

Figure 6.2: FingKinector - Motor functions

Figure 6.3: FingKinector - Visualization


The latter mode is actually redundant, but the writer was curious about the outcome of such acquisition.

Future prospects

The writer would add two more features for this app in the future - live view of 3D-point cloud and display of range image.

Demonstrations


Monday, March 24, 2014

Welcome to Germany...and Welcome to the Suck

First of all - the second phrase in the title above is just a pun by the writer. The writer dedicates this blog post to the group of 41 products of German A-Level Preparatory Program (GAPP), which arrived to Germany via its Frankfurt International Airport a.k.a. Fraport on the last March 15, 2014, and to the current GAPP students at the German-Malaysian Institute (GMI) in Bangi, Malaysia. This article is intended to provide simple yet sufficient information for them about the main challenge that awaits them in Germany once they arrive here: the TestDaF.



On Saturday March 15, 2014 - a group of 41 future students arrived at the Fraport. Once they came out from the arrival gate in Fraport Terminal 2, they were led to an area in the Terminal 2. There they were given short briefings by 2 officers from the General Consulate of Malaysia in Frankfurt am Main. Afterwards they were separated to 4 groups - each group would then journey to a different state in Germany: Bayern (Bavaria), Sachsen (Saxony), Nordrhein-Westfalen (North-Rhein Westphalia / NRW) and Hessen (Hesse).  At each place they must then undergo a preparation course for the ultimate German language test for them - the TestDaF / Test Deutsch als Fremdsprache (German as Foreign Language).

The writer congratulates them for making it this far and hope they have adjusted themselves well in their first week in Germany.

Financial Management during the Language Course


In a briefing by one of the officers, students were advised to manage their allowance smartly and told to spare a certain amount of money from their early allowance for certain reasons. From their monthly allowance they must pay for living costs: mostly for room rent, health insurance, cellphone bills and of course foods and drinks. Here the writer would like to urge these students to refrain from spending on large (read: expensive) items such as TV-Monitor, desktop PC, musical instruments etc, which would then trouble them during the process of relocation to their respective college.

The process of moving into a new rent room always involves a big sum of money. They need to consider the costs of transportation, deposit of the rent (which is usually 2 or 3 month of monthly rent), the first month rent, new furniture and so on, hence the reminder of sparing some money from their early allowance. Apart from those, they must also be prepared to pay the semester fee (€ 200 and above).

The TestDaF


From here onward, the writer addresses the 41 students as TestDaF candidates. The writer welcomes comments from other fellow students who have also experienced the TestDaF, especially those who scored 16 points and above, to share their opinions and tips.

The writer took a liberty to briefly view the website of TestDaF-Institut [1], to refresh himself on information regarding the TestDaF. The following is the summary on TestDaF along with tips/suggestions by the writer. TestDaF candidates are hereby recommended to read further information and tips at the official website (the website is unforgiving - everything is in German, but that is the whole point - to test your German language competence). The writer predicts that all 41 candidates will do their TestDaF on July 15, 2014 [2].

1) The Structure of TestDaF


The following image (Fig. 1) shows that TestDaF is divided to 4 parts in chronological order:

  • Reading comprehension (Leseverstehen / LV),
  • Listening comprehension (Hörverstehen / HV),
  • Text composition (Schriftlicher Ausdruck / SA) and
  • Oral (Mündlicher Ausdruck / MA).

Figure 1: The structure of TestDaF [3]

The total time of the test is 3 hours and 10 minutes, without the break time. The answer papers with the recording of the oral test (yes, it will be recorded) would then be sent to the TestDaF-Institut in Bochum for evaluation [3]. It takes at least 6 weeks until the result will be released.

2) Grading

The test result on TestDaF-certificate will be ordered in 3 grade levels to all 4 parts:
  • TestDaF-Niveaustufe 3 (TDN 3)
  • TestDaF-Niveaustufe 4 (TDN 4)
  • TestDaF-Niveaustufe 5 (TDN 5)
The highest grade is TDN 5 - which makes the total highest grade overall is 20. If a grade is below 3, then it will be displayed as 'unter TDN 3' - which is obviously undesired by any German university. In comparison to certain English language certificates which are only valid for 2 years, a TestDaF certificate is described as 'valid without limit' [3].

3) The Required Grade for Enrollment


A candidate is considered to have passed the TestDaF if the total grade or points is 12 (TDN 3 multiplied by 4). To the writer's knowledge, so far only colleges in Bayern that accept such result. The writer would like to shift the reader's attention to colleges in other states, particularly in Hessen. This can be regarded as a highly significant case study.

In the process of application for a placement at a Hessian college, generally it is sufficient for an applicant to provide that she/he has acquired 15 points.

HOWEVER, upon enrollment the candidate must provide a TestDaF-certificate with minimum 16 points, with minimum TDN 4 in every part of the test (4 times TDN 4). The reason behind this is: applicants with 15 points are expected to re-sit the TestDaF and improve their results after sending their college application.

To clarify this matter, last year the writer made a phone call to the Director of International Affairs of Technische Hochschule Mittelhessen and consulted the advisor-in-charge for foreign students of Hochschule Darmstadt. A common point from them was the logic of requiring every applicant to get 16 points and above. They insisted that foreign students should be competent in their German language, to provide the very basic strength in doing an undergraduate degree in Germany. The writer could only agree with them.

4) Tips/Suggestions


As a starter, the writer suggests that TestDaF candidates go through the TestDaF website and download everything available to help them: from the sample test papers in PDF format to the audio files for HV part in MP3 format.

Be active when possessing all those materials - analyze them.

Read articles that come along with tables and graphs. Many phrases to describe the statistics are so useful that they can be applied later especially in the part SA of the TestDaF.

Candidates should also always practice to answer the oral questions effectively. Their all hi-tech gadgets should be utilized to record their voices and replay them. Do mock oral tests during free time.

Stop listening to MP3s when candidates are in places full of German-speaking people. Pay attention to their pronunciation, accents and tones. Try to emulate their accent. Try to slightly understand the topic of their conversation - it may be a dry humor, or may be about their music taste, outing plan, their train destination, how old they are, what kind of pets they have, the current political situation in EU or elsewhere, etc. Whatever. Anything.

It is important to remember why all of this matters so much. The candidates should bear in mind that they will have to attend countless lectures, spend hours to write lab reports, digest lecture scripts and notes - everything in German. The most challenging part would then be to write the final year thesis (Abschlussarbeit), for which bachelor candidates are required to write in impeccable German, before presenting it during a colloquium for final evaluation.

Conclusion


The candidates should fully utilize their 4 month-course to prepare themselves for the TestDaF. The writer urge them to NOT regard this 4-month-period as a rewarding time for them after passing the GAPP course in Malaysia. Instead they should take this as an opportunity to put their German knowledge in practice. No more simulation of dialog - but real-time conversation with native speakers. The candidates are also urged to aim for 16 points or above, for it shall open many doors to them afterward. The writer wishes all the best to the TestDaF candidates and again: 'Welcome To The Suck'*.

Sources:



*borrowed from the catchphrase of the film Jarhead.