Hi, I’m Håvard Karlsen Solheim, a Mechatronics Master student at the University of Agder. Together with Aleksander Watson, and under the supervision of Ajit Jha and Muhammad Faisal Aftab, I’ve spent this semester working on a CARM project — building a robot arm that can see, understand, and pick up small electronic components entirely on its own.

About Me
Robotics wasn’t where I started. Electronics and programming came first, and I was tinkering with both before university. Studying mechatronics is what gradually turned that into an interest in robots. Machine vision is the part that really caught me: a machine taking in raw pixels and building up enough of a picture of its surroundings to act on it. I’ll admit a lot of my satisfaction comes from the frustrating part. Something doesn’t work, and it doesn’t work for a reason you can’t see, and you sit with it until you can. Then it works, and it keeps working. What I like most is the moment where code stops being abstract and actually makes something move in the real world. That’s a big part of why the vision and motion side of this project pulled me in.
My Work at CARM
My main responsibility was the vision and motion side of the system: getting our UFACTORY xArm6 robot arm to reliably see the workspace, work out where things actually are, and move there without colliding with anything.
We used an Intel RealSense D435i depth camera, mounted above the robot on a support built from aluminium extrusion and 3D-printed mounts so it stays in a fixed position relative to the robot base. The hardest part was working out exactly how the camera’s view lines up with the robot’s own coordinate system, a step called hand-eye calibration. The existing ROS2 tools for detecting our calibration marker didn’t behave the way we needed, so I ended up writing a small custom ROS2 node that finds the marker in the camera image and publishes its pose. That let us complete the calibration using the Tsai–Lenz method: moving the robot through a series of positions while the camera watched a marker mounted on the gripper, and solving for the transformation between the two.
Once the camera and the robot “agreed” on where things were in the world, I moved on to motion planning using MoveIt. This is what lets the robot plan a safe path to a detected capacitor, resistor, or transformer without crashing into the board or the components sitting right next to it. I built collision boxes around each detected component, so the robot is allowed to touch the one it’s grasping but not its neighbours. If a planned move would cause a collision, the robot simply refuses and reports back, instead of blindly attempting it.

Reflections
Getting ROS2, the RealSense drivers, and the xArm control stack to all work together turned out to be the biggest challenge of all. Keeping them working together was harder still. Small version mismatches would break things in ways that took hours to track down. It taught me a lot about how tightly these systems depend on one another, and how much value there is in understanding why something breaks, rather than just patching it and moving on.
Looking Ahead
There’s still more to build. A point-cloud-based collision system and a full digital twin of the robot in Gazebo are both things we started but didn’t have time to finish. I’d like to pick those up if I get the chance to keep working on this.