Vertically moving robot


Hi Taylor and community,

I am a robotics and ML engineer. I somehow landed on this forum after watching Taylor’s video Starting a Business in Silicon Valley: A Personal Story. There are interesting discussions on the making a rover and the VESC. This seems like the right place to have discussions on interesting robotics problems. I have been thinking about a problem and I wanted some help with it. I am not sure if this is the right place to ask. Forgive me if this isn’t.

I want to build a 4WD robot that can travel vertically by pushing against opposite rails. The wheels push against the rails and generate friction, the robot moves upwards as the wheels rotate. This is the side view that I am thinking of:


If one side moves faster than the other then the robot would loose grip and fall down. I have to ensure that the wheels on both sides rotate at the exact same speed. How to maintain the same speed on both sides?


You could do it with encoders of course as an open-loop solution. But if you know you’re moving perfectly vertically, consider using an accelerometer to sense (gravitational) orientation. If the robot starts to tilt, the high side can just slow/stop until the robot is level again.


As a complete amateur I’m wondering why not a gyroscope rather than an accelerometer?

I assume the idea is to keep the wheels planar.


Can you explain how a gyroscope would serve the purpose in this case? I am an amateur in this field as well.


Rather than trying to answer your question sufficiently let me instead offer you these:

A paper about a robot that uses a gyroscope and some of the challenges from 3 years ago:
Self-calibration of a differential wheeled robot using only a gyroscope and a distance sensor

This does a pretty good job of providing answers to our questions:
What is a gyroscope in robotics and how does it help the robot maintain balance


An accelerometer and gyro (IMU - inertial measurement unit) would work. That’s how a quadrotor controller keeps the chassis parallel with the ground during flight. However there’s no good way to know when you are stopped or slowly moving with just an IMU.

Rover keeps wheel velocity in sync a different way. There is an encoder on each wheel. The raspberry pi decides what the wheel velocity should be, and issues a command to the motor to start rotating. The motor controller then sends encoder data to the raspberry pi, and a software control loop on the raspberry pi decides if the motor should go faster or slower. This repeats at about 1khz. This ensures the motors drive precisely the same velocity.

That would work nicely if there was no slip, but it may not be a better option than an IMU. If there is slip, you need an IMU anyway. You just need a scheme for positioning the robot if desired.

You could also directly measure the angle between the wall and the chassis using a potentiometer on a pivot that leads to a small wheel riding on the wall. That scheme could be used in lieu of an IMU.


Just to add on to this thread… the initial problem specified 4WD for the vertical climb. This makes, as you would want to control rolling in both X and Y axes (lets define vertical as the Z-axis here).

I agree with Taylor that an IMU is insufficient for stopped or slow-moving conditions.

If you were to use Taylor’s suggested method of potentiometer on a pivot, then you would need 4 sets of them, one for each wheel. Geometric calcs/computation based on position of potentiometer versus each wheel, will allow you to derive the magnitude of compensation required by each individual wheel. Remember, the axis of rotation when slipping could be any straight line in the X-Y plane… without factoring in z-axis translational motion yet


Very good suggestions here. Thank you very much.

I came across a video of a robot doing what I desire to do. Have a look at this video (click on the image. Redirects to YouTube):

This system restricts the movement of the robot in X-Y plane by having something like a guide rail for each wheel. So with such a system I think having just 2 motors would suffice. Using either an IMU or the potentiometer on a pivot (as suggested by @taylor) along with encoders on the 2 motors would do the job IMO. What do you think?