<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Matthew Shields</title>
    <link>https://mshields.name/</link>
    <description>Recent content on Matthew Shields</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-GB</language>
    <copyright>© 2022 - 2026 Matthew Shields</copyright>
    <lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mshields.name/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ROS 2 Camera Calibration</title>
      <link>https://mshields.name/blog/2026-06-03-ros-2-camera-calibration/</link>
      <pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2026-06-03-ros-2-camera-calibration/</guid>
      <description>Preamble – The Why Underlying many perception tasks is the need to express the pose of one coordinate frame relative to another and to compose such poses along kinematic and sensing chains. This allows us to take transform sensor obeservations from the reference frame of a sensing element. This is useful.
A rigid-body pose can be represented by a homogeneous transformation matrix, see here for more on that. \[\begin{equation} \mathbf{T}^{A}_{B} = \begin{bmatrix} \mathbf{R}^{A}_{B} &amp;amp; \mathbf{t}^{A}_{B} \\ \mathbf{0}^{\top} &amp;amp; 1 \end{bmatrix} \in SE(3), \qquad \mathbf{R}^{A}_{B} \in SO(3),\ \ \mathbf{t}^{A}_{B} \in \mathbb{R}^{3}, \label{eq:se3} \end{equation}\] Where \(\mathbf{R}^{A}_{B}\) is a \(3\times3\) rotation matrix belonging to the special orthogonal group \(SO(3)\) and \(\mathbf{t}^{A}_{B}\) is a translation vector.</description>
    </item>
    
    <item>
      <title>Setting Up Raspberry Pi Camera on Ubuntu 20.04 64 bit for Raspberry Pi 4</title>
      <link>https://mshields.name/blog/2024-01-20-setting-up-rapberry-pi-camera-on-ubuntu-20-04-64-bit-for-raspberry-pi-4/</link>
      <pubDate>Sat, 20 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2024-01-20-setting-up-rapberry-pi-camera-on-ubuntu-20-04-64-bit-for-raspberry-pi-4/</guid>
      <description>Preamble This was a pig for no good reason, so hopefully someone else doesn’t have to go through the same pain I did.
For clarity I was using a Raspberry Pi 4 running Ubuntu 20.04 64 bit with a Pi Zero camera connected using an adapter ribbon cable. Ensure everything is properly connected before starting.
 How To Edit your /boot/firmware/config.txt, adding the following…  start_x=1 gpu_mem=512 disable_camera_led=1 start_file=start_4x.elf fixup_file=fixup_4x.</description>
    </item>
    
    <item>
      <title>Setting Up CUDA 11.8 and Pytorch on Ubuntu 20.04 with Secure Boot Enabled</title>
      <link>https://mshields.name/blog/2024-01-20-setting-up-cuda-11-8-and-pytorch-on-ubuntu-20-04-with-secure-boot-enabled/</link>
      <pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2024-01-20-setting-up-cuda-11-8-and-pytorch-on-ubuntu-20-04-with-secure-boot-enabled/</guid>
      <description>Preamble I recently got a fresh daily drive laptop which happens to have secure boot enabled. Typically this has added yet more complication to getting setup with CUDA and PyTorch. Hopefully the following reference can help someone else out or even just me if I need it again in the future.
 How To 1. Purge system of NVIDIA CUDA in case of a previous failed install sudo rm -r /var/lib/dkms/nvidia sudo rm /etc/apt/sources.</description>
    </item>
    
    <item>
      <title>Using tmux to Manage a Fleet of Robots</title>
      <link>https://mshields.name/blog/2023-09-04-using-tmux-to-manage-a-fleet-of-robots/</link>
      <pubDate>Sun, 03 Sep 2023 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2023-09-04-using-tmux-to-manage-a-fleet-of-robots/</guid>
      <description>Preamble The title of this post ought to be “Using tmux to Manage a Fleet of Robots Incorrectly”. When I say manage here, I am talking about system configuration, code deployment and systems administration type tasks. Long term you really should be utilising tools like Ansible, Docker and Airbotics to keep your fleets Linux systems running as you intend. However, in reality it is often needed to do some quick maintenance operation to many Linux systems (or robots) at once even in the early days of a robotics startup when you might have a small fleet and maybe not yet settled on a setup using one of the aforementioned “proper” tools.</description>
    </item>
    
    <item>
      <title>PREEMPT RT Install for Ubuntu 20.04</title>
      <link>https://mshields.name/blog/2023-08-30-preempt-rt-install-for-ubuntu-20-04/</link>
      <pubDate>Tue, 29 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2023-08-30-preempt-rt-install-for-ubuntu-20-04/</guid>
      <description>Preamble I have recently been working with robotic systems that have a greater requirement for deterministic operation. While Ubuntu will likely never be an RTOS the PREEMPT RT patch does allow for soft real-time constraints on specified threads which can be enough of a step up for many research applications.
While there are other guides on how to do this online (some linked below) this post will present as a record for the steps I needed to follow recently for my system.</description>
    </item>
    
    <item>
      <title>Using Chrony to Synchronise System Clocks for Robotic Platforms</title>
      <link>https://mshields.name/blog/2023-08-30-using-chrony-to-synchronise-system-clocks-for-robotic-platforms/</link>
      <pubDate>Tue, 29 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2023-08-30-using-chrony-to-synchronise-system-clocks-for-robotic-platforms/</guid>
      <description>Preamble If you are utilising multiple Ubuntu systems in your robotic deployment it can be advantageous to have the system clocks synchronised. This is a fairly common occurrence with engineers looking to utilise the distributed nature of ROS and other middleware. If you are interested in this you might also be interested in my previous post on sharing internet connections over a LAN.
 Requirements For this you’ll need at least two separate Ubuntu systems connected to each other over a LAN, VPN or similar.</description>
    </item>
    
    <item>
      <title>Network Manager Useful Commands</title>
      <link>https://mshields.name/blog/2023-08-11-network-manager-useful-commands/</link>
      <pubDate>Fri, 11 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2023-08-11-network-manager-useful-commands/</guid>
      <description>Preamble Some Basics Establishing Connections with Static IPs  Identify Network Interface Names Auto Connect Adding an IP Route Multiple IP Addresses Sharing an Internet Connection  Hey you!  Found this useful or interesting? Any question, comments, corrections or suggestions?    Preamble Network Manager is great and is an unsung hero of our modern world.
 Some Basics See which connections you have already setup…</description>
    </item>
    
    <item>
      <title>A GNSS Primer for Roboticists</title>
      <link>https://mshields.name/blog/2023-01-17-gnss-and-rtk-primer-for-roboticists/</link>
      <pubDate>Wed, 15 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2023-01-17-gnss-and-rtk-primer-for-roboticists/</guid>
      <description>Preamble Constellations How it Works Real Time Kinematic (RTK) Solutions  Accuracy, Precision and Repeatability Absolute Geographic Accuracy vs. Other Forms of Accuracy Accuracy Metrics Resolution An Intentionally Brief Word on Geodetic Models and Datums  Solution Types Standard Positioning Service Differential GNSS RTK Float RTK Integer Free Satellite Based Augementation Services (SBAS) - WAAS/ EGNOS/ MSAS/ GAGAN Paid For Satellite Based Correction Services - Omnistar, Terrastar  Sources of GNSS Errors Atmospheric and Ionospheric Space Segment Error Multipath Reflections  Other Considerations Antenna Selection Ground Planes Electromagnetic Interference (EMI) and Carrier to Noise Ratio (CNR) Communication Layer for Corrections  Resources and Further Reading Hey you!</description>
    </item>
    
    <item>
      <title>ROS Python Package Template</title>
      <link>https://mshields.name/blog/2023-01-17-ros-pytho-package-template/</link>
      <pubDate>Tue, 17 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2023-01-17-ros-pytho-package-template/</guid>
      <description> After spending some time using the C++ ROS package template from Legged Robotics I decided to take a stab at a Pythonic version for prototyping packages in ROS 1.
Check it out, or don’t, I’m easy really.
Hey you! Found this useful or interesting? Consider donating to support.
  Any question, comments, corrections or suggestions? Reach out on the social links below through the buttons.
  </description>
    </item>
    
    <item>
      <title>UK Climate Change</title>
      <link>https://mshields.name/blog/2022-06-10-uk-climate-change/</link>
      <pubDate>Fri, 10 Jun 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-06-10-uk-climate-change/</guid>
      <description>Preamble I found this on NASA’s climate site and my curiosity was piqued.
Temperature anomaly, how did they get to that?
Anomaly versus what?
Surely, it’s against where the temperature should be, but how do you know where the temperature should be?
What effects do you account for and what do you leave out?
I thought I’d have a stab at how they came up with these numbers, but I wanted to do it for UK data, specifically.</description>
    </item>
    
    <item>
      <title>Setting Up A Georeferenced RTK Base Station</title>
      <link>https://mshields.name/blog/2022-05-01-setting-up-a-georeferenced-rtk-base-station/</link>
      <pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-05-01-setting-up-a-georeferenced-rtk-base-station/</guid>
      <description>Preamble In my previous post I detailed how to use RINEX data to create a sub-decimeter level position solution. Using RINEX data in this way from government sources ties you to an agreed upon reference datum. With your own base station this can be problematic as the accuracy of the established position of the station will likely not be geographically accurate. This then leads to repeatable rover solutions but they will have some offset versus many other georeferrenced data sets, eg.</description>
    </item>
    
    <item>
      <title>Ground Vehicle Centre of Mass Optimisation</title>
      <link>https://mshields.name/blog/2022-04-16-ground-vehicle-centre-of-mass-optimisation/</link>
      <pubDate>Sat, 16 Apr 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-04-16-ground-vehicle-centre-of-mass-optimisation/</guid>
      <description>Preamble In a previous post on Weight Distribution in Mobile Ground Vehicles I provided a model for determining the forces able to be generated by a ground vehicle, which ultimately will be a limiting factor in performance. I also provided a method for establishing the centre of mass location of a ground vehicle, providing that you have one to start with.
If you are at an earlier stage in design you may not have a ground vehicle to analyse and want to get a good estimate for the centre of mass location prior to manufacturing your first prototype.</description>
    </item>
    
    <item>
      <title>Weight Distribution in Mobile Ground Vehicles</title>
      <link>https://mshields.name/blog/2022-03-10-weight-distribution-in-prototype-mobile-robots-for-outdoor-use/</link>
      <pubDate>Sun, 03 Apr 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-10-weight-distribution-in-prototype-mobile-robots-for-outdoor-use/</guid>
      <description>Preamble A ground vehicle’s motion is generally only ever limited by one of two things, torque or friction. There are many ways to try and maximise both of these. This post will look to address friction by considering the normal forces at the contact patches between the wheels and the ground.
When designing a mobile ground vehicle, weight distribution is one area that can be optimised fairly freely to provide large benefits.</description>
    </item>
    
    <item>
      <title>Registration Methods Comparison</title>
      <link>https://mshields.name/blog/2022-03-10-registration-methods-comparison/</link>
      <pubDate>Thu, 24 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-10-registration-methods-comparison/</guid>
      <description>Preamble Registration is the technique of aligning two data sets by finding either a rigid or affine transformation, depending on the problem. In robotics this is often between two pointclouds but the technique can be useful for aligning any data sets especially those that contain spatial data, MRI scan images for example. The Wikipedia page for this topic is quite concise and well written.
 Background Typically we represent transformations in 3D space as a matrix and translation vector that we apply to an input vector of coordinates to produce a transformed output vector of shifted coordinates.</description>
    </item>
    
    <item>
      <title>Sharing Python Code as Modules Between ROS Packages</title>
      <link>https://mshields.name/blog/2022-03-10-sharing-python-code-as-modules-between-ros-packages/</link>
      <pubDate>Wed, 23 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-10-sharing-python-code-as-modules-between-ros-packages/</guid>
      <description>Preamble We can wrap our code in Python modules within our catkin work space to share with other packages in our ROS environment. Why would we do this? It can be great for code re-usability and wrapping commonly used functions and classes. This can dramatically cut down on repetition of code across your ROS packages.
 How To I’m going to start with a fresh catkin work space but feel free to adapt to suit your environment, package naming and file naming conventions.</description>
    </item>
    
    <item>
      <title>Running ROS Nodes on Boot</title>
      <link>https://mshields.name/blog/2022-03-16-running-ros-nodes-on-boot/</link>
      <pubDate>Wed, 16 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-16-running-ros-nodes-on-boot/</guid>
      <description>Preamble This is a reworking of a blog post that used to be on the Rover Robotics blog, which they have since taken down - sad face.
We often want our robots to be ready to use at the point of power on. We don’t want to be having to call every ROS launch in our stack every time we want to run our robot. Even if you combine all your ROS launch files into one ROS launch to rule them all the following guide will be useful to get you to a more polished robotic product, instead of a development tool.</description>
    </item>
    
    <item>
      <title>Connecting to a ROS Master Over a VPN</title>
      <link>https://mshields.name/blog/2022-03-12-connecting-ros-master-over-vpn/</link>
      <pubDate>Sat, 12 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-12-connecting-ros-master-over-vpn/</guid>
      <description>Preamble This is a nice build on from my previous post on creating a VPN server. If you are using ROS and a VPN server it is possible to remotely connect to the ROS master on one of your robots from either another robot or other device. Basically the only requirement is that both systems are clients on the VPN and can run ROS. It also helps if you have provisioned each system with a static IP address, again details are in my previous post on creating a VPN server.</description>
    </item>
    
    <item>
      <title>Best of Picard Tips</title>
      <link>https://mshields.name/blog/2022-03-10-picard-management-tips/</link>
      <pubDate>Fri, 11 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-10-picard-management-tips/</guid>
      <description>Preamble Jean-Luc Picard was undoubtedly an altruistic leader, and he has kept on sharing his wisdom through his automated tip providing Twitter account. This post is a list of some of my favourites so far.
 The Tweets Making Change Picard management tip: Initiate positive changes. If not you, who? — Picard Tips (@PicardTips) October 25, 2021    Deadlines Picard management tip: Don&#39;t negotiate absurd schedules with engineers.</description>
    </item>
    
    <item>
      <title>Custom SSH Banner on Login</title>
      <link>https://mshields.name/blog/2022-03-10-custom-ssh-banner-on-login/</link>
      <pubDate>Thu, 10 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-10-custom-ssh-banner-on-login/</guid>
      <description>Preamble When logging into a Linux system over ssh you can greeted with a text banner prior to entering your password. There are a number of reasons you might want to do this.
 adding company branding providing a brief description about how this system is being used providing warnings and reminders to users about access   How To Log into your system over ssh or get local terminal access.</description>
    </item>
    
    <item>
      <title>SD Card Reading and Writing with Linux dd</title>
      <link>https://mshields.name/blog/2022-03-08-sd-card-reading-and-writing-with-linux-dd/</link>
      <pubDate>Tue, 08 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-03-08-sd-card-reading-and-writing-with-linux-dd/</guid>
      <description>Preamble Just a quick post as a personal note for a reminder on how to use the dd command to read and write SD card images. This can be useful when working locally with Raspberry Pi and NVidia Jetson style embedded computers.
 Determine the Device Location We need to determine the path for the SD card we intend to use, whether the operation is reading or writing.
sudo fdisk -l Returns a list of all of the available partitions and drives.</description>
    </item>
    
    <item>
      <title>Remotely Connecting to a U-Blox GNSS Receiver</title>
      <link>https://mshields.name/blog/2022-02-26-remotely-connecting-to-a-ublox-gnss-receiver/</link>
      <pubDate>Mon, 07 Mar 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-02-26-remotely-connecting-to-a-ublox-gnss-receiver/</guid>
      <description>Preamble Being able to deploy over the air updates to your robot’s peripherals is a powerful thing. In the early stages it may also be useful for engineers to be able to connect directly to these devices as if they were connected to their personal computers. Here I’m going to detail one approach for this using ser2net. I’ll use connecting to a U-Blox Z-F9P GNSS receiver as a demonstration use case.</description>
    </item>
    
    <item>
      <title>Extracting Road Markings from Pointcloud Data</title>
      <link>https://mshields.name/blog/2022-02-23-extracting-road-markings-from-pointcloud-data/</link>
      <pubDate>Sat, 26 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-02-23-extracting-road-markings-from-pointcloud-data/</guid>
      <description>Preamble This is the first post in a series looking back at past projects I have done but not shared publicly or documented in any way.
This was a piece of work from 2019 with the goal of extracting road markings from geo-referenced pointclouds. For those that don’t know, a geo-referenced pointcloud is created by taking a LiDAR and putting it on some kind of a rover vehicle, then taking all the observations of the LiDAR that were taken in the moving vehicle reference frame and converting them into the global “static” reference frame.</description>
    </item>
    
    <item>
      <title>Setting Up a Robot LAN with Internet Connection Sharing</title>
      <link>https://mshields.name/blog/2022-02-26-setting-up-a-robot-lan-with-internet-vpn-connection-sharing/</link>
      <pubDate>Sat, 26 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-02-26-setting-up-a-robot-lan-with-internet-vpn-connection-sharing/</guid>
      <description>Preamble It can be common to want to run multiple embedded computers on a robotic system. Having multiple systems on a hard LAN makes sense, to enable low latency communication between them. If the robot can connect to a local WiFi source that provides an internet connection then it can be quite easy for each embedded system to connect to the wireless network also, as most will come with a WiFi card.</description>
    </item>
    
    <item>
      <title>Setting Up an OpenVPN Server on AWS EC2</title>
      <link>https://mshields.name/blog/2022-02-26-setting-up-openvpn-server-on-aws-ec2/</link>
      <pubDate>Sat, 26 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-02-26-setting-up-openvpn-server-on-aws-ec2/</guid>
      <description>Preamble Using This Guide Cloud Compute Setup  Creating an EC2 Instance Selecting an AMI Selecting an Instance Type Security Group Static/ Elastic IP Address  Server Side Setup  Connecting Using SSH Modify the Hostname Installing OpenVPN and Easy RSA Configuring the OpenVPN Server Packet Forwarding and Firewall Setting up the Server Side Keys and Certs  Generating Client Keys  Creating the Unified .ovpn Client File  Client Setup  Connecting Client Side Network Manager Options Alternatives  Assigning Clients a Static IP Server Maintenance Operations  Useful Commands Issuing Additional Clients the Easy Way Revoking a Client  Resources and Further Reading Hey you!</description>
    </item>
    
    <item>
      <title>Operational Considerations for a Robotics as a Service</title>
      <link>https://mshields.name/blog/2022-02-15-reports-from-the-frontline-of-raas/</link>
      <pubDate>Tue, 15 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-02-15-reports-from-the-frontline-of-raas/</guid>
      <description>Preamble Surely whole point of a robotics as a service (RaaS) is to deploy robots and get paid. But there are a lot of considerations that are easy to overlook when making sure you are ready.
The idea for most people who get into this field often looks something like this:
Design a robot Build some of those robots Deploy them … Profit?  But inside those ellipses be dragons.</description>
    </item>
    
    <item>
      <title>Accountability</title>
      <link>https://mshields.name/blog/2022-02-13-accountability/</link>
      <pubDate>Sun, 13 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/blog/2022-02-13-accountability/</guid>
      <description>Preamble I have had a very taxing twelve years.
I’ve finally come to a point where I feel like I can look back and say I have attained many of the goals I set for myself previously. However, this is somewhat melancholic as I am starting to feel too comfortable with life.
And that’s why I’m starting a blog, as a cure for the complacency that can come from sitting on top of your previous achievements and feeling smug.</description>
    </item>
    
    <item>
      <title>Contract Work</title>
      <link>https://mshields.name/contract-work/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/contract-work/</guid>
      <description>I offer contract services both on an ad hoc basis as well as part of pre-agreed work packages.
Please get in touch either via email or LinkedIn to arrange a call to discuss options.</description>
    </item>
    
    <item>
      <title>Curriculum Vitae</title>
      <link>https://mshields.name/curriculum-vitae/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://mshields.name/curriculum-vitae/</guid>
      <description>PDF Download
Matthew Shields Pragmatic engineer and leader, having worked across robotics, vehicle dynamics, ADAS, autonomous driving, survey/mapping, defence and aerospace. I am currently working on research into the applications of heterogeneous robots for non-destructive testing and evaluation of aerospace structures.
I have interests in remote sensing, localisation, perception, exploiting robotic platform heterogeneity and multi-robot orchestration.

Employment History Postgraduate Researcher - University of Strathclyde - Centre for Ultrasonic Engineering | Glasgow 2023-Current My PhD work is in exploiting mobile manipulators for non-destructive testing of large-scale high-value aerospace components using eddy current and ultrasound arrays you can find a single page summary over on my PhD project page</description>
    </item>
    
  </channel>
</rss>
