# restricting range of motion with complex constraints

I am looking for a way to restrict a robot's range of motion, using complex constraints such as not tearing of a cable attached to the robot.

Take an articulated 6-axis robot arm as shown below, with attached cable (red), fixed at points X (before axis A4) and Y (after axis A6).

The cable will limit the range of movement for the robot. It can stretch and bend only to some extend, but something like a full 360° turn of axis A4, with all other axes remaining as they are in the picture, will tie the cable around the arm and rip it off.
If joint A5 is at 0°, then A4 and A6 can still move the full 360°, but they cannot diverge too much from each other, as that would twist the cable. If A5 is tilted, the relationship becomes even more complicated.

How can you express such a constraint?

It is not a simple joint constraint, where you can independently limit the range of the joints, and it is also not a positional constraint, where you can define a region the robot must not enter. Checking a start and a goal posture is not sufficient, since along the path from start to goal posture there may still be a posture that puts too much strain on the cable.

Without limiting the robot to a small set of pre-tested paths, how can you limit the robot to movements that will not rip off the cable?

What are the standard techniques used for this sort of problem?

• Rather than trying to model this, you may be better off routing your cable such that it passes through each axis of rotation, that way as long as you have enough slack for each axis individually, you will have enough slack for any combination of axes. Alternatively, check that you can't get higher grade cable which is more flexible, or even replace a monolithic inflexible cable with a set of more flexible (possibly even coiled) cables. – Mark Booth Nov 12 '12 at 13:13
• I did a similar simulation using SolidWorks: youtube.com/watch?v=crJXUlzJ918 – LCarvalho Feb 19 '18 at 20:04

I'm not sure what the "standard techniques" are but here are a few a ideas.

You could combine a standard jacobian based forward kinematics as your base and then apply a gradient search algorithm where you bias against things such as running out of slack on your wires or other constraints.

Let me go into a bit more detail. Generally you would just give the robotic arm an end point or perhaps a series of way points you expect the end effector to follow. You can then use the forward kinematics to move the end effector between those waypoints. In order to avoid your difficult to describe constraint you can define a value function that increases as the arm moves and reduces the slack on the wire.

If you guess a path most likely your initial guess will result in the wire being snapped. You're value function will give you a score representing this fact. You can then take your in between waypoints and tweak them a bit which may result in the function represetnging your constraint to decrease. You then can tweak it a bit more reducing it further.

This is called optimization and it is a huge field but the most basic method is Gradient Descent. In theory if you use an optimization method to adjust your waypoints eventually you will find a set of waypoints that keeps the tension along the wire to a minimum. The main issue with optimization is that you can run into local minimums that don't adequately solve your problem, and methods that get around local minimums can be slow.

If you are looking to get academic about it you may want to look into the algorithm presented here. Keep in mind there might not be a simple answer to your question or a simple algorithm to solve it.

The cable has a certain amount of slack, and each joint it goes over takes up some of that slack as a function of the joint angle. The cable will break if the total amount of slack taken up by all joints exceeds the available slack.

Firstly, it would help if you could thread the cable along the robot in such a way that that each joint has a calculable effect on the slack, and each joint affects the cable independently. This will really help the calculations. Let's define the amount of slack taken up by joint 1 at an angle th1 by:

f1(th1)


Now, your robot arm can move anywhere such that

f1(th1) + f2(th2) + ... + f6(th6) <= total_slack


This assumes that the cable is fixed in such a way that it can slide up and down the robot arm, distributing the slack where it's needed. Generally, this isn't the case in most robots, and isn't easy to do.

A more reliable way to solve this problem is to rigidly fix the cable before and after each joint, and make sure there's enough slack for every joint.

Don't fix it in software. Fix it in your mechanical cable harness design. If you try to do it in software, your robot will inevitably break itself. Even if it never exceeds its limits, using a cable this way will wear it out quickly.

Trying to share the slack between joints will require sliding movement of the cable, which will damage the cable over time by abrasion and by repeatedly bending the cable around tight radii when you get close to overall limits. Sharing the slack means you'll have to attach the cable loosely, which will make it tend to flop around, encouraging you to leave even less slack.

Instead, fix the cable along each segment of the robot and treat each joint individually. Ensure that the cable bend radius is greater than 10X its diameter (more is better) over the entire range of motion of each joint. If this requires a large loop, then there are chain cable guides (looks a bit like wide plastic bicycle chain) to help keep it from getting in the way of other parts.

• Sorry Theran, but this answer doesn't actually answer the question, which is why I kept my similar suggestion as a comment. – Mark Booth Nov 15 '12 at 0:33