Brooks’s Status Report 04/04/2026

This week, I made sure UWB locationing was working correctly and worked on setting up the anchor boards to automatically boot up as anchors. I also finished connecting UWB coordinate calculations to ROS, so now we have a complete range, trilaterate, publish flow that Adrian was able to connect to the UI. Lastly, I moved our project to using PlatformIO with Arduino as the framework. This gives us a number of QOL improvements, e.g. we can now use the rich libraries provided by Arduino and have PlatformIO handle dependencies for us. Unfortunately, there was a lot of work time that ended up getting eaten up resolving some strange UART behavior that was occurring when trying to send and receive CLI messages. This means I was unable to complete the survivor tag locationing.

Since I am now behind on survivor tag locationing, my plan is to spend the rest of tonight and tomorrow writing the pseudocode and initial implementation. I say “initial” implementation because this step, as well as implementing “on-the-fly” anchor calibration somewhat requires that we have a physical bot built. I intend on writing an implementation that essentially has the controller tell the UWB board to attempt ranging with a tag, and then separate those ranging requests and responses from the others with the anchors, however I anticipate needing to modify this code once we can test with a moving bot looking for the tag. Once I finish this, I will see if I can help Josh finish building the first bot and work on implementing Kalman filtering to fuse our IMU and UWB data to improve locationing accuracy. Essentially, I will keep working on survivor tag locationing, kalman filtering, and on the fly anchor calibration next week, but the first and last task won’t be able to be considered “finished” until we are able to verify with a real bot, although I will do as much as possible until then.

Adrian’s Status Report 04/04/2026

This week, I was able to complete the IMU and UWB integrations with the UI by publishing the corresponding ROS topics (/catombot/imu/heading_rad and /catombot/position) to the UI’s live ROS bridge with the micro-ROS agent docker container running. This closes the loop from multi-anchor ranging to something an operator can interpret in real time, which was the main integration milestone.

The remaining issue is the quality of the pose, not whether it appears on the screen. Raw UWB fixes are noisy as the bot’s positions appear jittery on the UI, so the next steps would be to have sensor fusion properly implemented. For UWB + IMU fusion, the IMU will be used for acceleration, which is integrated into position while letting UWB correct drift and anchor the global position. This can be done with a Kalman filter that can sooth UWB updates and uses IMU between fixes so the displayed pose and mapping see less high-frequency noise. 

UI displays the x, y, z coordinates of the bot/UWB’s location with respect to the 3 UWB anchors surrounding it.

The UI records and properly updates the bot’s position based on the latest coordinate recorded by the UWB. It does, however, vibrate despite the UWB being stationary. Hence, sensor fusion with Kalman filtering is needed.