<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ryan D. Lewis</title>
    <description>The latest articles on DEV Community by Ryan D. Lewis (@luckierdodge).</description>
    <link>https://dev.to/luckierdodge</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F67676%2F6e30327e-e58c-4c66-bfe7-566ccdfd97df.png</url>
      <title>DEV Community: Ryan D. Lewis</title>
      <link>https://dev.to/luckierdodge</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luckierdodge"/>
    <language>en</language>
    <item>
      <title>How to Call a Service from a ROS2 Launch File</title>
      <dc:creator>Ryan D. Lewis</dc:creator>
      <pubDate>Sat, 03 Sep 2022 21:06:46 +0000</pubDate>
      <link>https://dev.to/luckierdodge/how-to-call-a-service-from-a-ros2-launch-file-4l7p</link>
      <guid>https://dev.to/luckierdodge/how-to-call-a-service-from-a-ros2-launch-file-4l7p</guid>
      <description>&lt;p&gt;This one is pretty straight forward, but took me a non-trivial amount of searching to find for myself. To call a ros2 service from a ros2 launch file, add the following to your launch file (see &lt;a href="https://docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Creating-Launch-Files.html"&gt;the official docs&lt;/a&gt; for more on launch files):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;launch.substitutions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FindExecutable&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;launch.actions&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ExecuteProcess&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;ld&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ExecuteProcess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;
            &lt;span class="n"&gt;FindExecutable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'ros2'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s"&gt;" service call "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"/namespace/service_to_call "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;"example_msgs/srv/ExampleMsg "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;'"{param_1: True, param_2: 0.0}"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;]],&lt;/span&gt;
        &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ld&lt;/code&gt; here is a variable containing an instance of &lt;code&gt;LaunchDescription&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/namespace/service_to_call&lt;/code&gt; is replaced with the service you're looking to call (don't forget any appropriate namespaces) and can be found with &lt;code&gt;ros2 service list&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;example_msgs/srv/ExampleMsg&lt;/code&gt; is the message type used by that service, which you can get with &lt;code&gt;ros2 service info /namespace/service_to_call&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"{param_1: True, param_2: 0.0}"&lt;/code&gt; is the dictionary defining the message data. To find the parameters you need to set, you may need to consult the &lt;code&gt;.srv&lt;/code&gt; file or documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't forget to include the &lt;code&gt;shell=True&lt;/code&gt; argument, as the command will fail with a confusing "File not found" error without it.&lt;/p&gt;

</description>
      <category>ros2</category>
      <category>robotics</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Install and Use Docker in WSL2</title>
      <dc:creator>Ryan D. Lewis</dc:creator>
      <pubDate>Sun, 06 Mar 2022 16:34:17 +0000</pubDate>
      <link>https://dev.to/luckierdodge/how-to-install-and-use-docker-in-wsl2-217l</link>
      <guid>https://dev.to/luckierdodge/how-to-install-and-use-docker-in-wsl2-217l</guid>
      <description>&lt;p&gt;&lt;em&gt;Edit: It's come to my attention that, since I figured out this workaround back when WSL2 and thus Docker's WSL2 backend were new, Docker Desktop for Windows has added support for using Docker from within your WSL2 distro. This obviates the need to install Docker within a WSL2 distro in most cases. But if you find yourself in a position where you can't or don't want to use the Docker Desktop support, read on.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Say you want to run a Linux environment on a Windows machine, and in that environment one of the things you want to do is make use of docker containers. Here's the quick and dirty way to get that set up:&lt;/p&gt;

&lt;h2&gt;
  
  
  Install WSL
&lt;/h2&gt;

&lt;p&gt;Nowadays, this should be as simple as &lt;code&gt;Win+X&lt;/code&gt;, selecting &lt;code&gt;&amp;lt;Command Prompt/Powershell/Windows Terminal&amp;gt; (Admin)&lt;/code&gt;, and running &lt;code&gt;wsl --install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If that doesn't work, or you want to fiddle/customize/use a non-default distro, check out &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install"&gt;Microsoft's guide here&lt;/a&gt;. Make sure you install a WSL2 distro.&lt;/p&gt;

&lt;p&gt;For the rest of this, I'm assuming you've installed the default Ubuntu Distro, steps might be slightly different for other distros.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify and Setup WSL
&lt;/h2&gt;

&lt;p&gt;Make sure that the distro you just installed is a WSL2 distro, as you can't run docker in WSL1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Set the default version to 2
wsl --set-default-version 2
# Check that the distro you installed is version 2
wsl -l -v
# Upgrade a v1 distro to v2
wsl --set-version &amp;lt;distro-name&amp;gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're having trouble upgrading the distro, see &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install#ways-to-run-multiple-linux-distributions-with-wsl"&gt;here for help&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, open the "Ubuntu" application that you just got installed, and set your username and password. Do package updates, install whatever tools and packages you want, and just generally make yourself at home.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Docker
&lt;/h2&gt;

&lt;p&gt;Follow &lt;a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository"&gt;these setup instructions&lt;/a&gt; (if you chose to install a distro other than Ubuntu, find the appropriate install guide on the left of that page).&lt;/p&gt;

&lt;p&gt;Stop before running &lt;code&gt;sudo docker run hello-world&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring Docker on WSL2
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using Docker Without Invoking Root
&lt;/h3&gt;

&lt;p&gt;Don't want to have to run docker commands with &lt;code&gt;sudo&lt;/code&gt; all the time? &lt;a href="https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user"&gt;Follow this guide to add yourself to the docker group&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting the Docker Daemon
&lt;/h3&gt;

&lt;p&gt;One hiccup with docker in WSL2 is that it doesn't automatically start the Docker service. The simple but annoying solution is to run &lt;code&gt;sudo service docker start&lt;/code&gt; whenever you want to use Docker.&lt;/p&gt;

&lt;p&gt;If you don't want to have to remember and invoke that command every time, you can add the following to your "~/.profile", or your shell configuration file like "~/.bashrc":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if [ -n "`service docker status | grep not`" ]; then
    sudo /usr/sbin/service docker start
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now this has the annoying side effect of making you have to type out your sudo password whenever you start WSL2 for the first time.&lt;/p&gt;

&lt;p&gt;To fix this, you can run &lt;code&gt;sudo visudo -f /etc/sudoers.d/passwordless_docker_start&lt;/code&gt;, add the following to the file (replacing &lt;code&gt;username&lt;/code&gt; with your Linux username), save and close. (&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file"&gt;See here to learn more about the intricacies and nuances of sudoer files&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;username        ALL = (root) NOPASSWD: /usr/sbin/service docker start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, the docker service automatically starts in WSL2 without requiring authentication, and you can use it more or less exactly like you would use Docker on a regular Linux install.&lt;/p&gt;

&lt;p&gt;Cover Photo by &lt;a href="https://www.pexels.com/@tomfisk?utm_content=attributionCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=pexels"&gt;Tom Fisk&lt;/a&gt; from &lt;a href="https://www.pexels.com/photo/aerial-view-photography-of-container-van-lot-1427107/?utm_content=attributionCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=pexels"&gt;Pexels&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>wsl</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Communicate with an Arduino from Docker</title>
      <dc:creator>Ryan D. Lewis</dc:creator>
      <pubDate>Sun, 14 Mar 2021 23:29:58 +0000</pubDate>
      <link>https://dev.to/luckierdodge/how-to-communicate-with-an-arduino-from-docker-3fo7</link>
      <guid>https://dev.to/luckierdodge/how-to-communicate-with-an-arduino-from-docker-3fo7</guid>
      <description>&lt;p&gt;Something I learned this weekend. Let's say you have an Arduino, and you want to communicate with it via serial from a Linux device, like a Jetson Nano. But not from that device's host operating system. No, that'd be too easy.&lt;/p&gt;

&lt;p&gt;Instead, you want to talk with this Arduino from an application running in an unprivileged Docker container. How would you do that?&lt;/p&gt;

&lt;h1&gt;
  
  
  How To Bring an Arduino inside Docker
&lt;/h1&gt;

&lt;p&gt;It turns out it's actually quite simple! When connected to a Linux device via a USB cable, most Arduino's show up as a device in the form &lt;code&gt;/dev/ttyAMCx&lt;/code&gt; where x is replaced with an integer counter, starting from 0. So the first Arduino you connect is &lt;code&gt;/dev/ttyAMC0&lt;/code&gt;, the second is &lt;code&gt;/dev/ttyAMC1&lt;/code&gt; and so on.&lt;/p&gt;

&lt;p&gt;To access that from Docker, all you need is the docker &lt;code&gt;--device&lt;/code&gt; flag. Include it in the docker run command as &lt;code&gt;docker run &amp;lt;other options&amp;gt; --device="/dev/ttyACM0" &amp;lt;more options, image name, etc&amp;gt;&lt;/code&gt; and you're all set. You can access the Arduino in the container at &lt;code&gt;/dev/ttyACMx&lt;/code&gt; just like you would on the host, say with the &lt;code&gt;pyserial&lt;/code&gt; package in Python.&lt;/p&gt;

&lt;h1&gt;
  
  
  Words of Warning
&lt;/h1&gt;

&lt;p&gt;Couple quick notes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You need to have the device connected before you launch your docker container with that flag. Otherwise, you'll get an error.&lt;/li&gt;
&lt;li&gt;You may run into issues if the device is disconnected and reconnected while the container is running.&lt;/li&gt;
&lt;li&gt;Serial over wires (for instance, with jumper cables connecting pins on the arduino to GPIO on a Jetson or Raspberry Pi) rather than via the USB port will probably have a different device file handle, but will function the same way (pass the device file handle into the container with &lt;code&gt;--devices&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>docker</category>
      <category>arduino</category>
      <category>tutorial</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>Extending an Old-school Programmable Keyboard with AutoHotKey</title>
      <dc:creator>Ryan D. Lewis</dc:creator>
      <pubDate>Thu, 04 Mar 2021 06:38:54 +0000</pubDate>
      <link>https://dev.to/luckierdodge/extending-an-old-school-programmable-keyboard-with-autohotkey-2p1l</link>
      <guid>https://dev.to/luckierdodge/extending-an-old-school-programmable-keyboard-with-autohotkey-2p1l</guid>
      <description>&lt;h1&gt;
  
  
  So it Begins...
&lt;/h1&gt;

&lt;p&gt;Our tale begins in December of 2020 with a message from my friend, roommate, and a notorious thrifter/dumpster diver extraordinaire, Jorge (name changed to protect the innocent) asking if I was interested in an old mechanical keyboard from the thrift store, still in the original packaging. &lt;br&gt;
The message came with a picture of the front of the box, from which little information could be gleaned except the words "TWENTY-FOUR PROGRAMMABLE KEYS". &lt;br&gt;
Like any good computer nerd, I said "Absolutely!". &lt;br&gt;
So he picked up two, one for himself and one for me, for a crisp $3 USD each.&lt;/p&gt;

&lt;p&gt;When he returned with his loot, I quickly set to figuring out what, exactly, we had on our hands. &lt;br&gt;
These were brand-new in the box keyboards, and the box said &lt;em&gt;MCK-142 Pro&lt;/em&gt;...and not much else. &lt;br&gt;
Not even a manufacturer. &lt;br&gt;
But a name's as good a place to start as any, and I turned to the internet and my search engine of choice to look for clues.&lt;/p&gt;

&lt;p&gt;And that's where I found &lt;a href="http://www.mck142.com/"&gt;http://www.mck142.com/&lt;/a&gt;, a lovely little time capsule/memorial devoted to this keyboard specifically. &lt;br&gt;
I encourage you to click through and appreciate this website for a moment (it doesn't take too long to read in its entirety, and it's such a lovingly crafted little webpage).&lt;/p&gt;
&lt;h1&gt;
  
  
  Getting to Know the MCK-142 Pro
&lt;/h1&gt;

&lt;p&gt;For those of you who didn't click through, I'll give you a quick rundown of this keyboard's features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Satisfyingly Clicky Mechanical Switches&lt;/li&gt;
&lt;li&gt;Two sets of Function Keys: the standard top row and a "Left-handed" column on the left side of the main keyboard&lt;/li&gt;
&lt;li&gt;8-directional arrow keys (that's right, this thing can move the cursor diagonally with a single keypress)&lt;/li&gt;
&lt;li&gt;Coiled PS2 cable&lt;/li&gt;
&lt;li&gt;A Fast Repeat Key. According to the manual, this bumps the keyboard from a default of 10 Characters Per Second (CPS) when a key is held, to a crisp 20 CPS with the Fast Repeat Key.&lt;/li&gt;
&lt;li&gt;24 Programmable Keys&lt;/li&gt;
&lt;li&gt;8K (as in, Kilobytes) of Onboard CMOS SRAM Memory, maintained by a set of 4(!) AA batteries (not included, thankfully. Otherwise they'd be a corroded mess by now)&lt;/li&gt;
&lt;li&gt;A floppy disk with software for programming the aformentioned Programmable Keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of this functionality has been rendered obsolete by the passage of time, of course. &lt;br&gt;
The "Fast Repeat" key, which would allow the user to more quickly enter the same key when holding it down, is superseded by the host operating system's settings on key repeats and associated delays these days. &lt;br&gt;
The floppy disk with included software for programming may still be usable on some IBM PC's from the 90s, but I wasn't about to try and find out.&lt;/p&gt;

&lt;p&gt;Notably, it does not feature a Windows Key, because it wasn't really intended for use with Windows NT-based computers, but &lt;a href="https://github.com/microsoft/PowerToys"&gt;PowerToys'&lt;/a&gt; key remapping utility solves that (in my case, I remapped the Caps Lock key, a key which I ONLY press accidentally).&lt;/p&gt;

&lt;p&gt;The keyboard itself very much reminds me of the old Gateway family PC we had when I was growing up, with the same solid square body, weighty heft, and lightly textured beige ABS with gray accents.&lt;br&gt;
I've never had too much nostalgia for that era of computing (I mostly remember that PC for being slow, noisy, and prone to crashes), but it's well-built, if nothing else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uwqIizPj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y8e321k1w9nwtrgavam9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uwqIizPj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y8e321k1w9nwtrgavam9.jpg" alt="The MCK142Pro Keyboard and Manual, sitting on a desk."&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Programming the Programmable Keyboard
&lt;/h2&gt;

&lt;p&gt;Now, I had to figure out how to program this beauty. &lt;br&gt;
At first, I was concerned that, without the software working (aka, without an IBM PC or some sort of emulator), I'd be unable to actually program the keyboard. &lt;br&gt;
Not the end of the world, but disappointing to relinquish such unique functionality.&lt;/p&gt;

&lt;p&gt;Thankfully, a detailed reading of the manual revealed that this was not the case! &lt;br&gt;
In addition to the 24 Programmable Keys, the keyboard has a "Select" key and two LEDs: "Menu" and "Prog". &lt;br&gt;
As it turns out, that key could be used to program each of the 24 keys, with the following steps (taken word for word out of the manual):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press the SELECT Key twice within a second, the PROG LED indicator in YELLOW will turn on.&lt;/li&gt;
&lt;li&gt;Press one PF Key, e.g. any one of PF1 to PF24, to start data entry.&lt;/li&gt;
&lt;li&gt;Type strings or commands you want to save in any one of PF keys by using keyboard typewriter keys. The keystrokes of every PF key is limited within 320 keystrokes.&lt;/li&gt;
&lt;li&gt;Press the SELECT Key once to save the data to the chosen PF Key, the PROG LED indicator in YELLOW will flash once.&lt;/li&gt;
&lt;li&gt;Repeat the action from 2. to 4. for defining others or redefining any PF keys.&lt;/li&gt;
&lt;li&gt;Press the SELECT Key one more time to complete data entry, the PROG LED indicator in YELLOW will turn off.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, for instance, if I wanted to map the &lt;code&gt;PF1&lt;/code&gt; key to something like &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;, I could do that by:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pressing &lt;code&gt;SELECT&lt;/code&gt; twice, pressing &lt;code&gt;PF1&lt;/code&gt;, typing &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;, pressing the &lt;code&gt;SELECT&lt;/code&gt; key, and then pressing the &lt;code&gt;SELECT&lt;/code&gt; key again to exit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, the manual did forget to mention something: how to actually use the &lt;code&gt;PF&lt;/code&gt; keys. &lt;br&gt;
After programming one of the keys, I found that pressing it didn't actually do anything. &lt;br&gt;
Perplexing.&lt;/p&gt;

&lt;p&gt;With the quest teetering on the edge of disaster, I set out to find a solution. &lt;br&gt;
After some experimentation, I discovered that I needed to press the &lt;code&gt;SELECT&lt;/code&gt; key once to activate the &lt;code&gt;PF&lt;/code&gt; keys. When I did that, the Menu LED lit up green and the &lt;code&gt;PF&lt;/code&gt; keys would work. &lt;br&gt;
Without it, no dice. &lt;br&gt;
Moreover, this needed to be done anytime the computer was restarted or the keyboard was disconnected. &lt;br&gt;
Easy enough, but strangely, not mentioned anywhere in the manual. &lt;br&gt;
I can't help but think the software might automatically handle that functionality, but without it the keys have to be manually toggled.&lt;/p&gt;
&lt;h1&gt;
  
  
  Extending with AutoHotKey
&lt;/h1&gt;

&lt;p&gt;Now at this point, I can program the keys to do essentially anything I can do on my keyboard (with 320 keystrokes, at least). &lt;br&gt;
This includes both entering hotkeys and typing text (or a mix of both), which is neat, but I wanted to push it further. &lt;br&gt;
After all, I could already use hotkeys by...pressing the hotkey. &lt;/p&gt;

&lt;p&gt;Naturally, the first thing I did once I got programming working was program it to type &lt;a href="https://knowyourmeme.com/memes/the-tragedy-of-darth-plagueis-the-wise"&gt;The Tragedy of Darth Plagueis the Wise&lt;/a&gt; at the press of a button. &lt;br&gt;
There are rules, after all.&lt;/p&gt;

&lt;p&gt;But how to make this actually useful? &lt;br&gt;
The use cases suggested by the keyboard were things like passwords, email signatures, and other text you have to repeat often. &lt;br&gt;
But I've found that most of these scenarios have been solved by password managers, built-in email signatures, and other software approaches. &lt;br&gt;
Plus programming passwords or other sensitive information into a keyboard really sets my security spider-senses atingling.&lt;/p&gt;

&lt;p&gt;What I really wanted to do with this keyboard, was configure it such that I could essentially trigger an arbitrary action on my computer with each button. &lt;br&gt;
And I wanted to be able to easily change what each &lt;code&gt;PF&lt;/code&gt; key would do (typing out the whole Tragedy of Darth Plagueis takes awhile, after all).&lt;/p&gt;
&lt;h2&gt;
  
  
  Enter AutoHotKey
&lt;/h2&gt;

&lt;p&gt;To do that, I turned to &lt;a href="https://www.autohotkey.com/"&gt;AutoHotKey&lt;/a&gt;, the self-proclaimed "ultimate automation scripting language for Windows".&lt;br&gt;
It's a powerful tool, capable of a great many things, but for our purposes, it provides us with a way to create custom hot keys that can trigger a wide range of things: run one or more programs, manage which windows are open and active, type text, make decisions based on whats happening on the computer, and more. &lt;br&gt;
Moreover, these hotkeys and outcomes are laid out in a script, which can be quickly modified and restarted to change the effect of a given hotkey.&lt;/p&gt;

&lt;p&gt;One wrinkle quickly presents itself, however. &lt;br&gt;
AutoHotKey works by intercepting values from the keyboard. &lt;br&gt;
For instance, if I type &lt;code&gt;Ctrl+Shift+J&lt;/code&gt;, and I have an AutoHotKey script with that hotkey programmed as a trigger, the corresponding actions will be run when &lt;code&gt;Ctrl+Shift+J&lt;/code&gt; is detected. &lt;br&gt;
But the &lt;code&gt;PF&lt;/code&gt; keys aren't really keys, at least, not from the Operating System's perspective. &lt;br&gt;
When a &lt;code&gt;PF&lt;/code&gt; key is pressed, the only keys the computer sees are whatever strokes the key was programmed to type. &lt;br&gt;
So I can't have an AutoHotKey script listen for the &lt;code&gt;PF&lt;/code&gt; keys directly, I have to have it listen for a special hot key which I program into each &lt;code&gt;PF&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;Since I don't want the AutoHotKey hooks to trigger when I press something other than a &lt;code&gt;PF&lt;/code&gt; key, these can't be hotkeys I need to use regularly. &lt;br&gt;
And I don't want the AutoHotKey functionality to mask actual functionality, either.&lt;/p&gt;

&lt;p&gt;So I set out to find a set of 24 hotkeys not used anywhere else on my computer. &lt;br&gt;
And I almost succeeded. &lt;br&gt;
The closest I got was with the pattern &lt;code&gt;Ctrl+Alt+Shift+Fx&lt;/code&gt;, where &lt;code&gt;Fx&lt;/code&gt; corresponds to &lt;code&gt;PFx&lt;/code&gt;, i.e. &lt;code&gt;PF1:F1&lt;/code&gt;, &lt;code&gt;PF2:F2&lt;/code&gt;, etc. &lt;br&gt;
Now, you'll quickly realize there's a problem here: I have 24 programmable keys, but only 12 function keys. &lt;br&gt;
Not to fear, as it turns out AutoHotKey can differentiate between left and right modifier keys! So I set the first 12 &lt;code&gt;PF&lt;/code&gt; keys to use the left control key, and the last 12 to use the right control key.&lt;/p&gt;

&lt;p&gt;Unfortunately, exactly one of these shortcuts (the &lt;code&gt;F7&lt;/code&gt; combo, I think) is actually already mapped to some obscure function of Nvidia's GeForce Experience software. &lt;br&gt;
But since I had never used that functionality or key combo before in my life, I decided that was okay. &lt;br&gt;
This specific pattern of hotkeys may not work for everyone, but it worked for my purposes.&lt;/p&gt;

&lt;p&gt;Notably, this approach confers another advantage: even without this particular keyboard, I can still use my AutoHotKey setup, because they just correspond to (awkward, inconvenient) hotkeys. &lt;br&gt;
The Programmable keyboard provides a simple, clean interface from which I can trigger whatever functionality I want with the press of a single button now.&lt;/p&gt;
&lt;h2&gt;
  
  
  The AutoHotKey Script
&lt;/h2&gt;

&lt;p&gt;So what does the script look like, and what am I actually doing with it? &lt;br&gt;
&lt;a href="https://gist.github.com/LuckierDodge/2ed678e035306d7f3cd935a40b3b0028"&gt;Here's a Gist&lt;/a&gt; of the full version, but I'll break it down below.&lt;/p&gt;

&lt;p&gt;We start with some opening configuration, which are pretty much the defaults for a new AutoHotKey script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we add 24 of the following, slightly modified to match each &lt;code&gt;PF&lt;/code&gt; key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; PF1
&amp;lt;^!+F1::
Run, wt
return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first line is a comment identifying the programmable key I'm creating a hotkey for (AutoHotKey uses semicolons for its comment character). &lt;br&gt;
The second is declaring the hotkey, broken up as follows: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;&lt;/code&gt; indicates that we want the "left" version of the next modifier key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;^&lt;/code&gt; corresponds to the control key in AutoHotKey parlance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;!&lt;/code&gt; corresponds to the alt key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+&lt;/code&gt; corresponds to the shift key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F1&lt;/code&gt; corresponds to the first function key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;::&lt;/code&gt; indicates the end of our hotkey, with everything after it corresponding to what should happen after the hotkey is detected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This brings us to the third line &lt;code&gt;Run, wt&lt;/code&gt; which, as the name implies, runs a program. &lt;br&gt;
In this case, its running the &lt;code&gt;wt&lt;/code&gt; shortcut, which opens the Windows Terminal, but you could replace that with any shortcut name or path to an application. &lt;br&gt;
Basically, it works the same as the Windows Run dialog accessed with &lt;code&gt;Win+r&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;But we're not limited to running just a single command. Consider,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; PF2
&amp;lt;^!+F2::
Run, outlook
Run, "C:\Users\Ryan Lewis\AppData\Local\Microsoft\Teams\Update.exe" --processStart "Teams.exe"
Run, "C:\Users\Ryan Lewis\AppData\Local\slack\slack.exe"
Run, "C:\Users\Ryan Lewis\AppData\Local\Discord\Update.exe" --processStart Discord.exe
return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which opens all of my various communications applications. I just switch to an empty virtual desktop, press &lt;code&gt;PF2&lt;/code&gt;, and it opens Outlook, Teams, Slack, and Discord. With &lt;a href="https://github.com/microsoft/PowerToys"&gt;PowerToys'&lt;/a&gt; Fancy Zones, it even nicely positions them in the same grid pattern every time.&lt;/p&gt;

&lt;p&gt;Last but not least, my proudest creation so far:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; PF3
&amp;lt;^!+F3::
WinHTTP := ComObjCreate("WinHTTP.WinHttpRequest.5.1")
WinHTTP.Open("GET", "https://wttr.in/12345?nFATQ")
WinHttp.Send()
response := WinHTTP.ResponseText
Gui, New,, Weather Report
Gui, Color, 111111
Gui, Font, s14 cWhite, Cascadia Mono
Gui, Add, Text,, % response
Gui, Show
return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which sends an HTTP request to the wonderful &lt;a href="https://wttr.in"&gt;wttr.in&lt;/a&gt; weather API, and displays the results in a helpful dialog.&lt;br&gt;
I won't bore you with the details of how it works, but I think it's a simple example of some of the powerful potential here: anything I can hook up to an API endpoint, I can run with the press of a button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yxHVVX-Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f7ihu2mk28njhxqp81tj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yxHVVX-Z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f7ihu2mk28njhxqp81tj.png" alt="The Weather popup that I see when I press PF3, complete with adorable ASCII art."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Denouement
&lt;/h1&gt;

&lt;p&gt;To summarize, I took an old programmable mechanical keyboard, combined it with the power of AutoHotKey, and found a needlessly complicated way to create a budget &lt;a href="https://www.elgato.com/en/gaming/stream-deck"&gt;Stream Deck&lt;/a&gt;. &lt;br&gt;
Compared to the $150 price tag for one of those, $3 and some elbow grease doesn't seem half bad. &lt;br&gt;
And, more importantly, it was pretty fun to figure out!&lt;/p&gt;

&lt;p&gt;I'm not done with this project just yet: I hope to find some more useful shortcuts to map, as well as integrating into my homelab/self hosting. &lt;br&gt;
Once I get Home Assistant setup, for instance, it would be fun to hook up buttons to some automations.&lt;br&gt;
Of course, I'll update the Gist as I go. &lt;/p&gt;

&lt;p&gt;Got any suggestions, questions, or thoughts? What would you map these buttons to? Let me know! Otherwise, support open source projects, and be nice to each other out there!&lt;/p&gt;

</description>
      <category>adventuresintech</category>
      <category>sideprojects</category>
      <category>autohotkey</category>
      <category>mechanicalkeyboard</category>
    </item>
    <item>
      <title>Personal Notes from ROS World 2020</title>
      <dc:creator>Ryan D. Lewis</dc:creator>
      <pubDate>Fri, 13 Nov 2020 00:01:05 +0000</pubDate>
      <link>https://dev.to/luckierdodge/personal-notes-from-ros-world-2020-2e04</link>
      <guid>https://dev.to/luckierdodge/personal-notes-from-ros-world-2020-2e04</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Update: You can find all of the videos from ROS World 2020 &lt;a href="https://vimeo.com/showcase/rosworld2020"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I attended the Robotic Operating System's &lt;a href="https://roscon.ros.org/world/2020/"&gt;ROS World 2020&lt;/a&gt; convention today. I quite enjoyed it! To keep myself focused during the event, I tried to write some comprehensive notes. To keep myself entertained, I wrote them as if somebody else would be reading them.&lt;/p&gt;

&lt;p&gt;But it occurred to me that someone else might find these useful in some way, especially if they missed the convention or didn't know it was a thing, and this might act as a sort of helpful guide. Or maybe you're just curious about robots and want to see what we're up to. Either way, I hope this is helpful! I'll add links to the videos once they're posted publicly, and will happily answer any questions in the comments.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔑 Keynote &amp;amp; Q&amp;amp;A - Dr. Vivian Chu, co-founder and CTO of Diligent Robotics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Missed the first couple minutes because the stream was acting up.&lt;/li&gt;
&lt;li&gt;Good advice on robotics startups&lt;/li&gt;
&lt;li&gt;Interesting insight into systemic issues in healthcare and nursing, and how robots might be able to help alleviate that.&lt;/li&gt;
&lt;li&gt;Users don't know what they want&lt;/li&gt;
&lt;li&gt;Spotty network connections, even indoors&lt;/li&gt;
&lt;li&gt;Q &amp;amp; A Bechdel Test: Two women - Katherine Scott, Developer Advocate from Open Robotics, and Dr. Vivian Chu, CTO of Diligent Robotics. Other founder of Diligent is also a woman.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  👍 Panel: Software Quality in Robotics Content
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Deby Katz - Carnegie Mellon University (Moderator), Allison Thackston - Waymo, Afsoon Afzal Phd Candidate at Carnegie Mellon, Sophia Kolak from Columbia University&lt;/li&gt;
&lt;li&gt;So many women speakers! Awesome.&lt;/li&gt;
&lt;li&gt;Familiar idea for most devs: automated testing is important&lt;/li&gt;
&lt;li&gt;Adversarial situations: robots have to exist in the real world, where things often don't go to plan.&lt;/li&gt;
&lt;li&gt;FIELD TESTING, LOGGING AND PLAYBACK - IMPORTANT&lt;/li&gt;
&lt;li&gt;Not as much Automated Testing currently, because it's hard, but might be helpful to increase&lt;/li&gt;
&lt;li&gt;3 Main Challenges:

&lt;ul&gt;
&lt;li&gt;Testing in the real world ("Unknown unknowns")&lt;/li&gt;
&lt;li&gt;She never actually mentioned the other 2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Sensor noise makes things interesting.&lt;/li&gt;
&lt;li&gt;"Degenerate Input"&lt;/li&gt;
&lt;li&gt;Lots of dichotomization between pure software like the web and these physical computing concepts.&lt;/li&gt;
&lt;li&gt;Documentation for packages are lacking.&lt;/li&gt;
&lt;li&gt;Need to reduce friction for writing documentation.&lt;/li&gt;
&lt;li&gt;Simulation is critical part of software quality assurance

&lt;ul&gt;
&lt;li&gt;Why aren't people using it then?&lt;/li&gt;
&lt;li&gt;Using "multiple modalities of testing" can improve testing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Favorite/most interesting bug

&lt;ul&gt;
&lt;li&gt;Someone found simulated case where robot arm intersected robot body, developers didn't believe, sure enough: broke robot&lt;/li&gt;
&lt;li&gt;Simulators can be wonky: spawn underground, shoot up and collapse in on itself.&lt;/li&gt;
&lt;li&gt;Robot kicked human tester so hard they were injured during field testing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Software testing important for researchers?

&lt;ul&gt;
&lt;li&gt;Yes (implied &lt;em&gt;duh&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Too many people treat it as an afterthought&lt;/li&gt;
&lt;li&gt;Need to make it easy to go from rosbag to structured unit test&lt;/li&gt;
&lt;li&gt;The infrastructure and techniques need robustness&lt;/li&gt;
&lt;li&gt;First-to-market tends to outweigh safety/quality concerns

&lt;ul&gt;
&lt;li&gt;Maybe need to introduce standard/certification&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Probabalistic Testing, how do we ensure coverage?

&lt;ul&gt;
&lt;li&gt;Better test platform, increase reproducibility, add fuzziness to try and replicate&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Health of the ROS ecosystem

&lt;ul&gt;
&lt;li&gt;Software Quality/Testing is hidden away in the far corners of specialized CS curriculum

&lt;ul&gt;
&lt;li&gt;Need to prioritize teaching these tools&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Need better tooling&lt;/li&gt;
&lt;li&gt;AUTOMATE. THOSE. TOOLS!!!&lt;/li&gt;
&lt;li&gt;Standardized Environments for testing - neat!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Best practices?

&lt;ul&gt;
&lt;li&gt;Lot of familiar stuff from traditional software engineering&lt;/li&gt;
&lt;li&gt;How do you style a test environment to do end-to-end testing&lt;/li&gt;
&lt;li&gt;Lotta roll-your-own right now&lt;/li&gt;
&lt;li&gt;Documentation for best practices/testing is lacking&lt;/li&gt;
&lt;li&gt;MOAR TOOLING&lt;/li&gt;
&lt;li&gt;If you have something that works/you've created, share it with the community!&lt;/li&gt;
&lt;li&gt;Lots of dependency on a few centralized packages - dangerous&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Hardware in the Loop Testing

&lt;ul&gt;
&lt;li&gt;Need to look into this more.&lt;/li&gt;
&lt;li&gt;Simulation is great, but some things are hardware-dependent.&lt;/li&gt;
&lt;li&gt;Different types of tests to get different types of results&lt;/li&gt;
&lt;li&gt;Log testing gives rare, real results that might never appear in simulation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"At the end of the day, you need a reliable system, and a reliable system is well tested."&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Even if simulation can't catch everything, it's better than nothing.&lt;/li&gt;
&lt;li&gt;Code maintainers and reviewers could be requiring documentation with new pull requests.&lt;/li&gt;
&lt;li&gt;Make documentation/testing a part of community standards.&lt;/li&gt;
&lt;li&gt;No set of well-defined best practices for software quality. How do we fix that?

&lt;ul&gt;
&lt;li&gt;Community standards, again.&lt;/li&gt;
&lt;li&gt;People look to OSRF for standards, so maybe starting there.&lt;/li&gt;
&lt;li&gt;Also maintainers of large packages.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Lightning Talks 1
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cool vis of ROS contributions over time.

&lt;ul&gt;
&lt;li&gt;Needs a legend for the colors.&lt;/li&gt;
&lt;li&gt;Should've grabbed the link&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;For some reason this conference platform keeps tripping the Firefox VR permissions. Do they have a WebXR viewer? Not willing to risk losing the stream again to figure out.&lt;/li&gt;
&lt;li&gt;Ad for EProsima "The Middleware Experts"

&lt;ul&gt;
&lt;li&gt;Discovery server for ROS&lt;/li&gt;
&lt;li&gt;Shared Memory&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Sidenote: videos are hosted on Vimeo. Good choice, I guess, given the youtube outage 🤷‍♂️&lt;/li&gt;
&lt;li&gt;Robot Dogs!

&lt;ul&gt;
&lt;li&gt;Aibo&lt;/li&gt;
&lt;li&gt;Had one as a kid, back when they were...not good. Wonder if they've gotten better? Hard to tell from ad.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Ubuntu advertisement for snap

&lt;ul&gt;
&lt;li&gt;So fast, much snappy.&lt;/li&gt;
&lt;li&gt;Look at that apt install, sped up to 4x and still trailing. What a scrub.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Ooh, flashy "ROS Underground" ad

&lt;ul&gt;
&lt;li&gt;DARPA Subterranean Challenge.&lt;/li&gt;
&lt;li&gt;Interesting, tools provided competition.&lt;/li&gt;
&lt;li&gt;11/17/2020&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Daniel Grieneisen, Six River Systems

&lt;ul&gt;
&lt;li&gt;Shipping and warehousing robots&lt;/li&gt;
&lt;li&gt;Flash backs to working back-end at Walmart &lt;em&gt;shudders&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="//6river.com/category/engineering"&gt;6river.com/category/engineering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Open source Data-processing pipeline, neat&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;They weren't kidding about lightning, geez&lt;/li&gt;
&lt;li&gt;These are some high-budget videos, wow.&lt;/li&gt;
&lt;li&gt;Rocos

&lt;ul&gt;
&lt;li&gt;Some sort of ROS robot operations management tool&lt;/li&gt;
&lt;li&gt;Widgets! Dashboards! Digital Twins! Autonomous missions! Visualizations! Fleets! Complexity! Security!&lt;/li&gt;
&lt;li&gt;&lt;a href="//rocos.io"&gt;rocos.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ARM ad

&lt;ul&gt;
&lt;li&gt;"5th wave of computing"&lt;/li&gt;
&lt;li&gt;Buzzwordy buzzwords are buzzwording.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏫 Time for Class
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If anyone wants my notes on Bezier Curves, let me know 😉&lt;/li&gt;
&lt;li&gt;Missed: networking break (meh), "MSeg: Achieving Generality and Robustness in Semantic Segmentation".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌱 Panel: ROS Agriculture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Stream wasn't loading, so whatever occurred at the beginning is a mystery to me 😒
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iD4Gg1IK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7rthdv3daux0dnu4k58m.gif" alt="Alt Text"&gt;
&lt;/li&gt;
&lt;li&gt;Got in, 20 minutes late&lt;/li&gt;
&lt;li&gt;Sarah Osentoski (Moderator), SVP Iron OX; Michele Pratusevich, Direcotr of Software Development, Root AI; Lee Redden, Chief Scientist, Blue River Technology; Eitan Babcock, Chief Roboticist/Cofounder, American Robotics&lt;/li&gt;
&lt;li&gt;...some stuff that I missed...&lt;/li&gt;
&lt;li&gt;Need to couple engineering w/ extant agricultural knowledge from agronomists to achieve superior results&lt;/li&gt;
&lt;li&gt;Robots can replicate grueling PhD research formerly done by hand, but much faster&lt;/li&gt;
&lt;li&gt;Big push in CV using expert annotators - Ag is a good use case

&lt;ul&gt;
&lt;li&gt;Part of the job is to leverage the myopic knowledge of Ag researchers&lt;/li&gt;
&lt;li&gt;Needs more love for 3D data - LIDAR, point clouds, etc.&lt;/li&gt;
&lt;li&gt;Also change detection, time&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Is Ag easy, due to minimal human interaction?

&lt;ul&gt;
&lt;li&gt;"Don't know about easy, but different problem set".&lt;/li&gt;
&lt;li&gt;Advantages: everything's on a grid, more control of certain variables and structure&lt;/li&gt;
&lt;li&gt;No FDA testing like in medical&lt;/li&gt;
&lt;li&gt;Fewer size and power, movement constraints&lt;/li&gt;
&lt;li&gt;Limited ethical constraints (don't know about this one)&lt;/li&gt;
&lt;li&gt;Hard: no red tape, so stuff needs to work. Farmers have "show me" culture, needs to withstand the elements, operate in variety of potentially adverse conditions.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;How do you deal with FDA requirements for cleaning tools etc?

&lt;ul&gt;
&lt;li&gt;Michele - "Thankfully, haven't had to deal with it yet"&lt;/li&gt;
&lt;li&gt;As volume scales: might eventually have safety requirements, IP requirements, etc.&lt;/li&gt;
&lt;li&gt;Learn as we go.&lt;/li&gt;
&lt;li&gt;Sarah - difference between agriculture (in the field) and manufacturing (on the conveyor)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Ever had to pivot areas in Ag?

&lt;ul&gt;
&lt;li&gt;Michele - not yet&lt;/li&gt;
&lt;li&gt;Eitan - small shift from bulk to high-value crops.&lt;/li&gt;
&lt;li&gt;Lee - pivoted form lawn mowers to tractors to implements; now some phenotyping.

&lt;ul&gt;
&lt;li&gt;Pivot from lettuce to row crops due to market size.&lt;/li&gt;
&lt;li&gt;So many small subsegments in Ag, value-based priority shift/addition&lt;/li&gt;
&lt;li&gt;Enabled by technology leap.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Connectivity issues?

&lt;ul&gt;
&lt;li&gt;Issues in greenhouse due to water content in air&lt;/li&gt;
&lt;li&gt;Eitan - rely on LTE, problems if not near highway (most farms). Satellite also an option

&lt;ul&gt;
&lt;li&gt;Range on base station: point to point radio, multiple miles&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Michele - "Once we send robot out into the row, we assume we can't talk to it"

&lt;ul&gt;
&lt;li&gt;Also in greenhouse&lt;/li&gt;
&lt;li&gt;Get data off robot at some point&lt;/li&gt;
&lt;li&gt;Costs money and time to move data offsite&lt;/li&gt;
&lt;li&gt;How do you prioritize data retention?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Lee

&lt;ul&gt;
&lt;li&gt;Embed intelligence on the robot&lt;/li&gt;
&lt;li&gt;If we have connectivity, that's a nice plus&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How do you get buy-in from Farmers

&lt;ul&gt;
&lt;li&gt;Lee - farmers have been quite open and willing, straightforward with what's valuable and what isn't, allow demos and whatnot, constantly trying things and improving. Calculated risks&lt;/li&gt;
&lt;li&gt;Michele - "part of it is relationship building", building trust slowly over time, can't destroy somebody's crop, demo what's possible. Onsite facility mocked up to demo stuff/use for marketing&lt;/li&gt;
&lt;li&gt;Eitan - small pilot programs, work up to 6-month growing season.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Advice for roboticists interested in Ag?

&lt;ul&gt;
&lt;li&gt;Michele - find your niche. Pick a pain point and solve that, not generalized problems&lt;/li&gt;
&lt;li&gt;Eitan - agreeing noises to michele, communication is important and talk to farmers when they're not in the middle of growing season.&lt;/li&gt;
&lt;li&gt;Lee - general roboticist? Apply to one of our companies!!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🥪 Lunch Break (Technically a Networking Break, but dammit I need to eat).
&lt;/h2&gt;

&lt;h2&gt;
  
  
  ⚡ Lightning Talks 2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Spinning circle of doom. At least it's better than the black screen from earlier, I guess.&lt;/li&gt;
&lt;li&gt;Welp, someone posted the permalink, so here it is: &lt;a href="https://vimeo.com/478302472"&gt;https://vimeo.com/478302472&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Also, Vimeo needs to leave my VR headset alone for pity's sake.&lt;/li&gt;
&lt;li&gt;Apex.AI ad: self-driving stuff

&lt;ul&gt;
&lt;li&gt;Autonomous is hard, yo&lt;/li&gt;
&lt;li&gt;ApexOS&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ROS2 in RoboCup

&lt;ul&gt;
&lt;li&gt;Autonomous soccer bots!&lt;/li&gt;
&lt;li&gt;Adorably janky&lt;/li&gt;
&lt;li&gt;Lots of different components, really leveraging ROS for this&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/boldhearts"&gt;https://gitlab.com/boldhearts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;AWS Robotics Ad

&lt;ul&gt;
&lt;li&gt;I'm too poor for your product, Roger.&lt;/li&gt;
&lt;li&gt;They do have a lot of integrated ROS extensions&lt;/li&gt;
&lt;li&gt;Big emphasis on simulation and WorldForge stuff&lt;/li&gt;
&lt;li&gt;Free Robotics Application Development Curriculum - Might be a good alternative to ROS Construct&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;8:02 going to other session, will come back to this later&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;li&gt;And we're back.&lt;/li&gt;
&lt;li&gt;Fetch Robotics

&lt;ul&gt;
&lt;li&gt;History of ROS montage&lt;/li&gt;
&lt;li&gt;Robots helping with COVID!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;roscompile ad

&lt;ul&gt;
&lt;li&gt;Hate using CMake? roscompile makes all that nonsense less awful&lt;/li&gt;
&lt;li&gt;Thankfully, much less of that in ROS2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ClearPath Robotics

&lt;ul&gt;
&lt;li&gt;Maker of nice rugged all terrain robots of various classifications&lt;/li&gt;
&lt;li&gt;Love how industrial their mobile robots are&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Rapyuta Robotics ad

&lt;ul&gt;
&lt;li&gt;More warehouse robots&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🌎 MoveIt World
&lt;/h2&gt;

&lt;p&gt;Lots of different technical sessions at 1:45pm, I chose this one because it's relevant to stuff I want to do in the near future. Might go back and explore the other talks later.&lt;/p&gt;

&lt;p&gt;For those who don't know, MoveIt is a tool for motion planning with robotic arms.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9(!) presenters, including a number from PickNik (primary contributors to MoveIt).&lt;/li&gt;
&lt;li&gt;World MoveIt day Hackathon

&lt;ul&gt;
&lt;li&gt;Closed many issues and pull requests&lt;/li&gt;
&lt;li&gt;80 participants, 55 people signed up on discord&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;MoveIt on Discord and Discourse&lt;/li&gt;
&lt;li&gt;MoveIt2 out of beta now&lt;/li&gt;
&lt;li&gt;RoadMap Status Update

&lt;ul&gt;
&lt;li&gt;Already have straight port to ROS 2 94% complete&lt;/li&gt;
&lt;li&gt;Currently refactoring for Realtime support

&lt;ul&gt;
&lt;li&gt;"Reactive, closed loop control"&lt;/li&gt;
&lt;li&gt;"Separate global and local planner (hybrid planning)"&lt;/li&gt;
&lt;li&gt;"Zero Memory Copy Integration"&lt;/li&gt;
&lt;li&gt;Integrate pilz_industrial_motion&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Cool motion planning demos&lt;/li&gt;
&lt;li&gt;Lots of movement here: Google Summer of Code, Hackathons, research interns, and a well coordinator core contributors group. It's an impressive open source org, to be sure.&lt;/li&gt;
&lt;li&gt;Lots of features around pose-planning, moving the arm in intelligent ways to avoid collisions, stuff like that.&lt;/li&gt;
&lt;li&gt;Hybrid planning - trying to solve for the different types of problems that an arm might need to solve (writing with chalk versus avoiding a collision with a surprise obstacle, for instance).&lt;/li&gt;
&lt;li&gt;Definitely worth just digging through these slides/video in their/its entirety - no way I'm gonna be able to summarize this in text form (lot's of good diagrams/visuals).&lt;/li&gt;
&lt;li&gt;"Chicken egg" problem of hardware integration: need hardware support to drive ROS2 adoption, need ROS2 adoption to drive hardware support&lt;/li&gt;
&lt;li&gt;micro-ROS - interesting project to work with microcontrollers on ROS, glad to see this getting attached to other projects like MoveIt&lt;/li&gt;
&lt;li&gt;Next stage: fully leverage ROS 2

&lt;ul&gt;
&lt;li&gt;ROS 2 release every 6 weeks&lt;/li&gt;
&lt;li&gt;Main branch switching to Rolling Ridley&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Talk about calibrating a robot arm using a camera

&lt;ul&gt;
&lt;li&gt;2 forms: eye to hand, and eye in hand

&lt;ul&gt;
&lt;li&gt;Really more or less the same problem&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Lots of transforms and math&lt;/li&gt;
&lt;li&gt;I'mma need to brush up on my linear algebra&lt;/li&gt;
&lt;li&gt;AX=XB solvers - there's a bunch of solutions for this problem, including OpenCV&lt;/li&gt;
&lt;li&gt;Live demo is a simulation, because the robot is broken - classic&lt;/li&gt;
&lt;li&gt;I will note, RVIZ is a lot less ugly now.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Robot Assembly Presentation

&lt;ul&gt;
&lt;li&gt;Presenter from Omron&lt;/li&gt;
&lt;li&gt;World Robot Summit Assembly Challenge&lt;/li&gt;
&lt;li&gt;Challenge: build component with lots of small parts and fine motor control required&lt;/li&gt;
&lt;li&gt;Traditional solution: lots of custom jigs and machining, separate everything into simple tasks&lt;/li&gt;
&lt;li&gt;Very expensive!&lt;/li&gt;
&lt;li&gt;Omron solution:

&lt;ul&gt;
&lt;li&gt;"Connecting a lot of things together -- ROS helps"&lt;/li&gt;
&lt;li&gt;"Always strike a balance between prototyping speed and machine control"&lt;/li&gt;
&lt;li&gt;"Sliding scale of complexity" to existing approaches&lt;/li&gt;
&lt;li&gt;Really in-depth here, definitely good stuff if you're interested in this kind of repeatable autonomous fine manipulation with end effectors&lt;/li&gt;
&lt;li&gt;Pretty cool collaboration between two robot arms shown&lt;/li&gt;
&lt;li&gt;Emphasis on robustness&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Constraint-based Cartesian Planning

&lt;ul&gt;
&lt;li&gt;Task constraints: how tools and such are allowed to move&lt;/li&gt;
&lt;li&gt;Generally expect cartesian planning to "just work"&lt;/li&gt;
&lt;li&gt;Number of different options for planning cartesian movement, all with trade-offs&lt;/li&gt;
&lt;li&gt;OMPL Constraint Planning - Summer of Code project

&lt;ul&gt;
&lt;li&gt;Used to plan NASA's Robonaut 2&lt;/li&gt;
&lt;li&gt;Need to replace existing "PoseModel" which has issues - joint space jumps and such&lt;/li&gt;
&lt;li&gt;Lots of high quality gifs&lt;/li&gt;
&lt;li&gt;Sampling-based motion planning - interesting approach to find valid and invalid poses&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Robonaut 2 from NASA

&lt;ul&gt;
&lt;li&gt;Cool multi-armed robot that moves in zero-gravity on space station&lt;/li&gt;
&lt;li&gt;Lots of path-planning, control challenges arise when trying to use arms to pull yourself around a tiny space capsule&lt;/li&gt;
&lt;li&gt;TaskForce - tool to help task-based motion planning

&lt;ul&gt;
&lt;li&gt;Makes MoveIt control easier and more versatile&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Currently open sourcing both tools&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MoveIt Capabilities Overview

&lt;ul&gt;
&lt;li&gt;Good roll at the end showing all the different use-cases for MoveIt. Honestly, should've led with that.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Lightning Talks 3
&lt;/h2&gt;

&lt;p&gt;Had to come back for this one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PlotJuggler 3.0

&lt;ul&gt;
&lt;li&gt;+1 for most interesting man in the world meme.&lt;/li&gt;
&lt;li&gt;Pretty good stuff from a data vis perspective, nice hooks into the ROS tooling&lt;/li&gt;
&lt;li&gt;Window system reminds me of Visual Studio&lt;/li&gt;
&lt;li&gt;Meme dunking on Matlab. Outstanding&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plotjuggler.io"&gt;plotjuggler.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;GurumNetworks ad

&lt;ul&gt;
&lt;li&gt;High production quality, low calorie content&lt;/li&gt;
&lt;li&gt;"Best DDS"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Intel OPENVINO Toolkit ad

&lt;ul&gt;
&lt;li&gt;Pictures = ton of data&lt;/li&gt;
&lt;li&gt;Enables "Smart video and visualizations"&lt;/li&gt;
&lt;li&gt;CV/Deep learning solution&lt;/li&gt;
&lt;li&gt;Really throwing the kitchen sink of buzzwords&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Microsoft Ad

&lt;ul&gt;
&lt;li&gt;ROS on windows - 100000+ downloads&lt;/li&gt;
&lt;li&gt;Lots of integrations&lt;/li&gt;
&lt;li&gt;Ooh, Mixed Reality Toolkit for ROS2 (mispelled in the slide, oops) - that's pretty exciting&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Zebracorns FRC Team 900

&lt;ul&gt;
&lt;li&gt;First Robotics Competition&lt;/li&gt;
&lt;li&gt;Bringing ROS to FRC&lt;/li&gt;
&lt;li&gt;Pretty wild output from Highschoolers. Good for them!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;RobotIS

&lt;ul&gt;
&lt;li&gt;Turtlebot3!&lt;/li&gt;
&lt;li&gt;Lots of fun consumer/industrial robotics showcasing happening here, very quickly.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Auterion

&lt;ul&gt;
&lt;li&gt;Autonomous Drone Flight Controller&lt;/li&gt;
&lt;li&gt;Also includes other mobile robots?&lt;/li&gt;
&lt;li&gt;Skynode&lt;/li&gt;
&lt;li&gt;Sharp polos&lt;/li&gt;
&lt;li&gt;Why doesn't this guy have a polo?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;SICK Sensor Intelligence

&lt;ul&gt;
&lt;li&gt;"Industry 4.0" ugh&lt;/li&gt;
&lt;li&gt;Warehouse robotics solution&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📕 Closing Remarks - Ryan Gariepy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ryan Gariepy, CTO Clearpath/OTTO Motors&lt;/li&gt;
&lt;li&gt;1.5 Megatons of CO2 saved by being online&lt;/li&gt;
&lt;li&gt;More participants then ever before (maybe because it's free?)&lt;/li&gt;
&lt;li&gt;Lot of US attendees, but also from around the world&lt;/li&gt;
&lt;li&gt;Many thanks to many sponsors&lt;/li&gt;
&lt;li&gt;Roberta Friedman - Founder and CFO of Open Robotics, is retiring&lt;/li&gt;
&lt;li&gt;Videos should be up by weekend&lt;/li&gt;
&lt;li&gt;Survey coming soon&lt;/li&gt;
&lt;li&gt;ROSCon 2021 October 19th-24th, in New Orleans&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚡ Lightning Talks 4
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Webots Robot Simulator

&lt;ul&gt;
&lt;li&gt;Lots of premade robots to simulate&lt;/li&gt;
&lt;li&gt;Graphical Editor&lt;/li&gt;
&lt;li&gt;ROSin support&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Weekly Robotics

&lt;ul&gt;
&lt;li&gt;Mat Sadowski does a great job with this weekly newsletter! Big fan of this guy's work. Check it out &lt;a href="https://weeklyrobotics.com/"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Technaid S.L.

&lt;ul&gt;
&lt;li&gt;H3 Exoskeleton&lt;/li&gt;
&lt;li&gt;A ROS compatible exoskeleton? Neat!&lt;/li&gt;
&lt;li&gt;Definitely makes security seem really important&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ROS Industrial

&lt;ul&gt;
&lt;li&gt;Ben Greenberg&lt;/li&gt;
&lt;li&gt;ROS is intimidating for newbies - fair&lt;/li&gt;
&lt;li&gt;Web-based tools for less technical users&lt;/li&gt;
&lt;li&gt;3D viewer&lt;/li&gt;
&lt;li&gt;WebVis interface and terminal emulator&lt;/li&gt;
&lt;li&gt;Mobile Friendly&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ROS for Robot Swarms

&lt;ul&gt;
&lt;li&gt;Phd Candidate(?) showing off swarm collaboration&lt;/li&gt;
&lt;li&gt;Swarm Mapping&lt;/li&gt;
&lt;li&gt;Swarm monitoring&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Greenzie

&lt;ul&gt;
&lt;li&gt;Selfie cam, bold move&lt;/li&gt;
&lt;li&gt;Lawn maintenance robots&lt;/li&gt;
&lt;li&gt;Adapt electric lawn mowers to "Autostriping"&lt;/li&gt;
&lt;li&gt;Lots of familiar tools and tech on here&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ROS for Autonomous Maritime Systems

&lt;ul&gt;
&lt;li&gt;UL Lafayette Engineering&lt;/li&gt;
&lt;li&gt;The C.R.A.W. Lab - Outstanding pun.&lt;/li&gt;
&lt;li&gt;Look at that boat go.&lt;/li&gt;
&lt;li&gt;RoboBoat! Big fan.&lt;/li&gt;
&lt;li&gt;Even smaller RoboBoat!&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;MoveIt

&lt;ul&gt;
&lt;li&gt;Throwback to Omron's presentation from the MoveIt talk.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Nobleo

&lt;ul&gt;
&lt;li&gt;Is that Sylvan Esso? No, just a similar bass line&lt;/li&gt;
&lt;li&gt;Autonomous Pallet Jacks (Terrifying, to anyone who's ever taken one to the ankle before).&lt;/li&gt;
&lt;li&gt;More Digital Twins&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>robotics</category>
      <category>ros</category>
      <category>notes</category>
    </item>
    <item>
      <title>A (Belated) Hello World!</title>
      <dc:creator>Ryan D. Lewis</dc:creator>
      <pubDate>Wed, 24 Jun 2020 02:39:02 +0000</pubDate>
      <link>https://dev.to/luckierdodge/a-belated-hello-world-mjl</link>
      <guid>https://dev.to/luckierdodge/a-belated-hello-world-mjl</guid>
      <description>&lt;h1&gt;
  
  
  👋 Hey Everyone!
&lt;/h1&gt;

&lt;p&gt;My name is Ryan D. Lewis, and I'm...not exactly new around here, but this is my first post! So allow me to introduce myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Education
&lt;/h2&gt;

&lt;p&gt;I'm currently a Master's Candidate in Computer Science, with a B.S. in Computer Science and Computational Mathematics, looking to eventually earn a PhD.&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Work
&lt;/h2&gt;

&lt;p&gt;As an undergrad, I got a good bit of experience in software/web development and IT through internships and on-campus work, and research through undergraduate research programs at my school. I liked the latter so much, I ended up committing to grad school, and have since gotten some invaluable experience working at a National Laboratory's Leadership Computing Facility.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎷 Fun Facts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I'm a hobby 3D printer enthusiast&lt;/li&gt;
&lt;li&gt;I'm the President and lead programmer of my school's Mars Rover Team&lt;/li&gt;
&lt;li&gt;I've been playing the saxophone for almost 10 years now 🎵&lt;/li&gt;
&lt;li&gt;I got into programming reading a book (or more aptly, perhaps, a tome of ancient wisdom) from my Dad's collection called &lt;em&gt;Introduction to Programming&lt;/em&gt; when I was in middle school. It covered QBASIC, Pascal, C, and, if memory serves, one of the dBase languages. (Though I read the book cover-to-cover, C is the only one I've actually written code in, and that wasn't until I got to college.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ❓ Why Now?
&lt;/h1&gt;

&lt;p&gt;It might seem a bit silly for me to be writing a &lt;code&gt;Hello World&lt;/code&gt; style post now, given that I've been lurking on &lt;strong&gt;Dev&lt;/strong&gt; for over 2 years at this point. But in that time, I've:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Written 0 posts&lt;/li&gt;
&lt;li&gt;Written 0 comments&lt;/li&gt;
&lt;li&gt;Added a bunch of stuff to my Reading List (some of which I've actually read!)&lt;/li&gt;
&lt;li&gt;Dropped a ❤️ and 🦄 here and there&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And I feel like this platform deserves a little more engagement on my part! So why the sudden change from lurker to poster? Well, 3 reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;We've all got to start somewhere, and now seems as good a time as any.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More seriously, I think I've reached the point in my career journey where I'm comfortable with sharing my thoughts and contributing my perspective to the general discourse. I've spent a lot of my time in the last 5 years mentoring younger students at my university, and it's something that I really enjoy, so I'd like to expand that to a broader audience and community.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I've intended to write posts and contribute to the conversation before, on a number of topics, but a combination of a busy schedule and a lack of confidence in the value of what I had to say led me to abandon the effort each time. My theory is, just putting something out there saying "Here's me, and here's the things I'm gonna talk about moving forward" should help keep me a little more accountable.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  ✅ Making Plans
&lt;/h1&gt;

&lt;p&gt;Speaking of accountability, there's a couple things that I want to post about in the near future—little side projects or things I find interesting enough to talk about. I'm hoping to post about once every 2 weeks, but we'll see if that plan survives contact with the proverbial enemy.&lt;/p&gt;

&lt;p&gt;In no particular order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚧 &lt;strong&gt;Overhauling my Personal Website&lt;/strong&gt; 🚧: I've been rocking a &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; site, running on &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;, for a couple years now. It's been...fine, mostly, but I've found getting Jekyll up and running in a stable way to be rather tedious on Windows, so I'm thinking of switching it up. Plus, I've been meaning to migrate to a self-hosted solution, so this might be a good opportunity to kill 2 birds with one stone, and learn a new Static Site Generator while I'm at it.&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Anki Cozmo and ROS&lt;/strong&gt; 🤖: I recently acquired a used &lt;a href="https://www.anki.com/en-us/cozmo.html"&gt;Anki Cozmo&lt;/a&gt;, a tiny, adorable social robot released way back in 2016. Unfortunately, the company behind it is going out of business (not uncommon in the robotics business), but the robot itself is still functional and the app and SDK for it are still available, at least for now. The SDK means we can integrate it with the &lt;a href="https://www.ros.org"&gt;Robotic Operating System&lt;/a&gt;, so I'm hoping to use it come fall to teach new members of my University's Mars Rover Team about how to develop for ROS.&lt;/li&gt;
&lt;li&gt;🐘 &lt;strong&gt;Adventures in the &lt;a href="https://fediverse.party/"&gt;Fediverse&lt;/a&gt;&lt;/strong&gt; 🐘: I've been aware of Federated Social Networks like &lt;a href="https://joinmastodon.org/"&gt;Mastodon&lt;/a&gt; for a while now, but up until recently, I'd never really felt the impetus to join one. A recent reddit thread got me thinking about the state of the "Fediverse", so I thought I'd explore and report back on my findings.&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;A Case for Web Monetization&lt;/strong&gt; 💰: &lt;a href="https://webmonetization.org/"&gt;Web Monetization&lt;/a&gt; is something I'm really intrigued by. I think it has the potential to cause a huge shift in the incentive structure of the Web. I'd love to get some thoughts on paper and see if I can reason my way through it.&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Learning Rust/TypeScript/WebAssembly&lt;/strong&gt; 📚: We'll see if I actually decide to write anything for these, but if nothing else, I've been meaning to dig into all 3 of these languages on my own (and several others, honestly), but haven't yet found the time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  In Conclusion
&lt;/h1&gt;

&lt;p&gt;If you've made it this far, thanks for playing along! As a reward, here's a picture of my roommate's kitten sitting on my 3D Printer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AYpy5Eg8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x43z7fpsjj6khwx52pzd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AYpy5Eg8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x43z7fpsjj6khwx52pzd.jpg" alt="Kitten on a 3D Printer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Long story short: Hello World! I'm hoping to spend some more time hanging out here and adding my thoughts to the community. Feel free to leave a comment and say hello, ask a question, or recommend your favorite Static Site Generator/hosting solution for personal sites!&lt;/p&gt;

&lt;p&gt;Take care, folks 👋.&lt;/p&gt;

</description>
      <category>introduction</category>
      <category>helloworld</category>
    </item>
  </channel>
</rss>
