<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
	<title>Jens Petit</title>
	<link>https://jenspetit.de/</link>
	<description>Recent content on Jens Petit</description>
	<generator>Hugo -- gohugo.io</generator>
	<language>en</language>
	<lastBuildDate>Thu, 02 Apr 2026 00:00:00 +0000</lastBuildDate>
    
        <atom:link href="https://jenspetit.de/index.xml" rel="self" type="application/rss+xml" />
	
	
	<item>
		<title>Which way to go?</title>
		<link>https://jenspetit.de/posts/2026/04/which_way_to_go/</link>
		<pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2026/04/which_way_to_go/</guid>
		<description>&lt;p&gt;In the last years my life has been marked by some profound changes. After studying to become a robotics engineer and earning a master’s degree, I pivoted towards medical informatics with my first job. Roughly two years ago, I finally decided to change my career entirely. Now I am back at university and studying Medicine to eventually become a doctor in a few years (hopefully).&lt;/p&gt;
&lt;p&gt;Writing down these sentences sounds like a matter-of fact statement. But it has been a rocky path – filled with doubts, hesitation, and also grief. When people learn about my career change, they often promptly ask me why. Usually, my answer goes something along the line of “I didn’t want to work in an office anymore.” This is not a false statement. But it conveys only a very limited fraction of my true motivation and feelings. The honest answer goes way deeper.&lt;/p&gt;
&lt;p&gt;Throwback to June 2019: I graduated from TUM with a master’s degree in computer science and took up a PhD position at &lt;a href=&#34;https://scads.ai/&#34;&gt;ScaDS.AI&lt;/a&gt;, one of Germany’s top research centers for Big Data and Artificial Intelligence. My time in academia turned out rather disappointing: there was no big meaningful question to answer but rather a collection of loosely coupled projects under the umbrella term AI. The primary goal for research seemed to be obtain ever more funding. Additionally, when I looked at most of the real-world applications of the technology we were working on, it rarely looked like technology for the people. Rather, it was there to improve the recommendation algorithms of &lt;a href=&#34;https://en.wikipedia.org/wiki/Big_Tech&#34;&gt;Big Tech&lt;/a&gt; or would find its way onto the &lt;a href=&#34;https://medium.com/syncedreview/yolo-creator-says-he-stopped-cv-research-due-to-ethical-concerns-b55a291ebb29&#34;&gt;battlefield&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For me, this still is and was a tough pill to swallow. I have invested a very considerable stake of my life into technology, both as a profession but also as part of my identity. And as naive as it sounds, part of my motivation to be the tech guy was indeed to make the world a better place. I believed that science was apolitical and research objectively moral and good no matter what the subject is. This worldview, my worldview, was deconstructed.&lt;/p&gt;
&lt;p&gt;Still, I didn’t yet entirely break with tech but took up a software engineering position with a local startup in hospital IT. After the mere theoretical applications in academia, the problems were very much real. We launched a new software for quality management together with a large hospital. This was very much hands-on and I learned a lot along the way: modern web technology, network and cloud infrastructure as well as project and team management. Also, the colleagues were great. But after some time, doubts and discontent came creeping back up. I disliked the pressure to grow because the company was a venture capital financed startup. We were at the mercy of mysterious potential investors with whom I had no relation with. That did not feel right to me.&lt;/p&gt;
&lt;p&gt;Additionally, most of the clients were not in Germany and the business felt very much disconnected from Leipzig, the city I am living in. After a little more than two years, the company ran into financial troubles and it was a good time for me to find a new job. In the end, I settled for the IT department of the University Hospital Leipzig (UKL). It is the largest hospital in the region and has around eight thousand employees. I chose this workplace because it has a very direct local purpose which serves the people. There is no investor and no imperative to grow. The UKL very much aligns with my answer to the question of &lt;a href=&#34;https://brycewilley.xyz/2021/06/new_job&#34;&gt;what does the world need (and what not)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With around one hundred people, the IT department is a central pillar of the hospital and involved in almost all processes from patient care to internal logistics. I had before worked as an external supplier for different hospitals so it was interesting to switch sides. During the onboarding process, I had to do a first aid reanimation course which was conducted by an experienced intensive care nurse and included a lot of practical exercises. Afterwards I realized that this training was one of the most fun working days in the last years. Maybe I would actually prefer being the one delivering medical care instead of the IT guy?&lt;/p&gt;
&lt;p&gt;This was not a completely new thought. Already since some years, it had been in the back of my mind and also influenced my decision to move my IT career closer to healthcare. In the end, I decided to give it a try and applied for medical studies in Leipzig. Luckily, I got offered a place. Now it was time to decide: Would I really want to start all over again in my early thirties? My answer was “yes” for a couple of reasons: First, being a doctor is firmly rooted in the physical world. I can and must use my full body with all senses compared to sitting at a desk and staring into a monitor most of the time. Second, social interactions with people from all walks of life are part of the job. I like talking to people from different backgrounds. Third, being a doctor is a useful skill in all future scenarios. Capitalism is &lt;a href=&#34;https://www.mpifg.de/1256532/2024-01-wz-beckert&#34;&gt;wreaking havoc&lt;/a&gt; on our planet and it is possible that our current societal system will change within our lifetime. I don’t believe in magical technological fixes anymore which give us endless growth. The transition to whatever comes next will be rocky and filled with uncertainty. Consequently, choosing a versatile and hands-on profession makes sense to me. This might surprise some people to hear but it is definitely part of my honest answer to the why question.&lt;/p&gt;
&lt;p&gt;Deciding to change my career was one of the toughest decisions I took in my life. I am pretty sure that there would have been also other paths for a meaningful life. Ultimately, I am just happy that I took one of them.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Demokratie ist mehr als wählen gehen</title>
		<link>https://jenspetit.de/posts/2024/09/on_voting/</link>
		<pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2024/09/on_voting/</guid>
		<description>&lt;p&gt;Ich bin aufgewachsen in einer Welt, in der politischer Einsatz oftmals belächelt wurde – wer wirklich etwas ändern will, wird Ingenieur oder gründet ein Technologie-Start-Up! Heute denke ich darüber anders, denn die wirklich wichtigen Fragen unserer Zeit sind politische oder gesellschaftliche.&lt;/p&gt;
&lt;p&gt;Was ist ungerecht, was gerecht? Wie wollen wir zusammenleben? Was sind die Werte, die wir in unserem Bildungssystem vermitteln wollen? Wollen wir überhaupt Werte vermitteln? Wie ermöglichen wir eine gute Mobilität für alle? Wie sieht ein gutes Gesundheitssystem aus?&lt;/p&gt;
&lt;p&gt;Diese Fragen können nur in demokratischen Auseinandersetzung gelöst werden und nicht in den technologischen Forschungslaboren der Großkonzerne und Universitäten. Die „Innovationen“ die dort produziert werden sind vorrangig dazu da Effizienzsteigerungen zu ermöglichen, die im Sinne unserer kapitalistischen Wirtschaftsordnung zur &lt;a href=&#34;https://www.ufz.de/export/data/2/204287_Interview_HartmutRosa.pdf&#34;&gt;dynamischen Stabilisierung&lt;/a&gt; beitragen, um den Status Quo zu erhalten.&lt;/p&gt;
&lt;p&gt;Oftmals wird eine Demokratie damit gleichgesetzt, dass man alle paar Jahre ein Kreuz bei der richtigen Partei oder Kandidatin macht. Dabei steht Demokratie nicht für ein formales Verfahren wie Wahlen, sondern im Kern geht es darum, dass möglichst &lt;em&gt;gleiche&lt;/em&gt; Chancen zur Durchsetzung von Interessen bestehen. Auch ist eine Demokratie nie &amp;ldquo;fertig&amp;rdquo;, sondern es muss dauerhaft daran gearbeitet werden, dass dieser Anspruch erfüllt wird.&lt;/p&gt;
&lt;p&gt;Es gibt unterschiedlichste Wege dem eigenen Standpunkt mehr Nachdruck zu verleihen. Das Mittel der Wahl ist dabei Organisierung, das heißt der Zusammenschluss von Menschen, denen ein gemeinsames Thema am Herzen liegt. Die eigene Energie dort zu investieren hat einen viel größeren Hebel als zu versuchen mit &lt;a href=&#34;https://share.eu/&#34;&gt;individuellen Konsumentscheidungen&lt;/a&gt; die Welt zu retten.&lt;/p&gt;
&lt;p&gt;Es folgt eine unvollständige Liste mit Vorschlägen um sich einzubringen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Engagiere dich in Kommunalpolitik an deinem Wohnort.&lt;/li&gt;
&lt;li&gt;Unterstütze eine Bürgerinitiative.&lt;/li&gt;
&lt;li&gt;Werde Mitglied in einer Gewerkschaft.&lt;/li&gt;
&lt;li&gt;Unterstütze eine Partei im Wahlkampf.&lt;/li&gt;
&lt;li&gt;Werde Parteimitglied.&lt;/li&gt;
&lt;li&gt;Werde Mitglied in einem Lobbyverband wie z.B. ADFC, Pro Bahn, BUND, etc.&lt;/li&gt;
&lt;li&gt;Spende regelmäßig Geld an eine politische Organisation.&lt;/li&gt;
&lt;li&gt;Engagiere dich in einer sozialen Bewegung.&lt;/li&gt;
&lt;li&gt;Gehe auf eine Demonstration.&lt;/li&gt;
&lt;li&gt;Werde Teil einer solidarischen Landwirtschaft.&lt;/li&gt;
&lt;/ul&gt;
</description>
	</item>
	
	<item>
		<title>The Human Energy Scale</title>
		<link>https://jenspetit.de/posts/2024/05/energy/</link>
		<pubDate>Tue, 23 Apr 2024 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2024/05/energy/</guid>
		<description>&lt;figure&gt;&lt;img src=&#34;../enna.jpeg&#34; width=&#34;100%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Enna viewed from the south in central Sicily. It is a steep 240 meters ascent to the top of the hill where the old city is located.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In January and February, I &lt;a href=&#34;https://jenspetit.de/posts/2024/02/italia/&#34;&gt;cycled around Southern Italy&lt;/a&gt; for three weeks. I completely relied on the power of my body to move me and fifteen kilograms of luggage around. One day, while dragging myself up the steep ascent to Enna, a famous hilltop city in central Sicily, I was overtaken by several trucks. They would rush by with roaring engines, carrying roughly 500 times the amount of luggage that I had on my bicycle. But still, they easily climbed all the way up, dropping out of sight after the next turn. What a stark contrast. To carry that amount of cargo I would need 500 round-trips on my bike. It would take me a month with around sixteen daily trips to do the same thing the truck achieves within ten minutes. That’s insane. Energy is so cheap and abundant that we don’t even think about it. And such energy use is not an exception. Every day trucks go up to Enna to deliver such mundane things as bottled water.&lt;/p&gt;
&lt;p&gt;Why is this problematic? Our lavish use of energy is having &lt;a href=&#34;https://jenspetit.de/posts/2023/05/climate_crises/&#34;&gt;devastating consequences&lt;/a&gt; as it is largely based on burning fossil fuels. At a time when there is an urgent need to reduce emissions, we should reduce energy use. This is much simpler than a shift to renewables. Therefore, we need to have discussions about prioritization. Do we really want to spent precious energy on carrying bottled water across the country?&lt;/p&gt;
&lt;p&gt;To be clear: This is not about promoting the individual mortification on energy use. I don&amp;rsquo;t advocate for abandoning trucks and only using human powered devices. I want to raise awareness that our modern way of living has completely detached us from energy on a human scale. Connecting us back and making the hidden costs visible can be a powerful tool in shifting to a lower energy society.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../enna_profile.png&#34; width=&#34;100%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Elevation profile to Enna&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

</description>
	</item>
	
	<item>
		<title>Does Capitalism Require Economic Growth?</title>
		<link>https://jenspetit.de/posts/2024/04/growth_imperative/</link>
		<pubDate>Sat, 30 Mar 2024 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2024/04/growth_imperative/</guid>
		<description>&lt;figure&gt;&lt;img src=&#34;../rolltreppe_edit.png&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
&lt;p&gt;If we don&amp;rsquo;t run and constantly change, we are left behind, loose contact, are outdated. Our friends have moved on and life passed by us. The automatic staircase has pushed us into the closet.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;cite&gt;Hartmut Rosa in &lt;a href=&#34;https://www.die-bonn.de/zeitschrift/12008/zeitmanagement-01.pdf&#34;&gt;this article&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Recently, the &lt;a href=&#34;https://www.tagesschau.de/wirtschaft/konjunktur/konjunkturprognosen-bip-haushaltskrise-100.html&#34;&gt;news are full again&lt;/a&gt; of concerned articles about the state of the German economy. Apparently, we live in a world where the slightest signs of economic stagnation cause collective anxiety. Why is that? It is even more astounding as economic growth measured as the Gross Domestic Product (GDP) has a deep connection with the climate crisis. Looking at the chart below the correlation is hard to deny.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../co2-gdp-growth.png&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;When we produce and sell e.g. more stuff than last year (yay, GDP going up!) then this additional stuff usually causes additional greenhouse gas emissions. This directly contradicts the urgent need to &lt;a href=&#34;https://jenspetit.de/posts/2023/05/climate_crises/&#34;&gt;reduce emissions&lt;/a&gt;. What about decoupling? Some people like to point out that many Western countries are increasing their GDP although their &lt;a href=&#34;https://ourworldindata.org/co2-gdp-decoupling&#34;&gt;emissions are dwindling&lt;/a&gt;. However when taking a global perspective this does not hold up to reality. Per capita greenhouse gas emissions are not going down although we need a massive reduction as soon as possible.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../per-capita-ghg-emissions.png&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;If it is clear that economic growth is wreaking havoc on our planet and decoupling is not happening, why on earth are we collectively still aiming for this? Can we not finally stop this rat race? Or is economic growth an imperative in a capitalist society?&lt;/p&gt;
&lt;p&gt;I was surprised to find out that this question is &lt;a href=&#34;https://en.wikipedia.org/wiki/Growth_imperative&#34;&gt;scientifically not clearly answered&lt;/a&gt;. It is a matter of contemporary debate if a steady-state (so no economic growth) capitalist economy is possible. If it is not possible it means that we must either shrink or expand. Do or die. There is no middle ground.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../gdp.png.jpeg&#34; width=&#34;100%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Future GDP scenarios&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;But what ultimately matters more is how we are collectively behaving. And here the answer is clear: We are acting as if economic growth is an imperative. Our Ex-Chancellor Angela Merkel said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Without growth no investments, without growth no jobs, without growth no money for education, without growth no help for the weak. And conversely: With growth investments, jobs, money for education and help for the weak and - most importantly - trust from the people. This is my belief which is grounded in my concept of politics.&lt;/p&gt;
&lt;p&gt;&amp;ndash; &lt;cite&gt;Angela Merkel in her &lt;a href=&#34;https://www.bundesregierung.de/breg-de/service/newsletter-und-abos/bulletin/regierungserklaerung-von-bundeskanzlerin-dr-angela-merkel-795246&#34;&gt;2009 state of the nation address&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interesting is that the word &lt;em&gt;growth&lt;/em&gt; is used although &lt;em&gt;economic growth&lt;/em&gt; is meant. In our modern world, economic growth is synonymous with growth. This expansion of the growth imperative from the economic realm to our reality is what we experience. The German sociologist Hartmut Rosa has extensively studied and characterized our contemporary society. For him, the imperative to grow, accelerate and innovate is what defines a modern society. Stability and reproduction is only achieved through a constant increase in throughput. We live in a world of dynamic stabilization. To illustrate this, we can bring up the picture of each of us being on an automatic staircase running down while we want to reach the top. Our position in the world is constantly on the edge. We have to perform in order to keep our place. This story is replicated on a national level: If Germany is not economically attractive, jobs will move to another country. We will loose the game and our prosperity diminishes. What a grim world to live in.&lt;/p&gt;
&lt;p&gt;For me, the good life should not depend on outcompeting my neighbor. Neither on an individual nor on a collective scale. And why should the GDP in any way be a good metric for human well-being? My utopia is living in a subsistence village, emphasizing collective care and not being under pressure to grow, innovate or accelerate - like the village of Asterix. Anyone ever heard of Obelix talking about the need to sell more menhirs (Hinkelsteine) in order to have the village survive? It seems absurd to me that we have maneuvered ourself in a system which knows only one working mode of operation: growth.&lt;/p&gt;
&lt;h2 id=&#34;literature&#34;&gt;Literature&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Binswanger, M. (2019). Der Wachstumszwang: Warum die Volkswirtschaft immer weiterwachsen muss, selbst wenn wir genug haben. Weinheim: Wiley-VCH Verlag GmbH &amp;amp; Co. KGaA.&lt;/li&gt;
&lt;li&gt;Rosa, H. (2019). Resonanz: Eine Soziologie der Weltbeziehung. Berlin: Suhrkamp.&lt;/li&gt;
&lt;li&gt;Herrmann, U. (2022). Das Ende des Kapitalismus: Warum Wachstum und Klimaschutz nicht vereinbar sind - und wie wir in Zukunft leben werden. Köln: Kiepenheuer &amp;amp; Witsch.&lt;/li&gt;
&lt;li&gt;Fraser, N. (2022). Cannibal capitalism: How our system is devouring democracy, care, and the planet - and what we can do about it. London: Verso.&lt;/li&gt;
&lt;/ul&gt;
</description>
	</item>
	
	<item>
		<title>Cycling in Southern Italy</title>
		<link>https://jenspetit.de/posts/2024/02/italia/</link>
		<pubDate>Tue, 27 Feb 2024 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2024/02/italia/</guid>
		<description>&lt;figure&gt;&lt;img src=&#34;../jens_garden.jpg&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Before taking up a new job, I wanted to get out of the daily grind for some time. As I like cycling and have done memorable trips in the past, I decided to go for a longer (roughly one month) cycling trip again. My destination was southern Italy because this is well connected to Germany via trains, offers relatively mild weather in winter and seemed like a diverse and beautiful place.&lt;/p&gt;
&lt;h2 id=&#34;the-route&#34;&gt;The Route&lt;/h2&gt;
&lt;p&gt;As I did not want to bike in the freezing cold, the starting point would ideally be already far south. After some research, I was set on doing some cycling in Sicily. To extend that, I would include a part of mainland Italy. The cycling blog &lt;a href=&#34;https://www.rollingexistence.com/routes/bicycletouringsouthernitaly/&#34;&gt;Rolling Existence&lt;/a&gt; and the &lt;a href=&#34;https://sicilydivide.it/en/&#34;&gt;Sicily Divide&lt;/a&gt; where the rough inspiration, resulting in my itinerary from Bari to Palermo.
With the help of guidebooks - I really like &lt;a href=&#34;https://www.reise-know-how.de/de&#34;&gt;Reise Know How&lt;/a&gt; publishing house - and friends (thanks Malte, Valerio, Martin, Miriam) I did the more fine-grained planning mostly on-the-go. For this, I relied on the excellent OpenStreetMap data paired with &lt;a href=&#34;https://organicmaps.app/&#34;&gt;Organic Maps&lt;/a&gt; which is an awesome, community-run offline maps application for smartphones. I rode mainly on roads and gravel paths as there are only very limited dedicated cycling tracks in this region.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../full_route.png&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The GPX tracks are available to download in the respective sections of this post.&lt;/p&gt;
&lt;h2 id=&#34;the-bike&#34;&gt;The Bike&lt;/h2&gt;
&lt;p&gt;My daily commuting bike in Leipzig is an old road bike which was modified to a single speed (only one gear, but not fixed). For the flat Leipzig environment, this is ideal: simple, reliable, fast. The philosophy behind a single speed resonates with me. Therefore, I was having the thought of using exactly this bike for the trip. I also discovered that people like &lt;a href=&#34;https://markusstitz.com/round-the-world-singlespeed/&#34;&gt;Markus Stitz&lt;/a&gt; have done around the world trips on one gear and it inspired me to give it a try. For me, cycling is not about setting records, it is about connecting to the landscape, the people and having a good time. It does not require the latest electronic shifting mechanism. So I was set to use my trusty commuter bike for this trip!&lt;/p&gt;
&lt;p&gt;In the weeks before, I spent many hours preparing the bike for this adventure, e.g. researching gear ratios, installing a hub dynamo, changing the stem or switching to robust gravel tires. It took much more time than anticipated but I also learned a great deal of things about bikes in the process. It made me feel confident that I could handle whatever would break during the trip.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../bike_prepare.jpg&#34; width=&#34;80%&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;the-gear&#34;&gt;The Gear&lt;/h2&gt;
&lt;p&gt;Packing for this trip was challenging for a couple of reasons. Although the route is far south it was still winter. Especially during the nights, the temperature would drop to around zero degrees, meaning that I needed warm clothes. Also, I was planning on spending at least a portion of the nights in my tent. For me camping is not only a way of traveling on tight budget but something I enjoy. I like being outside and having maximum independence with my own shelter and vehicle. To save weight and space, I removed the inner part of the tent and only used the ground sheet and outer shell. As I would spent some time also as a regular tourist, I wanted to have some non-outdoor clothes with me. The total weight of my equipment without food or water clocked in around 15 kilograms. To carry all that gear I used two rear panniers and attached a backpack on top. Additionally, I had a small handlebar pack.&lt;/p&gt;
&lt;h2 id=&#34;part-0-getting-to-bari&#34;&gt;Part 0: Getting To Bari&lt;/h2&gt;
&lt;figure&gt;&lt;img src=&#34;../takeoff.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Leaving Leipzig in wintery conditions&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I caught the morning train from Leipzig to Munich and then a Eurocity from Munich to Bologna. Both had bicycle transport options which made it very easy. The route from Munich to Bologna over the Alps is a very scenic ride, especially in winter when you are suddenly in the completely snow covered mountains. After staying one night in Bologna at a friends place, I jumped on an intercity train with bike transport to Bari. Everything worked out smoothly and I was excited to set off.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../alps_train.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Crossing the Alps by train&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;part-1-from-bari-to-reggio-calabria&#34;&gt;Part 1: From Bari to Reggio Calabria&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Duration: eleven days including two rest days&lt;/li&gt;
&lt;li&gt;Distance covered: 749 kilometers&lt;/li&gt;
&lt;li&gt;Elevation gain: 6520 meters&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;./../italy_part_1.gpx&#34;&gt;GPX Track&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;../route_part_1.png&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;After doing a day tour in Bari to check if the bike and me is ready for the trip, I headed out of Bari for the Castel del Monte, a famous 12th century castle built by the Swabian King Friedrich II. Cycling out of the urban area was not fun as traffic was intense. After several exhausting hours fighting against strong headwinds and constant uphill, I finally reached the castle. Being a winter tourist means that I was almost alone which amplified the monumental impression of the building.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../castel_del_monte.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Me failing to take a self-timer picture&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I pitched my tent in a secluded spot next to the road when the sun was already set.
The next day, I was waking up to rain and it would not stop all day. Time to test out my rain gear.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../rainy_day.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Trying to stay positive in bad weather&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I had contacted a farm via &lt;a href=&#34;https://www.gardensharing.it/de/&#34;&gt;Garden Sharing&lt;/a&gt; which is a website where people offer their grounds for camping. Therefore, my destination for the day was set. Physically, this was a tough day, being cold, wet and very tired at the end. However, my hosts and all of their animals lifted my spirits. I just wish I could speak more Italian. The next day, I woke up to clear sky and amazing view.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../camp_grottole.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Setting camp indoor in an old farm house. Temperatures were around freezing point, so I gladly took up the offer for sleeping indoors.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../farm_grottole.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Lots of cute farm animals&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In the following days, the cycling was superb. Small roads, friendly hosts and tons of citrus fruits.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../grottole_road.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Enjoying a scenic descent&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../another_descent.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Another scenic descent&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../oranges.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Orange paradise&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../hilltop_city.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;One of the old hilltop cities in the area&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../beichtstuhl.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;A small old church on the top of a hill&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../rontondella.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;View of Rotondella, a famous hilltop city&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I finally reached the Ionion sea near Rotondella when I crossed from Basilicata to Calibria. It was a welcome change from the hilly inland to the flat coast. I quickly covered long distances but the downside was the traffic. I even had to ride a small stretch (10 minutes or so) on the highway because there was no other good option. On the way there were beautiful beaches and I took my first dip in the sea for 2024.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../first_dip.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;First dip of the year&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../under_the_bridge.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Setting camp under a railway bridge. Sleeping outdoors is always an adventure as I was woken up by a wild pig during the night.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now it was time to cross the country for the Thyrrhenian sea. Again, the inland was very scenic, riding through endless olive groves with constant sun.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../olives.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Olives anyone?&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After reaching the coast, I followed it until Reggio Calabria, the final destination of the first part. The coast was more steep, offering breathtaking views but also demanding a lot from my legs.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../thyrrhenian_coast_1.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Thyrrhenian coast near Tropea&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../tartufo.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Taking a break in Pizzo, the place where the Tartufo was invented.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../thyrrhenian_coast_2.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Final part of the Thyrrhenian coast. In the background one can already see Sicily.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;part-2-from-messina-to-palermo&#34;&gt;Part 2: From Messina to Palermo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Duration: ten days including one rest day&lt;/li&gt;
&lt;li&gt;Distance covered: 632 kilometers&lt;/li&gt;
&lt;li&gt;Elevation gain: 8423 meters&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;./../italy_part_2.gpx&#34;&gt;GPX Track&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&#34;../route_part_2.png&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The first day of the second leg started with a setback. I got informed that it was not possible to take the bike on the ferry from Reggio Calabria to Messina. This meant I had to go back roughly 20 kilometres to San Giovanni through dense urban area which I just cycled one day earlier. After overcoming this obstacle in the morning, I boarded the ferry.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../ferry_sicily.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Setting over the Strait of Messina. Always exciting to board a ferry.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Finally in Sicily! I was a little bit surprised how densely populated the island is, especially the eastern coast is one city after the other which also means a lot of traffic. After staying one night in touristy Taormina, I cycled a little bit inland to explore the northern side of Mount Etna.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../toarmina.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The famous greek-roman theater with Etna in the background&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../cycling_project.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;An old railway was converted to a cycling track. The project was abandoned halfway.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../etna_smoking.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Smoking Etna. With over 3300 meters height the volcano dominates the landscape from all directions.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The next goal was Catania, the second largest city of Sicily. Getting into the urban area I was again met with heavy traffic, although I could enjoy it this time more maybe because it was mainly downhill. With the bicycle you can easily jump a lot of traffic jams like on a scooter.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../catania.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Cycling towards the center of Catania&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;I took the decision to not follow the original Sicily Divide route as I wanted to see the southern part of Italy with Syracusa, Noto and Modica.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../syracusa.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Historic center of Syracusa&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../garden_luca.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;What a beautiful garden to camp in&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After delving into these historical cities, I was eager to get the focus back on riding. From a cyclist’s perspective, the following days were the most beautiful: little traffic, curvy mountain roads and beautiful landscapes. And again, I had very nice hosts.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../almond.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Almond trees blooming in early February&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../view_enna.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;View from Enna towards the north&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../garden_alessandro.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Camping on the grounds of Alessandro who recultivates the land of his grandfather&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../view_mussomeli.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;View from Mussomeli towards the south&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../mussomeli_town.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Picturesque old town of Mussomeli&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../etna_best.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Etna again visible in the background. Almost every square meter of Sicily is cultivated land.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../final_mountains.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The final mountain range before reaching Palermo&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;After these days, I was ready to reach my final cycling destination: Palermo. The last day was easy riding as it was mostly downhill. With every meter the urban density increased until I finally reached Palermo&amp;rsquo;s limits.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../palermo.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Finally there!&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;part-3-getting-back&#34;&gt;Part 3: Getting Back&lt;/h2&gt;
&lt;p&gt;After finishing my cycling trip and staying some nights in Palermo in a backpacker’s hostel, I took the ferry to Napoli (&lt;a href=&#34;https://www.gnv.it/en&#34;&gt;GNV overnight ferry&lt;/a&gt;, bicycles are free). Then, my final journey was visiting a friend in Torino (took a Frecciarossa high-speed train, bike had to be disassembled and put in a „bag“ as no bike transport option) before taking an overnight bus with a bike rack back to Germany via Milano and Zurich. Traveling with the bike can sometimes be exhausting, as you need to research a lot of options. But all in all it worked out fine.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../frecciarossa.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Disassembling the bike for the train. I found an old blanket in a trash in Napoli which served as a bag.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../germany.jpg&#34; width=&#34;80%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Back in Germany enjoying my first Bretzel&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;trip-review&#34;&gt;Trip Review&lt;/h2&gt;
&lt;p&gt;I had a great experience for this trip. Going alone can be hard but it was also rewarding and empowering. Also, it is much easier to meet people if you are on your own. In terms of timing, I think it is better to go a little bit later in the year or in fall. Then the days are longer and the nights not so cold.&lt;/p&gt;
&lt;h3 id=&#34;gear-and-bike&#34;&gt;Gear and Bike&lt;/h3&gt;
&lt;p&gt;All in all, in terms of durability I am happy. Nothing major happened, although I did some last minute changes to the setup. I was also afraid that the &lt;a href=&#34;https://www.tubus.com/produkte/hinterradtraeger/tubus-product/disco&#34;&gt;rear rack&lt;/a&gt; with the direct attachment to the quick release would have issues but luckily no. Only some minor things came up like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;irritation in the bottom bracket&lt;/li&gt;
&lt;li&gt;threaded headset became sightly loose&lt;/li&gt;
&lt;li&gt;loose spokes on the rear wheel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The big question is: How did I like having only single gear keeping in mind that I did around 1000 meters of elevation gain each day? I have mixed feelings about this. On the one hand, the simplicity is alluring. On the other hand, going uphill above a certain steepness (for me with this gear ratio, anything bigger then 8%) is a pain. You have to be alright with getting off of your bike and pushing it from time to time.&lt;/p&gt;
&lt;p&gt;One thing I would definitely change is to install a proper light system instead of relying on battery powered removable lamps. More then expected I was riding around in the dark e.g. after setting camp. To search for the lamps was annoying. Also, the weight distribution was not ideal with too much weight in the back. It made the bike to a certain degree unstable. What I liked was having the backpack with me which I could also put on when being forced to push the bike.&lt;/p&gt;
&lt;p&gt;Some more notes for my future self:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;get the right lock and find a good attachment on the bike, mine was probably too heavy&lt;/li&gt;
&lt;li&gt;unused or barely used items: extra cup, carabiner&lt;/li&gt;
&lt;li&gt;tent without the inner structure worked out well&lt;/li&gt;
&lt;li&gt;Italy does not have screw gas canister, check before&lt;/li&gt;
&lt;li&gt;take a sun cap&lt;/li&gt;
&lt;li&gt;USB dynamo charger was a waste, rather rely on power bank&lt;/li&gt;
&lt;/ul&gt;
</description>
	</item>
	
	<item>
		<title>A Future for Everyone</title>
		<link>https://jenspetit.de/posts/2023/05/climate_crises/</link>
		<pubDate>Sun, 07 May 2023 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2023/05/climate_crises/</guid>
		<description>&lt;p&gt;&lt;em&gt;This text was written from a German viewpoint.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Even if our daily lives are not yet gravely impacted, we as humanity are standing in front of an existential threat. Our climate is warming rapidly. Technical progress combined with our standard of living have put us on a path to climate breakdown.&lt;/p&gt;
&lt;p&gt;When I was twenty, my take on the climate crisis was &amp;ldquo;we will figure it out along the way&amp;rdquo;. I had the belief that with some kind of invention we would be able to pull around. Furthermore, the scenario did not sound so serious to me yet.&lt;/p&gt;
&lt;p&gt;Today, ten years later, I think differently. I am a lot more sceptical about a magical technical fix. I accept the climate crisis as a huge global challenge. We cannot continue like this, we have a moral obligation to change. In this post, I want to tell my story: how I changed from a car addict to a climate activist.&lt;/p&gt;
&lt;p&gt;Why am I doing this publicly? Unfortunately, many of us, including myself, often live in a state of denial. Climate emergency is too abstract, too far away or too uncomfortable. However, the problem is so pressing that the climate crisis needs to take center stage in our society and our collective actions. I want to contribute to this through taking up a public position. Also, it helps me to organize my thoughts into a coherent argumentation.&lt;/p&gt;
&lt;h2 id=&#34;the-facts&#34;&gt;The Facts&lt;/h2&gt;
&lt;p&gt;Human caused global warming is with extremely high certainty a fact. The scientific community is clear: we are on our way in a three degrees plus hotter future.&lt;/p&gt;
&lt;p&gt;In the sixth report of the IPCC, which is the most prominent scientific body for climate change, it is written:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Human activities, principally through emissions of greenhouse gases, have unequivocally caused global warming, with global surface temperature reaching 1.1°C above 1850–1900 in 2011–2020. Global greenhouse gas emissions have continued to increase, with unequal historical and ongoing contributions arising from unsustainable energy use, land use and land-use change, lifestyles and patterns of consumption and production across regions, between and within countries, and among individuals (high confidence).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That temperature increase has grave consequences for e.g. the risk to die of heat.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../SRL-image-0.en.png&#34; width=&#34;100%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Source: https://www.ipcc.ch/report/ar6/syr/figures/summary-for-policymakers/figure-spm-3&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The consequence is that whole regions are becoming inhabitable without technical support. The IPCC has many more &lt;a href=&#34;https://www.ipcc.ch/report/ar6/syr/figures/&#34;&gt;impactful figures&lt;/a&gt;. If the facts are so clear why don&amp;rsquo;t we act?&lt;/p&gt;
&lt;h2 id=&#34;my-story&#34;&gt;My Story&lt;/h2&gt;
&lt;p&gt;I am a child of the car. I grew up in a suburb of Stuttgart, Germany, one of the industrial centers of our modern world. Here the car was invented and exported to all over the world in the past one hundred years.&lt;/p&gt;
&lt;p&gt;It is still a vivid memory how I visited my first webpage in the internet: &lt;a href=&#34;https://ferrari.de&#34;&gt;www.ferrari.de&lt;/a&gt;. Regularly, I visited motor sport events and read Germany&amp;rsquo;s most famous car magazine. My school notebooks were full of car drawings and I enthusiastically visited the biggest car trade fair (IAA). One of favorite hobbies back then: kart sports.&lt;/p&gt;
&lt;p&gt;For me technology always embodied progress. In the upcoming years, I built soccer robots, studied engineering and computer science with a focus on robotics. However, along the way, my worldview started to shift. It was not a single sudden event but a constant process that changed my view of the world.&lt;/p&gt;
&lt;h3 id=&#34;free-and-open-source-software&#34;&gt;Free and Open Source Software&lt;/h3&gt;
&lt;p&gt;In the beginning of my master&amp;rsquo;s studies, I changed the operating system of my laptop to GNU/Linux. Step by step I discovered the political aspect of software. People like &lt;a href=&#34;https://stallman.org/&#34;&gt;Richard Stallman&lt;/a&gt; are fighting since decades for the rights of software users. I realized that the interest of companies are seldom the same ones as the users.&lt;/p&gt;
&lt;h3 id=&#34;community&#34;&gt;Community&lt;/h3&gt;
&lt;p&gt;For more than ten years I have lived in shared flats with different people. My most beloved memories are the ones were we accomplished things as a community: big dinner parties, community gardening, house parties or climate camps. Everyone contributes what they can and even with little money a lot can be achieved. Contrary, marketing often shows us something completely different: that we are only worth something if we consume.&lt;/p&gt;
&lt;h3 id=&#34;partnership&#34;&gt;Partnership&lt;/h3&gt;
&lt;p&gt;The people closest to us influence us the most. In my case, this is Marika, who long before me cared for climate change. Furthermore, her commitment to feminism had shown me how unfair the world can be.&lt;/p&gt;
&lt;h3 id=&#34;daily-struggle&#34;&gt;Daily Struggle&lt;/h3&gt;
&lt;p&gt;A lot of modern technology frustrates me more than it excites. A good example is the smartphone. This device is more than any other developed to catch our attention. Hundreds of our generations&amp;rsquo; smartest minds are working on increasing the time spent with their apps. They do it with success. Constant interruptions hijack our daily lives. Be it during conversations, beautiful sunsets or work.&lt;/p&gt;
&lt;h3 id=&#34;climate-breakdown&#34;&gt;Climate Breakdown&lt;/h3&gt;
&lt;p&gt;For a long time scientists have been warning about extreme weather caused by global warming. The recent years have made clear that this is not only an academic discussion. Our European summers 2022, 2021 and 2018 have been unusual hot and dry. This cluster of events is no coincidence but caused by our greenhouse gas emissions.&lt;/p&gt;
&lt;p&gt;For the biggest part of my life I believed that technology will save us from climate emergency. Today, I think different. Technological &amp;ldquo;progress&amp;rdquo; paired with a capitalist economy has brought us into climate emergency. I find it naive to think that the same means will save us. To throw overboard long-held beliefs was and is painful. There still exists technology which fascinates me but this one has another character: high quality hand workshop tools, indestructible kitchen helpers or improvised DIY hacks.&lt;/p&gt;
&lt;p&gt;At some point I also took professional consequences. After spending many years with a focus on robotics and industry, working on self-driving cars would have been a logical consequence. My change of belief led me to work as a software developer for hospital IT.&lt;/p&gt;
&lt;h2 id=&#34;what-can-we-do&#34;&gt;What can we do?&lt;/h2&gt;
&lt;p&gt;As a first step, we have to acknowledge the truth. The situation is dire, we cannot do business as usual. Our material prosperity is based on the exploitation of earth, future generations and fellow living beings.&lt;/p&gt;
&lt;p&gt;We have to start asking big questions. What is the good life? What do we value as a society? How can we create a future for everyone? Such a shared utopia can serve us a guiding light on our way out of climate emergency.&lt;/p&gt;
&lt;p&gt;It is not up to us as individuals to come up with perfect solutions. That is the task of our government. With a clear picture of where we want to be, we can derive appropriate policies.&lt;/p&gt;
&lt;h2 id=&#34;how-can-i-contribute&#34;&gt;How can I contribute?&lt;/h2&gt;
&lt;p&gt;Only together we are powerful. That&amp;rsquo;s why collective organizing is our best bet. Only on the political level can we take decisions and implement policies that will bring change.&lt;/p&gt;
&lt;p&gt;For many years, the climate crisis was pictured as an individual problem. This campaign was supported by the fossil industry and allowed them to continue with business as usual. While big corporations and the super rich are accelerating us into climate breakdown, we as individuals are supposed to solve the problem through &amp;ldquo;green&amp;rdquo; consumerism. Clearly, this strategy has failed. It prevents effective organizing which is the most important tool we have.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>The Right Pan</title>
		<link>https://jenspetit.de/posts/2023/04/carbon_steel/</link>
		<pubDate>Fri, 31 Mar 2023 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2023/04/carbon_steel/</guid>
		<description>&lt;p&gt;Cooking is one of my favorite activities. It combines creativity, technique and it is a social event. On top of that, there is a tangible outcome which hopefully fills your belly. I regularly invite friends over to cook and eat together.&lt;/p&gt;
&lt;p&gt;As I am obsessed with good tools, I have strong opinions on the right cookware. A centerpiece of each kitchen is a good pan. This means for me that the pan&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;is durable. I want to buy a pan once and use it a lifetime.&lt;/li&gt;
&lt;li&gt;is easy to use. Cooking is an everyday activity and therefore all tools involved should not require doing extra rounds.&lt;/li&gt;
&lt;li&gt;heats up evenly. The entire pan surface gets hot and not only certain parts.&lt;/li&gt;
&lt;li&gt;is able to brown the ingredients. When I put stuff in a pan I usually want to achieve some kind of browning. A high heat capacity helps here.&lt;/li&gt;
&lt;li&gt;has non-stick properties.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you are looking for a new pan, those are usually the options in order of popularity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aluminium with some kind of high-tech coating like Teflon
&lt;figure&gt;&lt;img src=&#34;../DSCF1070.JPG&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;stainless steel
&lt;figure&gt;&lt;img src=&#34;../DSCF1069.JPG&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;cast iron
&lt;figure&gt;&lt;img src=&#34;../DSCF1073.JPG&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;carbon steel
&lt;figure&gt;&lt;img src=&#34;../DSCF1068.JPG&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aluminium is lightweight. Therefore, pans made out of this material are very easy to handle. However, lightweight also translates to an overall low heat capacity. Do you know this sizzling sound when putting stuff in the pan? This is where you want to be with a high quality pan. You will hardly have this with aluminium. The biggest selling point of Teflon pans is their non-stick coating. However, besides the desired non-stick property, there is a big negative side effect: Teflon has low heat conductivity. Therefore, the browning you can achieve with a Teflon pan is very limited.&lt;/p&gt;
&lt;p&gt;The worst part of Teflon pans is their durability. As your daily driver, such a pan will loose its non-stick properties within a year even when being considerate through e.g. only using wooden or plastic spatulas. With the coating gone, most of the pans end up being trashed soon. On top of that, the Teflon will at least partially end up in your food and therefore your body.&lt;/p&gt;
&lt;p&gt;Overall, in my opinion, Teflon pans are a big marketing hoax. Who really profits from them are the companies producing them: They can sell a new pan every three years. It&amp;rsquo;s a pity that so many of us (including the younger me) where so convinced that we take Teflon pans as the &amp;ldquo;ideal&amp;rdquo; pan for such a long time.&lt;/p&gt;
&lt;p&gt;Although I think stainless steel and cast iron are both good options, my personal favorite is carbon steel. The heat conductivity is better than stainless steel. Therefore, the pan heats up quickly and evenly. The pan stays hot even when throwing in cold ingredients due to its high heat capacity. The material thickness is usually thinner than cast iron as the material is less brittle. This translates to better maneuverability as carbon steel pans are lighter.&lt;/p&gt;
&lt;p&gt;Carbon steel is also cheaper than stainless steel. It is a material which was already widely available 100 years ago. It is the traditional material for Chinese woks. The metal builds up a natural non-stick property with each use. More to this in the second section of this post.&lt;/p&gt;
&lt;p&gt;The combination of all these properties results in great durability. It is a very liberating feeling being able to scratch around inside the pan without worrying about destroying it. A disadvantage compared to stainless steel is that carbon steel rusts. This can be easily prevented by correct usage though.&lt;/p&gt;
&lt;h2 id=&#34;using-carbon-steel&#34;&gt;Using Carbon Steel&lt;/h2&gt;
&lt;p&gt;Carbon steel builds up a natural non-stick property. This is achieved by polymerization of the cooking oil through heat which then sticks to the surface.&lt;/p&gt;
&lt;h3 id=&#34;seasoning&#34;&gt;Seasoning&lt;/h3&gt;
&lt;p&gt;Before using the pan for the first time, you need to create the first solid layer of non-stick coating. This process is called seasoning. I used the following method:&lt;/p&gt;
&lt;p&gt;Apply a thin layer of flaxseed oil all over the pan. Use some kind of wipe to do this. Then, heat up your oven to maximum temperature, put the pan inside for 30 minutes (upside down so any excess oil can run off). Afterwards, the steel should have a considerably darker color.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../DSCF1072.JPG&#34; width=&#34;100%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;That&amp;rsquo;s it. You can repeat the process although it is not necessary in my opinion if you follow the advice below in your daily cooking sessions.&lt;/p&gt;
&lt;h3 id=&#34;daily-usage&#34;&gt;Daily Usage&lt;/h3&gt;
&lt;p&gt;There are a couple of rules to follow if you want to have a great everyday cooking experience with your carbon steel pan.&lt;/p&gt;
&lt;h4 id=&#34;1-use-enough-oil&#34;&gt;1. Use enough oil&lt;/h4&gt;
&lt;p&gt;Without oil, things will stick and burn. There should be a thin layer covering the pan bottom.&lt;/p&gt;
&lt;h4 id=&#34;2-heat-up-the-pan-before-putting-anything-inside&#34;&gt;2. Heat up the pan before putting anything inside&lt;/h4&gt;
&lt;p&gt;The oil should be hot, ideally just before smoking. This prevents food from sticking because:&lt;/p&gt;
&lt;p&gt;a) It acts like on the spot seasoning. The hot oil will polymerize on any yet non-coated part of the pan.&lt;/p&gt;
&lt;p&gt;b) If the frying process already starts, then the food does not even touch the hot metal and cannot stick.&lt;/p&gt;
&lt;p&gt;c) The viscosity of oil is much lower when being hot. This makes it so much easier to have a thin oil layer everywhere in the pan. I usually swirl around the pan right before throwing anything inside.&lt;/p&gt;
&lt;p&gt;Using a hot pan is not only beneficial with carbon steel. It is recommended for any pan you are using, as it will prevent your ingredients from soaking up the oil.&lt;/p&gt;
&lt;h4 id=&#34;3-use-a-metal-spatula&#34;&gt;3. Use a metal spatula&lt;/h4&gt;
&lt;p&gt;If you want to have a good non-stick property with carbon steel it is important to have a smooth pan surface. If there are burned spots scratch them off. This is much easier with a metal spatula.&lt;/p&gt;
&lt;p&gt;So many of us including me have grown up with the constant nagging fear of destroying a coating while using a pan. With carbon steel that is history. Feel free to scratch around with the spatula. No need to worry. If worst comes to worst you can take a steel sponge and rub any stains off.&lt;/p&gt;
&lt;h4 id=&#34;4-have-a-cleaning-routine&#34;&gt;4. Have a cleaning routine&lt;/h4&gt;
&lt;p&gt;Carbon steel needs to be treated a little differently then your usual cookware as it can rust. To prevent rust, a small protective layer of oil should be present on the steel.&lt;/p&gt;
&lt;p&gt;I use the following routine:&lt;/p&gt;
&lt;p&gt;Wash the pan hot. If something did stick to the pan for some reason, it is easier to clean while still being hot. I usually put a little bit of warm water inside and use a brush to remove any excess food and oil. Warm water dissolves oil better and does not represent such a temperature shock to the steel. Use the metal spatula for harder residuals. After using the brush, I simply wipe the pan dry with a special towel which I only use for the carbon steel pans. Why? As I don&amp;rsquo;t use soap, there will always still be some oil around. That quickly makes the towel greasy which is actually a good thing. Besides drying the pan, the special towel will leave behind a thin layer of oil.&lt;/p&gt;
&lt;p&gt;It is a false assumption that soap destroys the coating. The patina does easily withstand soap. However, soap will remove all excess oil. This is not what we want as we need that thin layer of protective oil. Therefore, don&amp;rsquo;t use soap.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it. No applying oil after drying the pan, no putting the pan back on the stove to dry it. I want a simple process and this one does it for me.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>My Software Setup</title>
		<link>https://jenspetit.de/posts/2022/05/linux_setup/</link>
		<pubDate>Wed, 27 Apr 2022 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2022/05/linux_setup/</guid>
		<description>&lt;p&gt;This post gives a quick overview about the software I run on my PCs. In general, I am looking for keyboard centric tools which follow the UNIX philosophy (doing one thing right). Ideally, the tool integrates well into the terminal because that is where I spend a lot of my computer time - besides the browser maybe.&lt;/p&gt;
&lt;h3 id=&#34;operating-system&#34;&gt;Operating System&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://archlinux.org/&#34;&gt;Arch Linux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was an Ubuntu user before but switched to Arch Linux since some years now. The rolling release models gives me access to the latest software and I only rarely have any stability issues. Arch also allows me to run my own customized desktop experience without any pre-installed other packages. Additionally, the AUR is a great resource for additional packages.&lt;/p&gt;
&lt;h3 id=&#34;window-manager&#34;&gt;Window Manager&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://dwm.suckless.org/&#34;&gt;dwm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At some point, I took a deep dive into tiling window managers and ended up with dwm. Although it is fairly small program, it provides me with the functionality that i need: tiling, easy on resources, workspaces / tags, multi-monitor support, keyboard centric.&lt;/p&gt;
&lt;h3 id=&#34;terminal-emulator&#34;&gt;Terminal Emulator&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://st.suckless.org/&#34;&gt;st&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have a strong opinion here. It just works and I like the suckless philosophy.&lt;/p&gt;
&lt;h3 id=&#34;shell&#34;&gt;Shell&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://zsh.sourceforge.io/&#34;&gt;zsh&lt;/a&gt; with oh-my-zsh.&lt;/p&gt;
&lt;p&gt;It seems like the better Bash to me.&lt;/p&gt;
&lt;h3 id=&#34;text-editor&#34;&gt;Text editor&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/neovim/&#34;&gt;Neovim&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started using Vim in a university project where we had to use a remote server for machine learning tasks via SSH. Since then, I am passionate about Vims modal text editing approach, it makes text editing fun. For ease-of-use I remapped ESC to Caps Lock. Nvim is my editor at work, except when I work on large Java projects where IDEs like Intellij shine.&lt;/p&gt;
&lt;h3 id=&#34;file-manager&#34;&gt;File manager&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gokcehan/lf&#34;&gt;lf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was using Thunar before, but always wanted for a more terminal centered tool. Most of time I am not using a file manager at all but simply the shell.&lt;/p&gt;
&lt;h3 id=&#34;mail&#34;&gt;Mail&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.thunderbird.net/en-US/&#34;&gt;Thunderbird&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since many years, it does the job for me. Email filters do a great job in keeping your inbox organized.&lt;/p&gt;
&lt;h3 id=&#34;browser&#34;&gt;Browser&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.mozilla.org/en-US/firefox/new/&#34;&gt;Firefox&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;password-manager&#34;&gt;Password Manager&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://www.passwordstore.org/&#34;&gt;pass&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Integrates very nicely with dwm and dmenu and gives me access to my passwords in less than a second.&lt;/p&gt;
&lt;h3 id=&#34;note-taking&#34;&gt;Note Taking&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://orgmode.org/&#34;&gt;emacs org-mode&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before I was taking notes in markdown but realized that I would like some more features. This is my first contact with the emacs world, maybe at some point I will ditch Vim for it? Who knows.&lt;/p&gt;
&lt;h3 id=&#34;dotfile-management&#34;&gt;Dotfile Management&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://git-scm.com/&#34;&gt;git&lt;/a&gt; with &lt;a href=&#34;https://github.com/anishathalye/dotbot&#34;&gt;dotbot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I use different branches for each laptop to keep the same base configuration.&lt;/p&gt;
&lt;h3 id=&#34;snippets&#34;&gt;Snippets&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/gotbletu/shownotes/blob/master/snippy.sh&#34;&gt;snippy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A small but powerful script which makes information which I need to share in many places easily available (like address, bank account, &amp;hellip;).&lt;/p&gt;
&lt;h3 id=&#34;video-player&#34;&gt;Video Player&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://mpv.io/&#34;&gt;mpv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Works great.&lt;/p&gt;
&lt;h3 id=&#34;rss-reader&#34;&gt;RSS Reader&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://newsboat.org/&#34;&gt;newsboat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My own newsfeed.&lt;/p&gt;
&lt;h3 id=&#34;pdf&#34;&gt;PDF&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://pwmt.org/projects/zathura/&#34;&gt;zathura&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Vim keybindings and keyboard centric UI make me happy.&lt;/p&gt;
&lt;h3 id=&#34;terminal-multiplexer&#34;&gt;Terminal Multiplexer&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tmux/tmux/wiki&#34;&gt;tmux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Although I use a tiling manager, sometimes tmux sessions come in very handy and keep my work organized.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>My Hosting Setup</title>
		<link>https://jenspetit.de/posts/2022/04/hosting/</link>
		<pubDate>Mon, 11 Apr 2022 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2022/04/hosting/</guid>
		<description>&lt;p&gt;Since some time now, I am running my own private server with a couple of different services. The website which you are currently reading is also hosted on this server. I want to give a short overview about the technical background and summarize some of my experience from the last years.&lt;/p&gt;
&lt;h2 id=&#34;hosting-provider&#34;&gt;Hosting Provider&lt;/h2&gt;
&lt;p&gt;When I started, I was using &lt;a href=&#34;https://www.netcup.de/&#34;&gt;Netcup&lt;/a&gt; but switched to &lt;a href=&#34;https://www.hetzner.com/&#34;&gt;Hetzner&lt;/a&gt; since a couple of weeks. In general, I was looking for a hosting provider with Linux root servers located in Germany. Ideally, the company would run their servers on renewable electricity and have a fair price.&lt;/p&gt;
&lt;p&gt;Why did I switch from Netcup to Hetzner? Hetzner has from my point of view a couple of advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minute-based invoicing&lt;/li&gt;
&lt;li&gt;good UI for administration&lt;/li&gt;
&lt;li&gt;dynamic server scaling within minutes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The prices are slightly higher, however I am much more flexible and can down- and upgrade the machine whenever I need.&lt;/p&gt;
&lt;h2 id=&#34;os-and-provisioning&#34;&gt;OS and Provisioning&lt;/h2&gt;
&lt;p&gt;As an operating system, I chose the latest long-term stable release of Ubuntu, mainly because I used it as my private OS on my laptop before. It is stable and well suited for my use-case.&lt;/p&gt;
&lt;p&gt;Since I good introduced to &lt;a href=&#34;https://www.ansible.com/&#34;&gt;Ansible&lt;/a&gt; through my work, it became my preferred way of administrating remote servers. The advantages are that everything is scripted and visible in code which allows me to quickly bring up a new server. Furthermore, I can use pre-made roles for security settings (like &lt;a href=&#34;https://github.com/geerlingguy/ansible-role-security&#34;&gt;this one&lt;/a&gt;) so I can easily follow best-practices.&lt;/p&gt;
&lt;h2 id=&#34;reverse-proxy-certs-and-services&#34;&gt;Reverse Proxy, Certs And Services&lt;/h2&gt;
&lt;p&gt;Currently I am running the following services on the server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;my website&lt;/li&gt;
&lt;li&gt;static file server (sharing large files with others)&lt;/li&gt;
&lt;li&gt;peertube instance&lt;/li&gt;
&lt;li&gt;funkwhale instance&lt;/li&gt;
&lt;li&gt;hedgedoc instance&lt;/li&gt;
&lt;li&gt;my diyary&lt;/li&gt;
&lt;li&gt;another website&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All services run in Docker containers which makes dependency management and upgrading easy. As a reverse-proxy, I use &lt;a href=&#34;https://doc.traefik.io/traefik/&#34;&gt;Traefik&lt;/a&gt; which goes very well together with Docker containers. It provides automatic service discovery via labels given in docker-compose files. I maintain one code repository where each service resides in a folder with its own docker-compose file. It is structured like this:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;.
├── diyary
│   └── docker-compose.yml
├── docker-compose.yaml
├── files
│   └── docker-compose.yaml
├── funkwhale
│   ├── docker-compose.yaml
│   ├── funkwhale_proxy.conf
│   └── funkwhale.template
├── hedgedoc
│   └── docker-compose.yml
├── nginx
│   └── docker-compose.yaml
├── nginx_marika
│   └── docker-compose.yaml
├── peertube
│   └── docker-compose.yml
├── README.md
├── rocketchat
│   └── docker-compose.yml
├── traefik_dyn.yaml
└── traefik.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the root of the repo is a docker-compose which starts Traefik and Portainer as infrastructure services:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3.8&amp;#39;

services:
  traefik:
    image: traefik:latest
    restart: always
    ports:
      - &amp;#34;80:80&amp;#34;
      - &amp;#34;443:443&amp;#34;
      - &amp;#34;127.0.0.1:8080:8080&amp;#34;
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik.yaml:/traefik.yaml:ro
      - ./traefik_dyn.yaml:/dynamic/traefik_dyn.yaml:ro
    networks:
      - web

  portainer_server:
    image: portainer/portainer-ce
    command: -H unix:///var/run/docker.sock
    volumes:
      - portainer_data:/data
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    ports:
      - &amp;#34;127.0.0.1:9000:9000&amp;#34;
    restart: always

volumes:
  portainer_data:

networks:
  web:
    external: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that I use an external network called &amp;ldquo;web&amp;rdquo; for Traefik. All services residing in this network will be automatically picked up by Traefik because I configured Traefik with the options&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;providers:
  docker:
    endpoint: &amp;#34;unix:///var/run/docker.sock&amp;#34;
    exposedByDefault: false
    network: web
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The network is created via Ansible before any service is started. One note on the port bindings of Docker: it is very important to bind things like portainer with the interface explicitly specified (here &lt;code&gt;127.0.0.1&lt;/code&gt;), otherwise you might expose the service to the open internet. Docker is &lt;em&gt;not&lt;/em&gt; restricted by your firewall settings!&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s take a look at a single service, for example my website running with nginx:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#34;3&amp;#34;

services:
  website:
    image: nginx:latest
    volumes:
      - /home/services/website:/usr/share/nginx/html:ro
    labels:
      - &amp;#34;traefik.enable=true&amp;#34;
      - &amp;#34;traefik.http.routers.website.rule=Host(`www.jenspetit.de`, `jenspetit.de`)&amp;#34;
      - &amp;#34;traefik.http.routers.website.entrypoints=websecure&amp;#34;
      - &amp;#34;traefik.http.routers.website.tls=true&amp;#34;
      - &amp;#34;traefik.http.routers.website.tls.certresolver=netcup&amp;#34;
      - &amp;#34;traefik.http.services.website.loadbalancer.server.port=80&amp;#34;
    networks:
      - web
    restart: unless-stopped

networks:
  web:
    external: true
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Through the labels given in the file, Traefik will automatically create the correct routes and generate a valid certificate via Let&amp;rsquo;s Encrypt and a http challenge. Therefore, I don&amp;rsquo;t have to manually edit any configuration when deploying a new service, I simply start the corresponding docker-compose which I do via executing an Ansible playbook.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Right now, I am happy with the setup I have. It allows me to quickly add new services via Docker and Traefik withouth being too complex. At some point, I might want to add a VPN connection from my private laptop, so I don&amp;rsquo;t need to do any port forwarding to administrative interfaces or internal services.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>The DIYary</title>
		<link>https://jenspetit.de/posts/2021/11/diyary/</link>
		<pubDate>Sat, 27 Nov 2021 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2021/11/diyary/</guid>
		<description>&lt;p&gt;I have added a new subsection to my webpage which acts as a journal for any DIY-related topics. Me and some friends will add failures as well as successes from our daily lives to it. Take a look &lt;a href=&#34;https://diyary.jenspetit.de&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;technical-background&#34;&gt;Technical Background&lt;/h2&gt;
&lt;p&gt;As I wanted to make contributing to this &amp;ldquo;blog&amp;rdquo; as easy as possible, I created a telegram chatbot. As an activated contributer, you can simply talk to the &lt;code&gt;@diyary_kg9_bot&lt;/code&gt;. It will guide you through creating a new blogpost.&lt;/p&gt;
&lt;p&gt;Once the conversation has ended, the responses are used to fill a markdown template file based on the Jinja2 templating engine. Finally, using the simple static site generator &lt;a href=&#34;https://pedantic.software/git/blogit/summary/&#34;&gt;blogit&lt;/a&gt;, the website is generated. It is then deployed via rsync to a folder which is the root for an nginx webserver. Additionally, the source files are committed into a git repository. I can clone this repository and commit to it for manual editing of the blog.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Improving Efficiency in X-Ray Computed Tomography</title>
		<link>https://jenspetit.de/posts/2020/09/master_thesis/</link>
		<pubDate>Tue, 29 Sep 2020 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2020/09/master_thesis/</guid>
		<description>&lt;p&gt;The final project of my studies was the master&amp;rsquo;s thesis. It has the rather long title &lt;em&gt;&amp;ldquo;Improving Efficiency in X-Ray Computed Tomography Using Compile-Time Programming and Heterogeneous Computing&amp;rdquo;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Specifically, my task involved the open source software &lt;a href=&#34;https://gitlab.lrz.de/IP/elsa/&#34;&gt;elsa&lt;/a&gt; which is developed at &lt;a href=&#34;https://ciip.in.tum.de/&#34;&gt;the computational imaging and inverse problems group&lt;/a&gt; at the Technical University of Munich. As I have enjoyed my involvement in Free and Open Source Software before, most notably with &lt;a href=&#34;www.moveit.org&#34;&gt;MoveIt&lt;/a&gt;, I was happy to again contribute to a larger public project.&lt;/p&gt;
&lt;p&gt;My work was divided into two interrelated tasks both concerned with improving the efficiency in elsa:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../schema.png&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;Before diving deeper into the programming part, I will give a short primer on computed tomography.&lt;/p&gt;
&lt;h2 id=&#34;what-is-computed-tomography&#34;&gt;What is computed tomography?&lt;/h2&gt;
&lt;p&gt;Due to their high energy nature, X-rays are able to penetrate objects which are opaque to the human eye. However, they not only traverse the object but also interact with its matter. This interaction is what enables X-ray imaging. Equivalent to photography, X-ray imaging captures the differences in modulation leading to results
like the famous first radiograph of Röntgen’s wife hand shown in the Figure below. The bones of the hand exhibit stronger absorption compared to the soft tissue surrounding it.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../x_ray_intro.jpg&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;The main drawback from basic X-ray imaging is its projective nature: The measured intensity corresponds to the accumulated absorption after the ray has completely traversed the object. Therefore, all depth information is lost. This limitation is what computed tomography overcomes and achieved through taking multiple measurements of the same object at different angles. In practice, it is realized through a rotating X-ray source and detector setup as shown in the picture.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../ct_basic_setup.png&#34; width=&#34;50%&#34;&gt;
&lt;/figure&gt;

&lt;p&gt;As one can imagine, combining those multiple measurements into a single 3D model is challenging. It is classified as an ill-posed inverse problem where one wants to reconstruct the causes (absorption coefficients in the object) from the effects (pixelwise intensity measurements). The inverse problem of X-ray CT falls into the category of ill-posed problems as the solution might not always be unique and small measurement errors can cause large deviations in the solution.&lt;/p&gt;
&lt;p&gt;After discretization, the problem to solve can be expressed as simple linear equation
$$
A x = y
$$
where $y$ is the vector of measurements and $x$ is the linearized vector of absorption coefficients of the object. The matrix $A$ is called the system matrix and incorporates all the information about the geometry of the source as well as the detector.&lt;/p&gt;
&lt;p&gt;At first this seems like a very easy problem: simply compute
$$
x = A^{-1} y
$$
and be done. However, the dimensions of $x$, $y$ and $A$ make this prohibitively expensive. A typical 3D reconstruction volume has $n = 1024^3$ elements. All of the projections taken together are in the same order of magnitude, resulting in $m = 1024^3$ measurements. This means $A$ has $m × n = 2^{60}$ entries, requiring multiple exa-bytes of memory for storing it.&lt;/p&gt;
&lt;p&gt;Due to the problem size, computational efficiency is a core requirement for computed tomography. The programming technique of Expression Templates (ETs) is one building block for this.&lt;/p&gt;
&lt;h2 id=&#34;expression-templates&#34;&gt;Expression Templates&lt;/h2&gt;
&lt;p&gt;ETs are a compile-time programming technique to avoid intermediate results while still allowing an intuitive mathematical syntax. Consequently, all major C++ linear algebra libraries implement it. ETs are best understood following a practical example, assuming a &lt;code&gt;Vector&lt;/code&gt; class as a wrapper around a raw array. We can define custom functions for each specific calculation as shown below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Vector&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Vector &lt;span style=&#34;color:#a6e22e&#34;&gt;saxpy&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; a, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; Vector&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; X, &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; Vector&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; Y)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Vector result(X.size());
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt;(size_t i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; result.size(); &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;i)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; X[i] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; Y[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;auto&lt;/span&gt; result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; saxpy(a, X, Y);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, instead of having to write and call a function for each mathematical operation, we want to define operators like $+$, $-$ and so on for intuitive notation. In C++, this is easily doable with operator overloading:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Vector &lt;span style=&#34;color:#66d9ef&#34;&gt;operator&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(Vector &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; lhs, Vector &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; rhs) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Vector &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt;(lhs);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;; i &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; lhs.getSize(); &lt;span style=&#34;color:#f92672&#34;&gt;++&lt;/span&gt;i) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        result[i] &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; rhs[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; result;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Vector &lt;span style=&#34;color:#66d9ef&#34;&gt;operator&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; lhs, Vector &lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&lt;/span&gt; rhs);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Vector X, Y, A;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;A &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; X &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; Y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, this comes with two deficits: speed and memory. C++ implements eager evaluation which means that each operator will be evaluated on its own as soon as possible. For example in the saxpy computation, this means that two complete for loops through all elements will be executed and one intermediate result from &lt;code&gt;A * x&lt;/code&gt; stored.&lt;/p&gt;
&lt;p&gt;Overcoming these shortcomings is the purpose of ETs. The idea is to save the computations to be done as a type of a lightweight &lt;code&gt;Expression&lt;/code&gt; object at compile-time. This object can then be evaluated in a single pass
and only when needed.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s look at an example again:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;template&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;Left_Operand, Right_Operand, Operation&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Expression&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{ ... };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Expression expression &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; X &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; Y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What is now the type of &lt;code&gt;expression&lt;/code&gt;? It&amp;rsquo;s easier to first start with &lt;code&gt;a * X&lt;/code&gt; which has the type&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Expression&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;float&lt;/span&gt;, Vector, Mult&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;and consequently the combined term has the type&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-cpp&#34; data-lang=&#34;cpp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Expression&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; Expression&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;...&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;,  &lt;span style=&#34;color:#75715e&#34;&gt;// a * X
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Vector,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            Plus&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;expression-templates-for-elsa&#34;&gt;Expression Templates for elsa&lt;/h3&gt;
&lt;p&gt;In elsa, a custom &lt;code&gt;DataContainer&lt;/code&gt; class is used which wraps an Eigen matrix. The implementation is heavily based on the talk given by Bowie Owens at CppCon 2019. He presents ETs using modern C++17.&lt;/p&gt;
&lt;center&gt;&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube-nocookie.com/embed/4IUCBx5fIv0&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;p&gt;Internally, Eigen already implements ETs. Consequently, the task for my thesis was leveraging the Eigen internal ETs while still maintaining the elsa interface with the &lt;code&gt;DataContainer&lt;/code&gt; class.&lt;/p&gt;
&lt;h3 id=&#34;results&#34;&gt;Results&lt;/h3&gt;
&lt;p&gt;After &lt;a href=&#34;https://gitlab.lrz.de/IP/elsa/-/issues/4&#34;&gt;having implemented ETs&lt;/a&gt;, it is time to evaluate them. For this, incrementally longer mathematical expressions are computed with elsa. They are:&lt;/p&gt;
&lt;p&gt;a) $x = x * y$ (a)&lt;/p&gt;
&lt;p&gt;b) $x = x * y + y$ (b)&lt;/p&gt;
&lt;p&gt;c) $x = x * y + y / z$ (c)&lt;/p&gt;
&lt;p&gt;d) $x = x * y + y / z + x$ (d)&lt;/p&gt;
&lt;p&gt;The results shown in the figure below clearly indicate the efficiency gains through using ETs compared to operator overloading. As the expressions get longer, the difference increases. The results also show that there are only slight performance penalties compared to directly using the Eigen implementation. Great!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../benchmarking_ets.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Benchmarking Expression Templates&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;gpu-computing-for-elsa&#34;&gt;GPU Computing for elsa&lt;/h2&gt;
&lt;p&gt;The second aspect of my master&amp;rsquo;s thesis concerned utilizing GPUs. As explained before, computed tomography deals with solving a huge linear system of equations. For this, large arrays of numbers have to be manipulated. This is the perfect task for GPUs, as they can do parallel processing in their hundreds of computational cores.&lt;/p&gt;
&lt;p&gt;In elsa, the abstraction with the &lt;code&gt;DataContainer&lt;/code&gt; comes in handy: depending on the user and available hardware, it can be created either in main memory (using Eigen) or on the GPU (using CUDA). However, the interface and available operations stay fixed. Therefore, the user can be as little as possible concerned with where exactly the computations happen. For him/her the &lt;code&gt;DataContainer&lt;/code&gt; behaves the same. One challenge was that CUDA, opposed to Eigen, does not provide ETs. Therefore, my task was first coming up with CUDA enabled ETs and then integrating them into elsa as done with Eigen before.&lt;/p&gt;
&lt;p&gt;Again, I took inspiration from the talk given by Bowie Owens. But in this case, some difficulties came up: first of all, CUDA does not fully support metaprogramming although this is a crucial feature for ETs. Second, for the ETs to be evaluated on the GPU, they need to be transfered to the GPU. Both steps required a lot of tinkering and a deep understanding of how CUDA device code works. For a more thorough discussion, you can take a look at &lt;a href=&#34;https://gitlab.lrz.de/IP/elsa/issues/21&#34;&gt;this Gitlab issue&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;results-1&#34;&gt;Results&lt;/h3&gt;
&lt;p&gt;The results show impressive performance for the saxpy (single precision a times x plus y) computation: on the one hand, its around 30 times faster than Eigen and on the other hand, compared to directly using a saxpy kernel, the overhead of using the &lt;code&gt;DataContainer&lt;/code&gt; with its flexible and intuitive notation is negligible.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../gpu_ets_results.jpg&#34;&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Both goals I set out to solve for my thesis where achieved: elsa now includes ETs using the Eigen internal ETs as well as CUDA with the ETs implemented by myself. It was a lot of fun working together my supervisor Tobias plus other (PhD) students on elsa. I definitely got a deeper understanding of C++, especially the metaprogramming aspects.&lt;/p&gt;
&lt;p&gt;If you are interested in further details, you can &lt;a href=&#34;../Master_Thesis_Jens_Petit.pdf&#34;&gt;download my full thesis&lt;/a&gt;.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Google Summer of Code 2019</title>
		<link>https://jenspetit.de/posts/2020/11/moveit/</link>
		<pubDate>Sun, 01 Sep 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2020/11/moveit/</guid>
		<description>&lt;p&gt;I participated in the 2019 edition of Google Summer of Code. I was lucky to work with great mentors
on MoveIt, which is part of the Robot Operating System (ROS). For more details, see &lt;a href=&#34;https://moveit.ros.org/bullet/collision%20detection/moveit/2020/11/18/bullet-collision.html&#34;&gt;this blogpost&lt;/a&gt;.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Remote Controlling the Robot with a Gamepad</title>
		<link>https://jenspetit.de/posts/2019/04/remote_controlling_robot_gamepad/</link>
		<pubDate>Fri, 05 Apr 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2019/04/remote_controlling_robot_gamepad/</guid>
		<description>&lt;p&gt;In this post, I want to give a quick overview how you can remote control a small mobile robotics platform with a game controller. We will use the &lt;a href=&#34;https://wiki.ros.org/joy&#34;&gt;joy package&lt;/a&gt; of ROS to have the device publishing ROS messages. The necessary steps are described in &amp;ldquo;Setting up the Joystick&amp;rdquo; in the teleop &lt;a href=&#34;https://wiki.ros.org/joy/Tutorials/WritingTeleopNode&#34;&gt;ROS tutorial&lt;/a&gt;. I will quickly summarize them here.&lt;/p&gt;
&lt;h2 id=&#34;controller-setup&#34;&gt;Controller Setup&lt;/h2&gt;
&lt;p&gt;Plug in your controller and check if its available with&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ls -l /dev/input/js*
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The star is the wildcard operator. Change the permissions to the device so that all have read and write accessibility through&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo chmod a+rw /dev/input/jsX
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Now, start the roscore, set parameters, start the publisher node&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ roscore
$ rosparam set joy_node/dev &amp;#34;/dev/input/jsX&amp;#34;
$ rosrun joy joy_node
$ rostopic echo joy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and when you push a button or move a joystick you should see a new message arriving. Find out which part of the message corresponds to the joysticks. We will map each of the two to one wheel of the differential drive robot.&lt;/p&gt;
&lt;h2 id=&#34;network-setup&#34;&gt;Network Setup&lt;/h2&gt;
&lt;p&gt;We will have the controller plugged in our laptop / PC and not directly in the robot (which uses the Beagle Bone Blue). Therefore we have a multiple machine setup. Run the roscore on the laptop. If automatic host resolving is not working, you also have to set&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ export ROS_IP=machine_IP
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;on &lt;span style=&#34;text-decoration:underline;&#34;&gt;both&lt;/span&gt; the BBBL and the laptop. Remember that environment variables are only set for one terminal, if you open a new one they are not available. On the BBBL you also have to&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;(BBBL) $ export ROS_MASTER_URI=laptop_ip:port
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;implementing-the-callback&#34;&gt;Implementing the Callback&lt;/h2&gt;
&lt;p&gt;On the BBBL, we will run a subscriber to the topic joy. Each time a message is received, a callback function is called - here we will set the motor speeds.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;(BBBL) $ rostopic echo joy
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You should see the exact same output as when running the command on your laptop. In the callback function, I additionally print out the received value and make the LED light up if the joystick value is larger than 0.5. The full code is available also on &lt;a href=&#34;https://github.com/j-petit/bbbl_robot/blob/master/src/joy_listener.cpp&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void chatterCallback(const sensor_msgs::Joy::ConstPtr&amp;amp; msg)
{
  ROS_INFO_STREAM(&amp;#34;I heard: &amp;#34; &amp;lt;&amp;lt; msg-&amp;gt;axes[1]);
  ROS_INFO_STREAM(&amp;#34;I heard: &amp;#34; &amp;lt;&amp;lt; msg-&amp;gt;axes[3]);

  rc_motor_set(1, msg-&amp;gt;axes[1]);
  rc_motor_set(2, msg-&amp;gt;axes[3]);

  if (msg-&amp;gt;axes[1] &amp;gt; 0.5)
  {
    rc_led_set(RC_LED_GREEN, 1);
  }
  else
  {
    rc_led_set(RC_LED_GREEN, 0);
  }
  if (msg-&amp;gt;axes[3] &amp;gt; 0.5)
  {
    rc_led_set(RC_LED_RED, 1);
  }
  else
  {
    rc_led_set(RC_LED_RED, 0);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;having-fun&#34;&gt;Having Fun&lt;/h2&gt;
&lt;p&gt;See the video below for the project in action.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; src=&#34;https://videos.jenspetit.de/videos/embed/5a6cbd8f-d0ae-4e78-87ae-53777562905d&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
	</item>
	
	<item>
		<title>Building a mobile robotics platform with LEGO</title>
		<link>https://jenspetit.de/posts/2019/04/building_mobile_robotics_platform_lego/</link>
		<pubDate>Wed, 03 Apr 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2019/04/building_mobile_robotics_platform_lego/</guid>
		<description>&lt;p&gt;As I had an old LEGO NXT set lying around at home, I decided to set up my little mobile autonomous robotics platform with it. The nice thing about LEGO is that I can quickly change anything I want without having to drill, cut or glue. Its fun and and it remembers me of my youth when I was building huge LEGO models for hours with a friend of mine.&lt;/p&gt;
&lt;p&gt;What you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Beagle Bone Blue (BBBL)&lt;/li&gt;
&lt;li&gt;LEGO NXT motors and cables&lt;/li&gt;
&lt;li&gt;BBBL &lt;a href=&#34;https://www.conrad.com/p/bb-blue-kabelset-1606596&#34;&gt;cable&lt;/a&gt; set with JST SH connectors&lt;/li&gt;
&lt;li&gt;DC power transformer or battery (6-12V)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The cable of the motors to the BBBL requires a little bit of soldering. The BBBL has separate encoder in- and PWM outputs located at the &amp;ldquo;back&amp;rdquo; side whereas the original LEGO NXT motors use only a single cable.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;BBBL motor out and encoder in&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Now the crucial thing is to make the right connections. The LEGO cable configuration is&lt;/p&gt;
&lt;table class=&#34;wp-block-table aligncenter is-style-stripes&#34;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;**Color**&lt;/td&gt;&lt;td&gt;**Name**&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;White&lt;/td&gt;&lt;td&gt;Motor 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Black&lt;/td&gt;&lt;td&gt;Motor 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Red&lt;/td&gt;&lt;td&gt;GND&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Green&lt;/td&gt;&lt;td&gt;4.3 Volts&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Yellow&lt;/td&gt;&lt;td&gt;Tach01&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Blue&lt;/td&gt;&lt;td&gt;Tach02&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;and matching this to the BBBL pin configuration&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-2.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Motor outputs on the BBBL&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../image-3.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Encoder inputs on the BBBL&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;should give you beautiful cables like shown below. The white dot on the PCB indicates pin number 1 if you are not familiar with the convention.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../motor_cable.jpeg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Motor cable from NXT to BBBL.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You should now be able to drive your robot around using PWM and also control the speed with the integrated encoders.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ rc_test_pwm -d 0.5
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Test this out by running the PWM ports with 50 percent duty cycle. Your small robot should move! Although finding a safe place for the BBBL was not trivial, I finally have a small mobile platform to tinker around and I can change the layout as I like because it is LEGO :).&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../lego_platform.jpeg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The LEGO platform&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../full_robot.jpeg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The full robot&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

</description>
	</item>
	
	<item>
		<title>Compiling and Running your first ROS program on the Beagle Bone Blue</title>
		<link>https://jenspetit.de/posts/2019/03/compiling_running_first_bbb/</link>
		<pubDate>Sun, 31 Mar 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2019/03/compiling_running_first_bbb/</guid>
		<description>&lt;p&gt;This is a follow up post to the &lt;a href=&#34;https://jenspetit.de/posts/2018/03/gettings_started_bbb_ubuntu_ros&#34;&gt;introduction to ROS and the Beagle Bone Blue&lt;/a&gt; (BBBL). I will guide you through compiling your first own ROS node which contains some functionality of the robotcontrol library. This library is specifically made for the BBBL and enables the robotics functionality of the board (I/O ports, I2C, PWM, UART, etc.).&lt;/p&gt;
&lt;p&gt;It usually comes with the preinstalled images if you followed the previous post. Otherwise, you can install it with&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo apt-get install librobotcontrol
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;writing-a-simple-c-program&#34;&gt;Writing a simple C program&lt;/h2&gt;
&lt;p&gt;First things first, we will write a super simple C-Program, to see if everything is set up correctly. Open up your favorite text-editor on the BBBL (mine is Vim of course) and paste/write the following simple hello world.  Besides the text appearing on stdout, it will also light up the green on-board LED and then turn it off again after some time.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;rc/led.h&amp;gt;
#include &amp;lt;rc/time.h&amp;gt;

#define WAIT_US 500000 // time to light each LED in microseconds
int main()
{
   printf(&amp;#34;Hello, World!\n&amp;#34;);
   rc_led_set(RC_LED_GREEN,1);
   rc_usleep(WAIT_US);
   rc_led_set(RC_LED_GREEN,0);
   rc_led_cleanup();
   return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Compile the program with&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ gcc test.c -lrobotcontrol
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;and run the output. Congratulations if you see the LED lighten up!&lt;/p&gt;
&lt;h2 id=&#34;writing-your-first-ros-c-program&#34;&gt;Writing your first ROS C++ program&lt;/h2&gt;
&lt;p&gt;All the source code is for this section is available on my &lt;a href=&#34;https://github.com/j-petit/bbbl_robot&#34;&gt;github&lt;/a&gt;. We will roughly follow the &lt;a href=&#34;https://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29&#34;&gt;talker / listener tutorial&lt;/a&gt; described in the official ROS tutorials but add our own code to use the robotics capabilities of the BBBL.&lt;/p&gt;
&lt;p&gt;To do this, modify the talker.cpp file as shown below, which adds a line for turning the green LED on and off and includes the necessary header file.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;#34;ros/ros.h&amp;#34;
#include &amp;#34;std_msgs/String.h&amp;#34;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;rc/led.h&amp;gt;

int main(int argc, char **argv)
{
  ros::init(argc, argv, &amp;#34;talker&amp;#34;);
  ros::NodeHandle n;
  ros::Publisher chatter_pub = n.advertise&amp;lt;std_msgs::String&amp;gt;(&amp;#34;chatter&amp;#34;, 1000);
  ros::Rate loop_rate(100);

  int count = 0;

  while (ros::ok())
  {
    rc_led_set(RC_LED_GREEN, count % 2);

    std_msgs::String msg;
    std::stringstream ss;
    ss &amp;lt;&amp;lt; &amp;#34;hello world &amp;#34; &amp;lt;&amp;lt; count;
    msg.data = ss.str();

    ROS_INFO(&amp;#34;%s&amp;#34;, msg.data.c_str());
    chatter_pub.publish(msg);
    ros::spinOnce();
    loop_rate.sleep();
    ++count;
  }

  rc_led_set(RC_LED_GREEN, 0);

  return 0;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For building the project, we have to add the line&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;target_link_libraries(talker robotcontrol)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to the CMakeLists.txt file of the package. Then build the package as always utilizing the &lt;code&gt;catkin_make&lt;/code&gt; command. Next, use rosrun to start the talker and listener after starting a roscore on the BBBL and you should get the usual talker listener helloworld output as well as a blinking green LED. Cool!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image_blinking_green_led-1.jpeg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Upper green LED lighting up. The other one indicates active WIFI.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

</description>
	</item>
	
	<item>
		<title>Formation Control of Quadrocopters</title>
		<link>https://jenspetit.de/posts/2019/03/formation_control_quadrocopters/</link>
		<pubDate>Fri, 22 Mar 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2019/03/formation_control_quadrocopters/</guid>
		<description>&lt;p&gt;See &lt;a href=&#34;https://github.com/j-petit/consensus-formation-control&#34;&gt;github&lt;/a&gt; for code and &lt;a href=&#34;Petit_Jens_BA.pdf&#34;&gt;my thesis as a pdf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For my bachelor thesis, I had the opportunity to work for six months at the &lt;a href=&#34;http://www.namerikawa.sd.keio.ac.jp/&#34;&gt;Namerikawa Laboratory&lt;/a&gt; at Keio University in Tokyo, Japan. The contact came through my professor Oliver Sawodny at the &lt;a href=&#34;https://www.isys.uni-stuttgart.de/&#34;&gt;Institute for System Dynamics at the University of Stuttgart&lt;/a&gt; where I did my undergraduate studies. The lab focuses mainly on distributed control topics in the field of smart grids but also with agents such as drones&lt;/p&gt;
&lt;h2 id=&#34;problem-statement&#34;&gt;Problem Statement&lt;/h2&gt;
&lt;p&gt;Given is a moving formation which refers to a group of vehicles which have assigned relative positions to a shared reference coordinate system. When this reference coordinate system moves, the formation moves.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-2.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Formation of six quadrotors with a common reference frame.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Movements of the reference coordinate frame result in different accelerations depending on the position of the individual vehicles in the formation. Below, the exemplary case of a rotation in 2D is shown where the orange diamonds indicate vehicle positions and the arrows direction as well as magnitude of the required acceleration.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-3.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Rotating reference frame leads to different accelerations in the formation.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Real world vehicles have only limited acceleration capabilities. Consequently, the formation is corrupted when the reference frame performs fast rotational movements. The problem I tried to address in my thesis was how can we correct the reference frame movement in such a way that the acceleration limits of each vehicle in the formation are maintained. If this is not considered, problems like shown in the video below come up. The vehicles indicated by the colored diamonds should stay in a line formation which moves through space (orange bar). When the reference positions start to rotate the vehicles lack behind and consequently collapse to a single position because they already reached their upward maximal acceleration.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; src=&#34;https://videos.jenspetit.de/videos/embed/55ac9efd-5d3f-494f-939c-dd2bb5d13a14&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;As the usage of swarms of vehicles becomes more likely in the future due to ongoing miniaturization and falling costs, the problem seems relevant for large scale formation movements.&lt;/p&gt;
&lt;h2 id=&#34;vehicle-modelling&#34;&gt;Vehicle Modelling&lt;/h2&gt;
&lt;p&gt;For my thesis, I chose quadrocopters / drones as the vehicles as they allow 3D movements in space and can be easily modeled. After simplifications, they can be modeled as two double integrator systems. They can be controlled using two nested PD controllers. For a detailed derivation refer to my thesis. As the main focus of the work was the distributed consensus reference control, the vehicle model is overly simplified. It only provides a basis to test the reference frame controller.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-6.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Quadrocopoter motor configuration with generated forces and torques.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;From the equations of motion of the system, acceleration limits depending on the current velocity of the vehicle can be calculated. Let&lt;/p&gt;
&lt;p&gt;$$ a_\mathrm{quadpos} = \begin{bmatrix} \ddot{x}_\mathrm{max} &amp;amp; \ddot{y}_\mathrm{max} &amp;amp; \ddot{z}_\mathrm{max} \end{bmatrix}^T $$&lt;/p&gt;
&lt;p&gt;be the positive acceleration limit and&lt;/p&gt;
&lt;p&gt;$$ a_\mathrm{quadneg} = \begin{bmatrix} \ddot{x}_\mathrm{min} &amp;amp; \ddot{y}_\mathrm{min} &amp;amp; \ddot{z}_\mathrm{min} \end{bmatrix}^T $$&lt;/p&gt;
&lt;p&gt;the negative acceleration limit expressed in Cartesian coordinates.&lt;/p&gt;
&lt;h2 id=&#34;reference-frame-controller&#34;&gt;Reference Frame Controller&lt;/h2&gt;
&lt;p&gt;The reference frame state consisting of its position and orientation can be described in 3D by the state vector&lt;/p&gt;
&lt;p&gt;$$ \boldsymbol{\xi}^r_\mathrm{contr} = \begin{bmatrix} x_r &amp;amp; y_r &amp;amp; z_r &amp;amp; \alpha_r &amp;amp; \beta_r &amp;amp; \gamma_r \end{bmatrix} ^T $$&lt;/p&gt;
&lt;p&gt;where the first three entries are the position followed by Euler angles. $\xi^r$ and its derivatives have to be controlled in such a way that all required acceleration are within the  vehicle acceleration which can be concisely expressed as two inequalities&lt;/p&gt;
&lt;p&gt;$$ a_\mathrm{quadneg} \leq a_\mathrm{max_2} \leq a_\mathrm{quadpos} $$&lt;/p&gt;
&lt;p&gt;$$ a_\mathrm{quadneg} \leq a_\mathrm{max_1} \leq a_\mathrm{quadpos}. $$&lt;/p&gt;
&lt;p&gt;To achieve this we define a controlled reference state&lt;/p&gt;
&lt;p&gt;$$ \boldsymbol{\xi}^r_\mathrm{contr} = \begin{bmatrix} x_c &amp;amp; y_c &amp;amp; z_c &amp;amp; \alpha_c &amp;amp; \beta_c &amp;amp; \gamma_c \end{bmatrix} ^T. $$&lt;/p&gt;
&lt;p&gt;The maximum accelerations in a formation occur at the outermost vehicles in each coordinate direction as shown in the picture below. Therefore, this maximum distance information is provided to the reference controller through the state
$$\boldsymbol{\zeta}&lt;em&gt;i = \begin{bmatrix} d&lt;/em&gt;\mathrm{max} &amp;amp; d_\mathrm{min} \end{bmatrix}^T $$
which is derived from the spatial desired formation.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-5.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;The maximum&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The maximum occurring accelerations are calculated as&lt;/p&gt;
&lt;p&gt;$$ a_\mathrm{max_1} = \ddot{r}_c + \dot{\omega} \times d_\mathrm{max} + \omega \times ( \omega \times d_\mathrm{max} ) $$&lt;/p&gt;
&lt;p&gt;$$ a_\mathrm{max_2} = \ddot{r}_c + \dot{\omega} \times d_\mathrm{min} + \omega \times ( \omega \times d_\mathrm{min} ) $$&lt;/p&gt;
&lt;p&gt;Now we have all the information available to finally build our complete reference controller. We want to minimize the deviation between $\xi^r_\mathrm{contr}$ and $\xi^r$ but still fulfill the inequalities. The controlled reference state dynamics are a double integrator. To control it we apply a simple PD control with an additional degree of freedom $c_a$. This input is used to add or subtract from the control output. The full dynamics of the reference controller are&lt;/p&gt;
&lt;p&gt;$$ \ddot{\xi}^r_\mathrm{contr} = \ddot{\xi}^r + k^r_d \left(\dot{\xi}^r - \dot{\xi}^r_\mathrm{contr} \right) + k^r_p \left(\dot{\xi}^r - \dot{\xi}^r_\mathrm{contr} \right) + c_a $$&lt;/p&gt;
&lt;p&gt;and a complete scheme is&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-4.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Schematic of the reference controller.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The final part is how to we calculate $c_a$? From the acceleration inequalities are  linear inequalities. Furthermore we want to minimize $c_a$ in general, as we want to keep this artificial &amp;ldquo;disturbance&amp;rdquo; minimal. All of these points can be addressed by solving a simple QP problem which is convex and has a unique global solution. As the dimensionality is small with $c_a \in \mathcal{R}^6$, solving the optimization in each time step is feasible. The QP problem solver is only active if the acceleration is about to exceed its limits, otherwise $c_a = 0$.&lt;/p&gt;
&lt;h2 id=&#34;results&#34;&gt;Results&lt;/h2&gt;
&lt;p&gt;The 2D formation flight with rotation shown at the beginning can now be simulated with active reference control. The video below shows that when the reference frame start to rotate it clearly slow down which allows the outermost vehicles to stay within the physical limits.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; src=&#34;https://videos.jenspetit.de/videos/embed/f840339b-8339-43aa-a7b3-d0ba03e85738&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;We can extend the setup to a 3D case where the pink cube now represents the reference frame position and orientation. Without the active reference controller we get a similar picture as in the 2D case where the formation collapses&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; src=&#34;https://videos.jenspetit.de/videos/embed/f35737c5-ce31-4c17-b508-e77e886f66bf&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;With active reference controller, the reference trajectory is modified in such a way that we stay within the limits of the vehicles but still try to follow the given path best as possible&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; sandbox=&#34;allow-same-origin allow-scripts allow-popups&#34; src=&#34;https://videos.jenspetit.de/videos/embed/d803e11e-c2ad-4bf8-93f3-45d3ed2660f8&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I hope you enjoyed this little read-up on my thesis. As stated in the beginning, you can find an in-depth derivation of most of the concepts in the thesis and the code is provided &lt;a href=&#34;https://github.com/j-petit/consensus-formation-control&#34;&gt;github&lt;/a&gt;.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Mining Public Transport Data</title>
		<link>https://jenspetit.de/posts/2019/03/mining_public_transport/</link>
		<pubDate>Fri, 22 Mar 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2019/03/mining_public_transport/</guid>
		<description>&lt;p&gt;See &lt;a href=&#34;https://github.com/j-petit/public_transport_map&#34;&gt;here&lt;/a&gt; for the code.&lt;/p&gt;
&lt;p&gt;During the summer semester 18, I had the opportunity to take part in the practical course &amp;lsquo;&lt;a href=&#34;http://www.kdd.in.tum.de/lehre/sommersemester-2018/large-scale-machine-learning/&#34;&gt;Large-scale Machine Learning&lt;/a&gt;&amp;rsquo; offered by Prof. Guennemann at TUM. In my team, consisting of four people, we worked on mining public transport data in Munich provided by the company running the buses and trams (&lt;a href=&#34;https://www.mvg.de/&#34;&gt;MVG&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Almost every household in Munich is located within 400 meters  of an underground or tram station or a bus stop. The resulting network adds up to more than 587 km of routes for buses and trams only, which are served by 461 vehicles that stop approximately 345,000 times a day and log their position and status every few seconds.&lt;/p&gt;
&lt;p&gt;The available data consists of GPS measurements, odometry readings plus door as well as stop events which were taken in the time period of January to May 2018.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../raw_data.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Raw GPS data heatmap plot.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&#34;goal-and-motivation&#34;&gt;Goal and Motivation&lt;/h3&gt;
&lt;p&gt;The goal of our project was to create an automatic network mapping pipeline. Up to now, a &lt;a href=&#34;https://efa.mvv-muenchen.de/index.html&#34;&gt;hand-crafted map&lt;/a&gt; is maintained by employees of the MVG. It shows the exact paths the vehicles take through the city which are frequently changing due to construction or replanning. A data-driven map has the advantage that it does not require constant maintenance and can be generated for example out of the data of a single week.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image-1.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Hand-crafted map of public transport in Munich available [here](https://efa.mvv-muenchen.de/index.html#trip@enquiry).&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Once such a map is available, many secondary tasks become feasible like detour detection or day time dependent mapping. Our requirements were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;High accuracy of the map within two meters of real bus and driving lanes.&lt;/li&gt;
&lt;li&gt;Stops are spatially characterized by a 1D distribution around the mean.&lt;/li&gt;
&lt;li&gt;Automatic creation from the data with least human intervention as possible.&lt;/li&gt;
&lt;li&gt;Use shared information of different routes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The spatial distribution of stops is especially important because many features of the buses like automatic stop announcements are based on relative distances between events. Those distances can be extracted out of our data-driven map which contains the spatial distribution of every stop.&lt;/p&gt;
&lt;h3 id=&#34;creating-the-map&#34;&gt;Creating the Map&lt;/h3&gt;
&lt;p&gt;Our creating the map approach draws its main inspiration form the &lt;a href=&#34;https://www.researchgate.net/publication/220232946_A_Graph-Based_Approach_to_Vehicle_Trajectory_Analysis/download&#34;&gt;paper&lt;/a&gt; &lt;em&gt;&amp;ldquo;A graph-based approach to vehicle trajectory analysis&lt;/em&gt;&amp;rdquo; published in the Journal of Location Based Services. We modified key elements to fit our specific task.&lt;/p&gt;
&lt;h4 id=&#34;1-applying-a-window-averager-to-the-raw-data&#34;&gt;1. Applying a window averager to the raw data&lt;/h4&gt;
&lt;p&gt;A window average filter moves a position measurements to the mean of its neighbors within a certain radius. An important distinction we make is that we also match based on the driving direction which enables us to keep two close lanes in opposite directions separate. The result is a concentration of the positions at the local mean which corresponds to the driving lanes. As the GPS noise is unbiased this is a valid step which is validated by visual results.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img src=&#34;../before_window.png?w=1024&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Raw GPS data at a crossing of more than two trams and buses&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../after_window.png?w=1024&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;After applying a window average filter.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id=&#34;2-finding-representative-centroids&#34;&gt;2. Finding representative centroids&lt;/h4&gt;
&lt;p&gt;The next step is to find representative measurements (centroids) which capture the overall trajectory of the route. We follow the six steps below:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start from any pose node s and let &lt;em&gt;C&lt;/em&gt;=∅ be the set of representative centroids.&lt;/li&gt;
&lt;li&gt;Find all nodes within a certain threshold radius around s that are not represented yet by any centroid and have similar heading. Calculate the centroid position &lt;em&gt;c_i&lt;/em&gt; as the mean of all these points.&lt;/li&gt;
&lt;li&gt;Find all nodes within a certain threshold radius and similar heading around &lt;em&gt;c_i&lt;/em&gt; and a) assign them to &lt;em&gt;c_i&lt;/em&gt; if they are not represented yet or b) calculate the distance to the old as well as new centroid and reassign it to the closer one.&lt;/li&gt;
&lt;li&gt;Choose next point s which is a neighbor of any point (Delaunay triangulation) within the current centroid &lt;em&gt;c_i&lt;/em&gt; and is yet unrepresented. If no point fulfills the condition, pick a new unrepresented point randomly.&lt;/li&gt;
&lt;li&gt;Repeat steps (2) - (4) until all GPS points are represented.&lt;/li&gt;
&lt;li&gt;The centroids mean values are the new positions.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src=&#34;../finding_centroids.png?w=825&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Representative centroids (blue dots) out of the filtered measurements.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;3-connecting-the-centroids&#34;&gt;3. Connecting the centroids&lt;/h4&gt;
&lt;p&gt;As we want to have a graph structure, it is necessary to connect the centroids. For this purpose we use the original sequential vehicle trajectories and connect all centroids which contain originally sequential measurements. This gives a graph which is very densely connected and which has to be &amp;ldquo;cleaned up&amp;rdquo; in the next step.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../intermediate_graph.png?w=825&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Connected centroids through sequential original measurements.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;4-sparsifying-the-edges&#34;&gt;4. Sparsifying the edges&lt;/h4&gt;
&lt;p&gt;To connect the centroids in a reasonable way, we conduct a shortest path dijkstra search on the intermediate graph for each edge which has been added before. As the edge weight, a power of the euclidean distance is used with the exponent &amp;gt; 1. A value of two seems reasonable after some experimenting. The result is that the search prefers connections which use closer centroids instead of jumping directly over centroids.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../connected_centroids.png?w=825&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Edge sparsified graph / map&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h4 id=&#34;centroid-sparsification&#34;&gt;Centroid sparsification&lt;/h4&gt;
&lt;p&gt;One last step consists of dropping centroids on straight line segments as they do not provide additional spatial information. This is realized through the Ramer-Douglas-Peucker algorithm (RMP) which is already implemented through a python package and gives nice results.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../before_sparsification.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Before sparsification&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../after_sparsification.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;After sparsification&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;map--graph-evaluation&#34;&gt;Map / Graph Evaluation&lt;/h2&gt;
&lt;p&gt;The huge amount of raw data measurements has to be compressed in a reasonable large map data structure. Our data-driven map achieves this goal through iterated sparsification steps which drop inexpressive data. The data reduction is shown below for an example map.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../image.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Data reduction in the map creation process.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Overlaying the map onto satellite pictures shows very accurate mapping which clearly follows the designated bus lanes.&lt;/p&gt;
&lt;figure class=&#34;wp-block-image&#34;&gt;![satellite_accuracy_threeway_inter.png](satellite_accuracy_threeway_inter.png?version=1&amp;modificationDate=1529846599743&amp;api=v2)&lt;figcaption&gt;High accuracy of the data-driven map.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Below we can see that the hand-crafted map (green dots) is NOT located on the bus lane whereas our data-driven map nicely captures the in reality used driving lane.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../street_view_leopold.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Data-driven map (blue) better than hand-crafted map (green).&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The stop information is contained in the map and can easily be visualized.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../stop_distribution.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Stop distribution.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;In this post, I described a complete data-driven network mapping approach for public transport based on our work in the course. You can find additional information in the &lt;a href=&#34;https://github.com/j-petit/public_transport_map&#34;&gt;code repository&lt;/a&gt;. Unfortunately, as the data is private and sensitive, I cannot provide a working example.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Who needs a second screen?</title>
		<link>https://jenspetit.de/posts/2019/02/thoughts_on_second_screen/</link>
		<pubDate>Mon, 04 Feb 2019 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2019/02/thoughts_on_second_screen/</guid>
		<description>&lt;h4 id=&#34;a-programmers-perspective&#34;&gt;A programmers perspective&lt;/h4&gt;
&lt;p&gt;For a long time, I was a strong advocate of a two screen setup whenever I could. Although I still see some benefits in having more real screen space, I have changed my general attitude. The reason for this is that having virtual &lt;a href=&#34;https://help.ubuntu.com/stable/ubuntu-help/shell-workspaces.html&#34;&gt;workspaces&lt;/a&gt; gives me a very similar experience. And this wherever I want.&lt;/p&gt;
&lt;p&gt;As a student, I am only rarely working from the same place. Sometimes I code at the university, sometimes I am sitting at a friends place and another day I am somewhere on the road. If you are comfortable with your virtual workspace setup nothing hinders you from coding with 100% efficiency because the only thing you need is your laptop. In the past, I was pretty frustrated when I could not work at home where I had my second large screen. However at some point, I realized that I could be as efficient using virtual desktops.&lt;/p&gt;
&lt;p&gt;It took me some time to get used to but after some initial acclimatization I do not miss my bulky 24&amp;quot; monitor. Your eyes are only able to focus on a tiny part of the screen anyway, having to look (and moving your head!) at another monitor or simply changing the content of your one screen does not really make a difference. Furthermore, having your virtual second (or third!) screen with you at all times is a huge boost!&lt;/p&gt;
&lt;p&gt;An important aspect is to make working with workspaces as smooth as possible. For me this means creating my own custom shortcuts, as I always have my hands in the home row on the keyboard. As a Vim user, it is natural to map moving down to the next workspace to Alt+j and up to Alt+k. For moving a window to the next workspace I chose Ctrl+Alt+j and Ctrl+Alt+k respectively. For me, this setup makes working with workspaces a breeze, as these keys are in my muscle memory anyway. Moving to the arrow keys is a hassle which I want to avoid by all means - so do not hesitate to change the default keycombinations.&lt;/p&gt;
&lt;p&gt;Give it a try and ditch your large second screen at your primary workplace. Configure shortcuts that allow you to easily switch workspaces and move windows. You will soon notice that you are back to your old productivity levels and feel that you are no longer limited when working on the road by not having a second monitor.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>The Handtracking Robot</title>
		<link>https://jenspetit.de/posts/2018/11/handtracking_robot/</link>
		<pubDate>Mon, 26 Nov 2018 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2018/11/handtracking_robot/</guid>
		<description>&lt;p&gt;During the winter semester 17/18 I took a course called &lt;a href=&#34;https://www.ics.ei.tum.de/en/teaching/ws201819/multi-sensory-based-robot-dynamic-manipulation/&#34;&gt;&amp;ldquo;Multi-sensory Based Dynamic Robot Manipulation&amp;rdquo;&lt;/a&gt; at the Institute for Cognitive Systems at the Technical University of Munich where I am currently pursuing my masters degree in robotics.&lt;/p&gt;
&lt;p&gt;The course was one of the best I&amp;rsquo;ve had in my university career which is mainly because Mr. Dean, our lecturer, did such a great job. It was sometimes painfully hard to get the homework done because I had to learn so many new things at the same time. Coding in C++, using Ubuntu and ROS, control theory, robot dynamics and kinematics&amp;hellip; The course had a final project in the end which I did together with two other people in a team.&lt;/p&gt;
&lt;p&gt;The scope was to use an small industrial robot (Universal Robot 10 in our case) in combination with some sensors to solve a small, open task. We decided to implement a handtracking robot which means that the robot imitates the movement of a human who stands in front of it. We aimed to use an inertial measurement unit to get acceleration readings of the hand and a Microsoft Kinect with its depth camera to get absolute position readings. A schematic of the setup is shown below.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../overview-1.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;A human operator controls an industrial robot with an IMU in his hand.&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The position and acceleration information of the sensors is fused through a Kalman Filter. The result is then fed into the robot controller which acts on the torque interface of the UR10 robot.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../flow-1.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Schematic of the information flow&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;My part was setting up the IMU and the Kalman Filter, whereas one of my colleagues worked on the Kinect and the other one on the robot controller. We spent hours in the lab but finally got the system working quite nicely. The IMU allows us to have a dynamic control inputs because the sensed acceleration is except some smoothing directly fed into the controller as the desired state. We wrote a little report on the project which you can find &lt;a href=&#34;../msb_project_report_teamironman.pdf&#34; title=&#34;MSB_Project_Report_TeamIronman&#34;&gt;here&lt;/a&gt; if your interested.&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>My high school robotics days...</title>
		<link>https://jenspetit.de/posts/2018/04/high_school_robotics/</link>
		<pubDate>Tue, 10 Apr 2018 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2018/04/high_school_robotics/</guid>
		<description>&lt;p&gt;I was lucky that in my high school we had a Robotics Group led by a passionate physics and math teacher. For me it was an awesome experience which defined the last four years of my time in high school.&lt;/p&gt;
&lt;p&gt;As a team we participated in the RoboCup Junior Soccer competition, starting with simple LEGO NXTs in 2007 and finally becoming German Champions in 2011 with highly sophisticated custom machines. Below are some pictures which show the evolution of our project. We built robots that played 2vs2 soccer on a table sized playing field.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../cimg8542.jpg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Starting with LEGO NXT in 2008&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../cimg9050.jpg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;First World Championship in 2008 in China&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../p1050200.jpg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Robots in 2010&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../sonstiges-14.jpg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Self-designed PCB in 2011&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../sonstiges-1.jpg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Robot base plate in 2011&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../robots_2011.jpg&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Winning team in 2011&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The ball emits infrared light which is detected through light sensitive sensors around the robot. Furthermore our last machines had four ultrasonic range finders, one magnetic compass, four brushed encoded DC gear motors with omniwheels and two solenoids to kick the ball. Their weight was around two kilograms with a construction made of aluminum and carbon fiber.&lt;/p&gt;
&lt;p&gt;One of the highlights was the world championship in Turkey 2011. We qualified for this event after becoming the German champions in this year.&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube-nocookie.com/embed/2LRtQ9JJ4vg&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
	</item>
	
	<item>
		<title>Contact</title>
		<link>https://jenspetit.de/contact/contact/</link>
		<pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/contact/contact/</guid>
		<description>&lt;p&gt;To get in touch with me, write an email to jenspetit[ät]posteo.net .&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title>Getting Started with the BeagleBone Blue, Ubuntu and ROS</title>
		<link>https://jenspetit.de/posts/2018/03/gettings_started_bbb_ubuntu_ros/</link>
		<pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2018/03/gettings_started_bbb_ubuntu_ros/</guid>
		<description>&lt;p&gt;Through a university course on robotics I got introduced to the so called Robot Operating System (ROS). And it got me hooked!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Robot Operating System (ROS) is a set of software libraries and tools that help you build robot applications. From drivers to state-of-the-art algorithms, and with powerful developer tools, ROS has what you need for your next robotics project. And it&amp;rsquo;s all open source.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&#34;https://jenspetit.de/2018/04/high_school_robotics.html&#34;&gt;After building football robots during my high school days&lt;/a&gt;, this was a great opportunity to gain some more hands-on experience.&lt;/p&gt;
&lt;p&gt;ROS runs on top of many Linux distributions, so the robots brain cannot be a microcontroller like an Arduino. My preferred distribution is Ubuntu, as I am also using this on my laptop. Again, ROS itself is not an operating system.&lt;/p&gt;
&lt;p&gt;Summarized, my rough requirements for the robots brain are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;able to run Ubuntu&lt;/li&gt;
&lt;li&gt;enough computing power for basic image processing&lt;/li&gt;
&lt;li&gt;all in one: integrated motor and servo drivers, serial connectivity, I2C, etc&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After searching for a while it seems like the BeagleBone Blue (BBBL) is a perfect fit! We will see if this holds in my long term experience.&lt;/p&gt;
&lt;p&gt;Ordering the BeagleBone Blue is cheap (~ 80 €) considering that you get all electronics you need for a small robotics project in one package. The next step is setting up the OS on the BBBL. One big advantage of ROS is that you can run it on multiple machines and it will behave than like a single system. We will explore this capability later in this post.&lt;/p&gt;
&lt;h2 id=&#34;setting-up-ubuntu-180402-on-the-bbbl&#34;&gt;Setting Up Ubuntu 18.04.02 on the BBBL&lt;/h2&gt;
&lt;p&gt;I downloaded the latest official image from the &lt;a href=&#34;https://rcn-ee.com/rootfs/2018-12-10/microsd/&#34;&gt;web&lt;/a&gt; and  burned it to my microSD card. It is important to note that the image I used&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://rcn-ee.com/rootfs/bb.org/testing/2019-03-24/bionic-ros-iot/bone-ubuntu-18.04.2-ros-iot-armhf-2019-03-24-6gb.img.xz&#34;&gt;bone-ubuntu-18.04.2-ros-iot-armhf-2019-03-24-6gb.img.xz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and all the others which are in the /testing folder do not support the USB connection but are only available through the serial port UART0. Therefore, get yourself a USB to serial adapter like this &lt;a href=&#34;https://www.amazon.de/gp/product/B01CYBHM26/ref=ppx_yo_dt_b_asin_title_o04_s01?ie=UTF8&amp;amp;psc=1&#34;&gt;one&lt;/a&gt; and solder a wire connecting the UART0 port to the adapter.&lt;/p&gt;
&lt;p&gt;If you are such a serial noob as I am, note that Rx has to be connected to the adapters Tx (transmit to receive, makes sense after all&amp;hellip; I wish I had not spent one hour figuring this out). Then you can connect to your BBBL by using screen with&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ sudo screen /dev/ttyUSB0 115200
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;where the number is the baud rate. Note that during the boot process you are not receiving any messages, only when the login takes place.&lt;/p&gt;
&lt;p&gt;The password is temppwd. The first thing to do is set up the WiFi through following the description &lt;a href=&#34;https://www.digikey.com/en/maker/blogs/2017/how-to-setup-wifi-on-the-beaglebone-black-wireless&#34;&gt;here&lt;/a&gt;. A green light will show up as soon as the device is connected. This will now automatically happen on boot, therefore you might as well as unplug the serial adapter and use SSH over WiFi from now on.&lt;/p&gt;
&lt;p&gt;Next, grow the partition to have all the space on the memory card available.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ sudo /opt/scripts/tools/grow_partition.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then update the system by running&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ sudo apt-get update
    $ sudo apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As this is the ROS IoT image, everything we need is already installed! That makes life easy. Alternatively, you can use one of the &amp;ldquo;released&amp;rdquo; images for the BBBL and install ROS and everything else you need manually.&lt;/p&gt;
&lt;p&gt;To check if everything is setup correctly start a roscore (it will take some time, as the BBBL is not too powerful) and make LEDs blink through&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ roscore
    $ rc_test_blink_led
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;using-ros&#34;&gt;Using ROS&lt;/h2&gt;
&lt;p&gt;As we are now able to run ROS, let&amp;rsquo;s do something cool! Our simple example will be running a publisher on your BBBL and a listener on your local machine. You should be able to receive the messages sent from the BBBL then on your laptop. We are roughly following the tutorial provided &lt;a href=&#34;https://wiki.ros.org/ROS/Tutorials/MultipleMachines&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Start a roscore on your laptop and start the listener through&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ rosrun rospy_tutorials listener.py
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then ssh into the BBBL and configure&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ export ROS_MASTER_URI=http://laptop_name:11311/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If automatic host resolving is not working, replace the computer names by their IPs. You also need to set ROS_IP on both machines. Best practice is to simply copy the ROS_MASTER_URI which is provided on startup of the roscore. Try the connection through running on the BBBL&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    $ rosrun rospy_tutorials talker.py
&lt;/code&gt;&lt;/pre&gt;&lt;figure&gt;&lt;img src=&#34;../ros_two_machines.png&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;ROS communicating over two machines. Left laptop, right BBBL&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;You should see a hello world message send form the BBBL on your laptop. Congratulations, you have established a connection to the roscore running on your PC. Way to go to realize cool (distributed) robotics projects!&lt;/p&gt;
</description>
	</item>
	
	<item>
		<title></title>
		<link>https://jenspetit.de/posts/2023/02/tools/</link>
		<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
		
		<guid>https://jenspetit.de/posts/2023/02/tools/</guid>
		<description>&lt;h2 id=&#34;-head&#34;&gt;&amp;laquo;&amp;laquo;&amp;laquo;&amp;lt; HEAD&lt;/h2&gt;
&lt;h2 id=&#34;date-2023-02-02&#34;&gt;title: On Wise Tool Choices
date: 2023-02-02&lt;/h2&gt;
&lt;p&gt;You like to cook. At some point your knives are becoming dull. If you don&amp;rsquo;t want to continue working with dull knives, you need a sharping tool.&lt;/p&gt;
&lt;p&gt;There exist thousands of sharpening tools out there with two of them being:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;../stone.jpg&#34; width=&#34;50%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Grinding Stone&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;&lt;img src=&#34;../sharpener.jpg&#34; width=&#34;50%&#34;&gt;&lt;figcaption&gt;
      &lt;h4&gt;Electric Knife Sharpener&lt;/h4&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Let&amp;rsquo;s compare those two in a couple of categories.&lt;/p&gt;
&lt;h2 id=&#34;grinding-stone&#34;&gt;Grinding Stone&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Simplicity: It&amp;rsquo;s a stone. I don&amp;rsquo;t think it gets any simpler than that. I think the word repair does not even make sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ease-of-use: Sharping takes some skill.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multi-purpose: You can sharpen whatever you want.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;electric-knife-sharpener&#34;&gt;Electric Knife Sharpener&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Simplicity: A complex electric device with multiple moving parts. Its development required thousands of years of civilization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ease-of-use: Reading a manual and pushing a button. That&amp;rsquo;s doable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multi-purpose: It does sharpen knives apparently.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;comparison&#34;&gt;Comparison&lt;/h2&gt;
&lt;p&gt;If you are an attentive reader then you already got a feeling which tool I would chose: the sharpening stone. It is an obsession of mine to choose the right tool to handle life. Let&amp;rsquo;s take a closer look at the before mentioned categories again to see what I am looking out for.&lt;/p&gt;
&lt;p&gt;Why is being simple so important? First, less things can break. This greatly enhances the life-time of a product as well as repair possibilities. A tool should have the least amount of moving parts. Each joint will fail at some point, no matter what. Complex electronics are even worse. They are very hard to repair and require specialized equipment.&lt;/p&gt;
&lt;p&gt;A very good indicator of durability is the second-hand retail value. If a tool has a great retail value even after heavy-use that&amp;rsquo;s a good indicator. Therefore, check things like ebay Kleinanzeigen, at least if you are buying in Germany.&lt;/p&gt;
&lt;p&gt;Another question I am usually asking myself: Is there a simpler tool which relies more on my skills than on some (electronic) mechanism? Good, I choose this one. Think hard if the additional functionality or ease-of-use is worth the complexity introduced. Instead of relying on the tool or the ingenuity of its inventor, I advocate for investing time in your own skills. Learn how to use a simple sharpening stone. This is especially worthwhile for tasks that you will do for your entire life. Like sharpening knives hopefully.&lt;/p&gt;
&lt;p&gt;Another upside of the skill-based approach is its flexibility: if you find yourself suddenly out somewhere and in the need of sharpening some object, it is very likely that you can get the job done. You can sharpen on many coarse objects like the back of a ceramic plate and you will have the necessary experience to guide you along. In comparison, being able to push a button will not bring you very far.&lt;/p&gt;
&lt;p&gt;Sometimes going for simpler tools means less perfect results. In my opinion perfectionism is killing the do-it-yourself spirit. DIY is about getting things done with a finite and reasonable invest in terms of time and money. The result should never be an industrial perfect result. That&amp;rsquo;s part of the fun!&lt;/p&gt;
&lt;h2 id=&#34;common-pitfalls&#34;&gt;Common Pitfalls&lt;/h2&gt;
&lt;h3 id=&#34;battery-power&#34;&gt;Battery Power&lt;/h3&gt;
&lt;p&gt;Battery-powered devices can make sense but only if you are a power user. You are going  to use the tool so intensively in the next three years that other things will break before the battery? Then it might make sense to benefit from the additional portability. Otherwise, I&amp;rsquo;d say no.&lt;/p&gt;
&lt;h3 id=&#34;ultra-light&#34;&gt;Ultra Light&lt;/h3&gt;
&lt;p&gt;In recent years, there is the trend to make everything ultra-light. A reduction in weight is always a trade-off. And in most cases durability is traded in.&lt;/p&gt;
&lt;p&gt;For example: Any type of fabric which is made thinner will always result in less durability. This is just a fact. Also, prices increase very steeply for miniscule weight reductions. And I am pretty sure your body will not notice 10 grams difference. So be attentive when ultra-light is advertised and consider the drawbacks.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Having a universal, high quality set of tools on your side to handle life is a great source of satisfaction for me. I am always happy when I can use them and just get stuff done.&lt;/p&gt;
</description>
	</item>
	
	</channel>
</rss>
