Question

I have a field filled with obstacles, I know where they are located, and I know the robot's position. Using a path-finding algorithm, I calculate a path for the robot to follow.

Now my problem is, I am guiding the robot from grid to grid but this creates a not-so-smooth motion. I start at A, turn the nose to point B, move straight until I reach point B, rinse and repeat until the final point is reached.

So my question is: What kind of techniques are used for navigating in such an environment so that I get a smooth motion?

The robot has two wheels and two motors. I change the direction of the motor by turning the motors in reverse.

EDIT: I can vary the speed of the motors basically the robot is an arduino plus ardumoto, I can supply values between 0-255 to the motors on either direction.

Was it helpful?

Solution

You need feedback linearization for a differentially driven robot. This document explains it in Section 2.2. I've included relevant portions below:

The simulated robot required for the project is a differential drive robot with a bounded velocity. Since the differential drive robots are nonholonomic, the students are encouraged to use feedback linearization to convert the kinematic control output from their algorithms to control the differential drive robots. The transformation follows:

Transformation

where v, ω, x, y are the linear, angular, and kinematic velocities. L is an offset length proportional to the wheel base dimension of the robot.

OTHER TIPS

One control algorithm I've had pretty good results with is pure pursuit. Basically, the robot attempts to move to a point along the path a fixed distance ahead of the robot. So as the robot moves along the path, the look ahead point also advances. The algorithm compensates for non-holonomic constraints by modeling possible paths as arcs.

Larger look ahead distances will create smoother movement. However, larger look ahead distances will cause the robot to cut corners, which may collide with obstacles. You can fix this problem by implementing ideas from a reactive control algorithm called Vector Field Histogram (VFH). VFH basically pushes the robot away from close walls. While this normally uses a range finding sensor of some sort, you can extrapolate the relative locations of the obstacles since you know the robot pose and the obstacle locations.

My initial thoughts on this(I'm at work so can't spend too much time):

It depends how tight you want or need your corners to be (which would depend on how much distance your path finder gives you from the obstacles)

Given the width of the robot you can calculate the turning radius given the speeds for each wheel. Assuming you want to go as fast as possible and that skidding isn't an issue, you will always keep the outside wheel at 255 and reduce the inside wheel down to the speed that gives you the required turning radius.

Given the angle for any particular turn on your path and the turning radius that you will use, you can work out the distance from that node where you will slow down the inside wheel.

An optimization approach is a very general way to handle this.

Use your calculated path as input to a generic non-linear optimization algorithm (your choice!) with a cost function made up of closeness of the answer trajectory to the input trajectory as well as adherence to non-holonomic constraints, and any other constraints you want to enforce (e.g. staying away from the obstacles). The optimization algorithm can also be initialised with a trajectory constructed from the original trajectory.

Marc Toussaint's robotics course notes are a good source for this type of approach. See in particular lecture 7: http://userpage.fu-berlin.de/mtoussai/teaching/10-robotics/

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top