{"id":11341,"date":"2026-08-18T05:26:08","date_gmt":"2026-08-18T05:26:08","guid":{"rendered":"https:\/\/katianie.com\/blog\/?page_id=11341"},"modified":"2026-08-18T19:26:32","modified_gmt":"2026-08-18T19:26:32","slug":"robotics","status":"publish","type":"page","link":"https:\/\/katianie.com\/blog\/index.php\/robotics\/","title":{"rendered":"Robotics"},"content":{"rendered":"<figure style=\"margin:0 0 1.5rem;\">\n  <img decoding=\"async\" src=\"https:\/\/katianie.com\/images\/robotics\/20260716_140659.jpg\" alt=\"RumPi robot: a 3D-printed rainbow chassis with a pagoda tower and a cup anemometer\" loading=\"lazy\" style=\"width:100%;max-width:960px;height:auto;display:block;margin:0 auto;border-radius:8px;\"><figcaption style=\"text-align:center;font-size:0.9em;color:#666;font-style:italic;margin-top:0.5rem;\">RumPi, front on \u2014 a Raspberry Pi weather station on wheels.<\/figcaption><\/figure>\n<p>I started this project back in 2023 with an idea I couldn&#8217;t shake: build a robot from the ground up that could <strong>sense its environment<\/strong>, reason about it with a bit of <strong>AI<\/strong>, and <strong>drive itself<\/strong> around. It&#8217;s a big undertaking, so I split it into three systems and set out to build them one at a time. The first \u2014 the environment-sensing system \u2014 is now complete, and I wanted to share the progress and publicly release the code I wrote to run it.<\/p>\n<h2>The robot<\/h2>\n<p>At its core is a <strong>Raspberry Pi 5<\/strong> on a chassis I designed and 3D-printed in rainbow &#8220;silk&#8221; filament, so the whole thing shifts colour as you move around it. Riding up top is the sensor suite: a spinning-cup <strong>anemometer<\/strong> for wind speed, a <strong>motion detector<\/strong>, and a tower that houses the environmental sensors \u2014 temperature and humidity, particulate air quality, common gases like CO\u2082 and volatile organic compounds, light level, and barometric pressure. Inside sit the battery, the motor drivers, and the wiring loom that ties everything back to the Pi, while a small monitor on an articulated arm shows the live dashboard. (A 3D-printed pagoda and lighthouse came along for the ride \u2014 every robot deserves a little personality.)<\/p>\n<figure style=\"margin:1.5rem 0;\">\n  <img decoding=\"async\" src=\"https:\/\/katianie.com\/images\/robotics\/20260817_210957.jpg\" alt=\"Angled view of the RumPi robot with its monitor arm and sensor cluster\" loading=\"lazy\" style=\"width:100%;max-width:900px;height:auto;display:block;margin:0 auto;border-radius:8px;\"><figcaption style=\"text-align:center;font-size:0.9em;color:#666;font-style:italic;margin-top:0.5rem;\">The full robot: sensors and display up top, the Pi and drivetrain below.<\/figcaption><\/figure>\n<div style=\"display:flex;flex-wrap:wrap;gap:1rem;margin:1.5rem 0;\">\n<figure style=\"flex:1 1 300px;margin:0;\">\n    <img decoding=\"async\" src=\"https:\/\/katianie.com\/images\/robotics\/20260425_152259.jpg\" alt=\"Top-down view of the robot's sensor tower and anemometer\" loading=\"lazy\" style=\"width:100%;height:auto;display:block;border-radius:8px;\"><figcaption style=\"text-align:center;font-size:0.9em;color:#666;font-style:italic;margin-top:0.5rem;\">The environmental sensor tower and wind gauge.<\/figcaption><\/figure>\n<figure style=\"flex:1 1 300px;margin:0;\">\n    <img decoding=\"async\" src=\"https:\/\/katianie.com\/images\/robotics\/20260817_211036.jpg\" alt=\"Evening view of the RumPi robot showing the motion sensor mount\" loading=\"lazy\" style=\"width:100%;height:auto;display:block;border-radius:8px;\"><figcaption style=\"text-align:center;font-size:0.9em;color:#666;font-style:italic;margin-top:0.5rem;\">The motion sensor&#8217;s star mount, alongside the sensor cluster.<\/figcaption><\/figure>\n<\/div>\n<h2>RumPi \u2014 the sensor library<\/h2>\n<p>To bring all of that to life I wrote <strong>RumPi<\/strong>, a C++ library built on top of wiringPi. The idea behind it is that hardware should be <em>described, not hard-coded<\/em>: RumPi reads a JSON manifest of what&#8217;s connected and assembles itself at runtime, so adding a sensor is a single line of configuration rather than a code change.<\/p>\n<p>On top of that it handles everything a robot needs to run unattended:<\/p>\n<ul>\n<li><strong>Component management<\/strong> \u2014 polling every device on a fixed schedule and managing its lifecycle, all behind one uniform interface.<\/li>\n<li><strong>Multithreading<\/strong> \u2014 the sensor loop runs on its own thread so readings never stall the rest of the system.<\/li>\n<li><strong>Alert handling<\/strong> \u2014 a thread-safe alert bus checks readings against thresholds and notifies whoever&#8217;s listening.<\/li>\n<li><strong>Logging<\/strong> \u2014 written asynchronously, off the hardware thread, so nothing blocks.<\/li>\n<li><strong>Fail-safe by design<\/strong> \u2014 one misbehaving sensor is isolated and logged instead of crashing the robot, and a disconnected input reports &#8220;no reading&#8221; rather than a convincing-but-wrong value.<\/li>\n<\/ul>\n<p>Today it supports around <strong>thirty component types<\/strong> \u2014 sensors, actuators, displays, and the analog-to-digital converters that tie them together.<\/p>\n<figure style=\"margin:1.5rem 0;\">\n  <img decoding=\"async\" src=\"https:\/\/katianie.com\/images\/robotics\/20260716_140718.jpg\" alt=\"Top-down view of the robot's internals: battery, motor drivers, and wiring\" loading=\"lazy\" style=\"width:100%;max-width:900px;height:auto;display:block;margin:0 auto;border-radius:8px;\"><figcaption style=\"text-align:center;font-size:0.9em;color:#666;font-style:italic;margin-top:0.5rem;\">Under the panels \u2014 the battery, motor drivers, and the wiring the library brings to life from a JSON manifest.<\/figcaption><\/figure>\n<h2>The dashboard \u2014 RumPi Linux Client<\/h2>\n<p>The second piece is the <strong>RumPi Linux Client<\/strong>, a desktop dashboard that turns those readings into something you can actually feel. Rather than a wall of numbers, its home screen is a small scene that <em>looks like the weather the sensors are describing<\/em>: it clouds over as the humidity rises, hazes and browns as the air quality drops, tints warm or cool with the temperature, shows day or night by the clock, and streaks across the sky with the wind. Behind the scene are at-a-glance tiles, a per-device grid, and a live event log. It links the library directly and runs the sensor loop on a background thread, so the interface always stays smooth and responsive.<\/p>\n<figure style=\"margin:1.5rem 0;\">\n  <img decoding=\"async\" src=\"https:\/\/katianie.com\/images\/robotics\/SensorRobotGUIHome.png\" alt=\"The RumPi Linux Client dashboard showing a night scene with live readings\" loading=\"lazy\" style=\"width:100%;max-width:900px;height:auto;display:block;margin:0 auto;border-radius:8px;\"><figcaption style=\"text-align:center;font-size:0.9em;color:#666;font-style:italic;margin-top:0.5rem;\">The dashboard&#8217;s home screen reacts to live conditions \u2014 here, a humid, moderately-polluted night.<\/figcaption><\/figure>\n<h2>What&#8217;s next<\/h2>\n<p>With the sensing system finished, I&#8217;m moving on to the two stages I&#8217;ve been most excited about: <strong>motor and motion control<\/strong>, to let the robot drive and find its way around, and an <strong>AI<\/strong> layer to help it make sense of what it&#8217;s sensing. Both are designed to slot into the same component model, so a lot of the groundwork is already laid.<\/p>\n<h2>Explore the project<\/h2>\n<p>The full project is open source, with complete API documentation for both parts:<\/p>\n<ul>\n<li><a href=\"https:\/\/katianie.com\/Install\/RumPiLibraryRelease%20%288-18-2026%29.zip\">RumPi library<\/a><\/li>\n<li><a href=\"https:\/\/katianie.com\/SourceCode\/C%2b%2b\/RumPiLibrary_Source_Code\/RumPiLibraryDocumentation\/html\/index.html\">RumPi library documentation<\/a><\/li>\n<li><a href=\"https:\/\/katianie.com\/Install\/RumPiLinuxClientRelease%20%288-18-2026%29.zip\">RumPi Linux Client<\/a><\/li>\n<li><a href=\"https:\/\/katianie.com\/SourceCode\/C%2b%2b\/RumPiLinuxClient_Source_Code\/RumPiLinuxClientDocumentation\/html\/index.html\">RumPi Linux Client documentation<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>RumPi, front on \u2014 a Raspberry Pi weather station on wheels. I started this project back in 2023 with an idea I couldn&#8217;t shake: build a robot from the ground up that could sense its environment, reason about it with a bit of AI, and drive itself around. It&#8217;s a big undertaking, so I split [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-11341","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/11341","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=11341"}],"version-history":[{"count":5,"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/11341\/revisions"}],"predecessor-version":[{"id":11347,"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/pages\/11341\/revisions\/11347"}],"wp:attachment":[{"href":"https:\/\/katianie.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=11341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}