<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://brennandrake-github-io.pages.dev/feed.xml" rel="self" type="application/atom+xml" /><link href="https://brennandrake-github-io.pages.dev/" rel="alternate" type="text/html" /><updated>2026-09-29T08:40:01+00:00</updated><id>https://brennandrake-github-io.pages.dev/feed.xml</id><title type="html">Brennan Drake Portfolio</title><subtitle>Portfolio and Blog</subtitle><entry><title type="html">Project Goals V1.2</title><link href="https://brennandrake-github-io.pages.dev/Project_Goals_V1.2.html" rel="alternate" type="text/html" title="Project Goals V1.2" /><published>2026-09-28T00:00:00+00:00</published><updated>2026-09-28T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/Project_Goals_V1.2</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/Project_Goals_V1.2.html"><![CDATA[<h2 id="current-project-goals">Current Project Goals</h2>

<ol>
  <li><strong>[ COMPLETED ] Develop waypoint path, topic messages, and rosbag saving system</strong>
    <ul>
      <li>Out-and-back Nav2 route with bay stops, messages for uncertainty, corrections, and recovery state, and one-command trials that save a bag, metadata, and metrics.</li>
    </ul>
  </li>
  <li><strong>[ IN PROGRESS ] Wire tag localization and validate</strong>
    <ul>
      <li>Registration mode saves each tag’s map position and wall; a correction node resets the SLAM pose from trusted tag reads. Works in simulation, still needs testing on the real robot.</li>
    </ul>
  </li>
  <li><strong>[ IN PROGRESS ] Develop recovery behavior after trigger</strong>
    <ul>
      <li>Behavior tree pauses, shifts to the wall, sweeps for a tag, corrects, and resumes. Recovered via tag L07 in simulation; still need to handle the open aisle end (wall_lost) and run on the real robot.</li>
    </ul>
  </li>
  <li><strong>[ IN PROGRESS ] Determine experimental trigger for tag discovery</strong>
    <ul>
      <li>Trigger metric u = SQRT(λmax) with a 15cm threshold in simulation. Still need to calibrate it on real-robot covariance data.</li>
    </ul>
  </li>
  <li><strong>[ FUTURE ] Run A/B testing to compare to previous results</strong>
    <ul>
      <li>Trial tooling is ready; comparison with data in baseline rosbags still to run.</li>
    </ul>
  </li>
</ol>

<p><img src="assets/img/Turtlebot/onshape_turtlebot_formatted.png" alt="Docker cmd line" style="display: block; margin: 0 auto; width:100%; max-width:300px;" /></p>

<!-- more -->
<p><br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[Current Project Goals [ COMPLETED ] Develop waypoint path, topic messages, and rosbag saving system Out-and-back Nav2 route with bay stops, messages for uncertainty, corrections, and recovery state, and one-command trials that save a bag, metadata, and metrics. [ IN PROGRESS ] Wire tag localization and validate Registration mode saves each tag’s map position and wall; a correction node resets the SLAM pose from trusted tag reads. Works in simulation, still needs testing on the real robot. [ IN PROGRESS ] Develop recovery behavior after trigger Behavior tree pauses, shifts to the wall, sweeps for a tag, corrects, and resumes. Recovered via tag L07 in simulation; still need to handle the open aisle end (wall_lost) and run on the real robot. [ IN PROGRESS ] Determine experimental trigger for tag discovery Trigger metric u = SQRT(λmax) with a 15cm threshold in simulation. Still need to calibrate it on real-robot covariance data. [ FUTURE ] Run A/B testing to compare to previous results Trial tooling is ready; comparison with data in baseline rosbags still to run.]]></summary></entry><entry><title type="html">Behavior</title><link href="https://brennandrake-github-io.pages.dev/behavior.html" rel="alternate" type="text/html" title="Behavior" /><published>2026-09-28T00:00:00+00:00</published><updated>2026-09-28T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/behavior</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/behavior.html"><![CDATA[<p><strong>Today’s Summary:</strong><br />
RFID-assisted relocalization: first full run</p>

<p>As of now, I am seeking to tie off my undergrad thesis by approaching this as a system that will seek to relocalize once a threshold of uncertainty has been reached.</p>

<p>Today I implemented RFID tag serialization, to save the locations of tags when detected while mapping. I also added a message and trigger metric for uncertainty ( u = SQRT(λmax) ) which quantifies uncertainty as a distance: one standard deviation of position error along the most uncertain direction (about a 68% chance the true position is within ±u along that axis).</p>

<p>I then simulated a long hallway with tag locations and tested a behavior tree to seek out a tag when u reaches a threshold of 15cm.</p>

<video controls="" preload="metadata" playsinline="" style="display: block; margin: 0 auto; width: 100%; max-width: 800px;">
    <source src="assets/blog/Sep26/behavior.mp4" type="video/mp4" />
</video>

<!-- more -->

<p>In a long, featureless aisle, lidar SLAM gradually loses track of how far along the robot is. I’m fixing that with RFID tags on the walls. When the robot’s position estimate gets uncertain, it pauses its route, moves to the wall, and sweeps along it until it reads a tag whose position it knows. It then resets its position from the tag and continues.</p>

<p>What’s implemented:</p>

<ul>
  <li>Localization: slam_toolbox runs against a saved map and publishes a live uncertainty signal.</li>
  <li>Wall maneuvers: the robot estimates where the aisle walls are and can shift to the right wall, follow it at a fixed distance, and return to the centreline.</li>
  <li>Tag map: a registration mode sweeps the walls and records each tag’s map position, including which wall it’s on.</li>
  <li>Correction: a node resets the SLAM pose from a trusted tag read. It rejects unknown tags, tags on the wrong wall, and implausibly large jumps.</li>
  <li>Navigation: Nav2 drives an out-and-back route with bay stops. After an interruption it resumes at the next stop ahead.</li>
  <li>Recovery: a behaviour tree ties it together: trigger, pause the route, shift to the wall, sweep, correct, settle, return, resume.</li>
  <li>Simulator: a stand-in for the real 60 ft × 5 ft aisle in RViz, with the real robot model, simulated lidar and tag reads, and ground truth for scoring every stop.</li>
  <li>Trial tooling: one command runs a trial and records a bag, a metadata file (code version, container image, config fingerprints), and analysis metrics.</li>
</ul>

<p>What happens in the video:</p>

<p>0:00–2:28: outbound leg with 5 bay stops (~0:31, 0:58, 1:26, 1:55 and 2:27).</p>

<p>~2:29: recovery triggers at the far end and the robot shifts toward the wall. At ~3:02 the attempt fails with wall_lost because the aisle’s far end is open, so the robot aborts safely and resumes.</p>

<p>~3:14: recovery triggers again on the return leg. The robot reaches the wall at ~3:50 and sweeps along it until it reads tag L07 after a 1.1 m sweep. It corrects its pose (~4:16), re-centres, and resumes at the next stop ahead (~4:38).</p>

<p>~5:05 and ~5:34: return-leg bay stops; the recording ends at 5:37, partway home. After the correction, the remaining stops landed noticeably closer to their marks than in the baseline run.</p>

<p><br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[Today’s Summary: RFID-assisted relocalization: first full run As of now, I am seeking to tie off my undergrad thesis by approaching this as a system that will seek to relocalize once a threshold of uncertainty has been reached. Today I implemented RFID tag serialization, to save the locations of tags when detected while mapping. I also added a message and trigger metric for uncertainty ( u = SQRT(λmax) ) which quantifies uncertainty as a distance: one standard deviation of position error along the most uncertain direction (about a 68% chance the true position is within ±u along that axis). I then simulated a long hallway with tag locations and tested a behavior tree to seek out a tag when u reaches a threshold of 15cm.]]></summary></entry><entry><title type="html">Project Goals V1.1</title><link href="https://brennandrake-github-io.pages.dev/Project_Goals_V1.1.html" rel="alternate" type="text/html" title="Project Goals V1.1" /><published>2026-09-20T00:00:00+00:00</published><updated>2026-09-20T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/Project_Goals_V1.1</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/Project_Goals_V1.1.html"><![CDATA[<h2 id="current-project-goals">Current Project Goals</h2>

<ol>
  <li><strong>[ IN PROGRESS ] Develop waypoint path, topic messages, and rosbag saving system</strong>
    <ul>
      <li>Create experimental path, create message types for uncertainty, corrections, and recovery state.</li>
    </ul>
  </li>
  <li><strong>[ IN PROGRESS ] Wire tag localization and validate</strong>
    <ul>
      <li>Extend system to save tag detections as waypoints with detection radius and test covariance minimization</li>
    </ul>
  </li>
  <li><strong>[ FUTURE ] Develop recovery behavior after trigger</strong>
    <ul>
      <li>How does the robot find the tags to recover?</li>
    </ul>
  </li>
  <li><strong>[ FUTURE ] Determine experimental trigger for tag discovery</strong>
    <ul>
      <li>Running in waypoint path, find high and low covariance values to calibrate when recovery should happen</li>
    </ul>
  </li>
  <li><strong>[ FUTURE ] Run A/B testing to compare to previous results</strong>
    <ul>
      <li>Comparison with data in baseline rosbags</li>
    </ul>
  </li>
</ol>

<p><img src="assets/img/Turtlebot/onshape_turtlebot_formatted.png" alt="Docker cmd line" style="display: block; margin: 0 auto; width:100%; max-width:300px;" /></p>

<!-- more -->
<p><br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[Current Project Goals [ IN PROGRESS ] Develop waypoint path, topic messages, and rosbag saving system Create experimental path, create message types for uncertainty, corrections, and recovery state. [ IN PROGRESS ] Wire tag localization and validate Extend system to save tag detections as waypoints with detection radius and test covariance minimization [ FUTURE ] Develop recovery behavior after trigger How does the robot find the tags to recover? [ FUTURE ] Determine experimental trigger for tag discovery Running in waypoint path, find high and low covariance values to calibrate when recovery should happen [ FUTURE ] Run A/B testing to compare to previous results Comparison with data in baseline rosbags]]></summary></entry><entry><title type="html">Landmarks</title><link href="https://brennandrake-github-io.pages.dev/landmarks.html" rel="alternate" type="text/html" title="Landmarks" /><published>2024-11-19T00:00:00+00:00</published><updated>2024-11-19T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/landmarks</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/landmarks.html"><![CDATA[<p><strong>Today’s Summary:</strong><br />
Today I implemented an rfid_landmark node that would publish the transform from the map frame to the PN5180 RFID reader’s frame for rfid detection events. As you can see in the video below, there is a lot of tolerance for that detection, and so the landmark moves with the robot a bit. In addition, you can see that the landmark is preexisting at the beginning of the video but rather than localizing the robot, the detection frame moves itself. This will be addressed soon. Immediate objectives are in the full post.</p>

<div class="video-container" style="max-width: 100%; margin: 0 auto;">
    <video id="Nov19" controls="" style="max-width: 100%; height: auto; display: block;">
        <source src="assets/blog/Nov24/Nov19.mp4" type="video/mp4" style="width:300px" />
    </video>
</div>

<!-- more -->

<p><br /><br />
With that said, the next objectives are to 1. integrate the landmark data into the map saver packager so that the landmark is baked into the saved maps. 2. ensure that the landmarks tied to the map then influence the localization on a new map. 3. allow detection events to contribute to a larger area of detection which will likely be a polygon or sphere enlarged by detection events and used as a whole for localization.</p>

<p><br /><br />
<br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[Today’s Summary: Today I implemented an rfid_landmark node that would publish the transform from the map frame to the PN5180 RFID reader’s frame for rfid detection events. As you can see in the video below, there is a lot of tolerance for that detection, and so the landmark moves with the robot a bit. In addition, you can see that the landmark is preexisting at the beginning of the video but rather than localizing the robot, the detection frame moves itself. This will be addressed soon. Immediate objectives are in the full post.]]></summary></entry><entry><title type="html">Cool Down / Integration</title><link href="https://brennandrake-github-io.pages.dev/cooldown.html" rel="alternate" type="text/html" title="Cool Down / Integration" /><published>2024-11-16T00:00:00+00:00</published><updated>2024-11-16T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/cooldown</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/cooldown.html"><![CDATA[<p><strong>Today’s Summary:</strong><br />
I set up a spare Raspberry Pi 4B+ as a Docker image registry server, configured to run automatically on power-up and accessible over my home Wi-Fi. Additionally, I reinstalled the fan I pilfered from the Pi case I am now using for docker and connected a 12V fan to the buck converter used to power the Arduino. Finally, I integrated my custom RFID publishing package into the turtlebot3_bringup_custom package. This package processes serial data from the RFID assembly and publishes detected IDs to the /rfid topic.</p>

<p><img src="assets/blog/Nov24/cooldown.webp" alt="Docker cmd line" style="display: block; margin: 0 auto; width:100%; max-width:400px;" /></p>

<!-- more -->

<p>Details:</p>

<p>I finally got around to turning a spare pi 4B+ into a docker image registry server. It is now configured to automatically run the registry container on power on and is on my home wifi. I can plug it in and stow it anywhere and access my development images as needed at home.</p>

<p><img src="assets/blog/Nov24/docker.jpg" alt="Docker cmd line" style="display: block; margin: 0 auto; width:100%; max-width:400px;" /></p>

<p>In doing the above, I returned the fan back to the pi case and I installed a small spare 12v fan I had lying around. I tied it’s power into the input terminals for the stepdown converter (stepping 12v from the OPENCR board) down to the 5V of the arduino.<br />
Lastly, today I integrated my custom rfid publishing package into the turtlebot3_bringup_custom package which I had previously containerized. This package translates incoming serial data from the rfid assembly and outputs the detected rfid identity to the /rfid topic for later use.</p>

<p><br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[Today’s Summary: I set up a spare Raspberry Pi 4B+ as a Docker image registry server, configured to run automatically on power-up and accessible over my home Wi-Fi. Additionally, I reinstalled the fan I pilfered from the Pi case I am now using for docker and connected a 12V fan to the buck converter used to power the Arduino. Finally, I integrated my custom RFID publishing package into the turtlebot3_bringup_custom package. This package processes serial data from the RFID assembly and publishes detected IDs to the /rfid topic.]]></summary></entry><entry><title type="html">Containerization</title><link href="https://brennandrake-github-io.pages.dev/Containerization.html" rel="alternate" type="text/html" title="Containerization" /><published>2024-10-27T00:00:00+00:00</published><updated>2024-10-27T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/Containerization</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/Containerization.html"><![CDATA[<p>This past weekend, I was able to transfer all of the basic code on the turtlebot into a docker container. From there I confirmed the ability to access the relevant topics on my desktop pc on the same network (using rviz to visualize my custom urdf) and to teleop the robot as well.</p>

<p>I have also started to do my development inside of a vscode dev container. This allows me to easily contain all of my dependencies and maintain operation regardless of device used. I plan to eventually experiment with using this on a steam deck running linux.</p>

<!-- more -->

<p><br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[This past weekend, I was able to transfer all of the basic code on the turtlebot into a docker container. From there I confirmed the ability to access the relevant topics on my desktop pc on the same network (using rviz to visualize my custom urdf) and to teleop the robot as well. I have also started to do my development inside of a vscode dev container. This allows me to easily contain all of my dependencies and maintain operation regardless of device used. I plan to eventually experiment with using this on a steam deck running linux.]]></summary></entry><entry><title type="html">Project Goals V1.0</title><link href="https://brennandrake-github-io.pages.dev/Project_Goals_V1.0.html" rel="alternate" type="text/html" title="Project Goals V1.0" /><published>2024-10-23T00:00:00+00:00</published><updated>2024-10-23T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/Project_Goals_V1.0</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/Project_Goals_V1.0.html"><![CDATA[<h2 id="current-project-goals">Current Project Goals</h2>

<ol>
  <li><strong>[COMPLETED] Containerize Turtlebot3_bringup and RFID capture code</strong>
    <ul>
      <li>Allow for easier development with docker images saved on server registry</li>
    </ul>
  </li>
  <li><strong>[IN PROGRESS] Containerize rtabmap in VSCode dev container for easier development</strong>
    <ul>
      <li>By doing this, I’ll have a backup image / baseline to work off of.</li>
    </ul>
  </li>
  <li><strong>[COMPLETED] Create node to output RFID detection events as landmarks</strong>
    <ul>
      <li>Tie the RFID tag ID to the location transform from the map frame at the instant of detection</li>
    </ul>
  </li>
  <li><strong>[IN PROGRESS] Integrate RFID detection events into rtabmap as landmarks</strong>
    <ul>
      <li>Save detections with the map and use them for relocalization</li>
    </ul>
  </li>
</ol>

<p><img src="assets/img/Turtlebot/onshape_turtlebot_formatted.png" alt="Docker cmd line" style="display: block; margin: 0 auto; width:100%; max-width:300px;" /></p>

<!-- more -->
<p><br /><br />
<br /></p>
<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[Current Project Goals [COMPLETED] Containerize Turtlebot3_bringup and RFID capture code Allow for easier development with docker images saved on server registry [IN PROGRESS] Containerize rtabmap in VSCode dev container for easier development By doing this, I’ll have a backup image / baseline to work off of. [COMPLETED] Create node to output RFID detection events as landmarks Tie the RFID tag ID to the location transform from the map frame at the instant of detection [IN PROGRESS] Integrate RFID detection events into rtabmap as landmarks Save detections with the map and use them for relocalization]]></summary></entry><entry><title type="html">First Project Update</title><link href="https://brennandrake-github-io.pages.dev/First_Post.html" rel="alternate" type="text/html" title="First Project Update" /><published>2024-10-22T00:00:00+00:00</published><updated>2024-10-22T00:00:00+00:00</updated><id>https://brennandrake-github-io.pages.dev/First_Post</id><content type="html" xml:base="https://brennandrake-github-io.pages.dev/First_Post.html"><![CDATA[<p>I have recently decided to develop a project tracking section for my own personal documentation but also as a cool way to share my work. I will update this periodically with major milestones.</p>

<footer>
    Blog content © Brennan Drake, 2024. Licensed under a 
    <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">CC BY-NC-ND 4.0 License</a>.
</footer>]]></content><author><name></name></author><summary type="html"><![CDATA[I have recently decided to develop a project tracking section for my own personal documentation but also as a cool way to share my work. I will update this periodically with major milestones. Blog content © Brennan Drake, 2024. Licensed under a CC BY-NC-ND 4.0 License.]]></summary></entry></feed>