6-axis robot arm rigging

Hi blenderartist community! I’m trying to rig this 6-axis robot arm for animation where the ikt can follow track a curve. But even after watching many tutorials (which loses applicability half way through because the tutorial models have bones touching each other) I can’t figure it out. The closest I got is shown here:

And I got here following this thread: Proper IK rigging for 6 axis industrial robot

But where I get lost is while trying to lock the axis 5 with lock track as suggested in the thread, I can’t figure out how to connect the axis 4 bone with the ikt without the bones touching each other. I tried using empty but I don’t have a full understanding of how they work since evidently when I try it becomes really strange:

Basically, I’m lost here and I really would appreciate any help I can get!

robot_rig_help_blenderartist.blend (2.6 MB)

Ok after playing with it. I think I figured it out? Will post file later.

1 Like

Ok nevermind. Still struggling.

If it were me, I’d get rid of the empties and whatever else you have in there and just use bones only. However, I’ve never tried rigging an arm this complex with IK, I don’t know blender will react.

Sorry, just noticed the .blend file attached to first post, lemme looksy…

Randy

Sure. So this is how far I got: everything seems to work in producing the result that I want but axis 5 has a slight error where the robot parts collide very slightly.
robotrig.blend (2.7 MB)

Please refer to this file as it’s been updated considerably. The previous one only has a sketch of the rig in place, but without the parenting to the mesh.

I looked at the first file, discarded all rig, looked at the second file, same meshes.

I made this. Just eyeballing bone positions, axes, nothing precise.

robot_rig_help_blenderartist1.blend (3.8 MB)

This is where to start. The linked thread is dealing with a specific problem. You haven’t talked about having that problem yet. Start with what’s simple.

You are not going to fix collision with rigging. If you are moving the parts through a position where they collide, there is no reasonable automatic solution. The solution is, don’t move them that way.

Ok, took a look at the file and to get this thing to work full IK, you’ll have to use 2-3 IK chains. TBH it’s been sometime since I’ve looked at those and I’m a bit rusty…

I’ll look at it a bit further later on… Haven’t looked at the other thread you posted a link to.

Your mesh objects have problems, I hope you’re not planning on rendering this because there are some serious issues if you are. Anyway, rendering aside, the bad mesh would make it hard to line up bones correctly and would result in collisions.

Randy

Thank you bandages for the solution! I did actually end up using this on a different file, but I couldn’t figure out how to lock the axis, which it looks like you have working. I re did the rig similar to yours, with each +1 axis parented to their previous. But I still haven’t figure out how you locked the axis_5 to face downwards. It doesn’t appear to be using any bone constraints?

Thank you!

Edit: Oh I figured it out seconds after posting this. Rotation had to be checked to match the ikt. Am I getting this right?

Screenshot 2024-01-09 at 7.17.42 PM

While this is solved, I was wondering while I have the attention, if I could ask for a clue as to how to put this IK rig on a track constraint? So as you can see from the screenshot above, it is working on a rail. I was going to do this manually, but if there’s a smart way for this thing to detect distance and begin to move? Perhaps I can figure it out on my own, but it would be greatly helpful to get some clue because this is a new territory for me!

Yes, I’m not using any constraints other than IK, and in general, you shouldn’t combine constraints and IK-- they don’t interact the way people at first intuit.

The rotation of the final bone, to match that of the ik target, is enforced just by enabling rotation.

Move the root bone. The IK chain will inherit its location.

Don’t know what you’re talking about. Distance to what? Begin to move where?


I was thinking that maybe there’s a way to limit the distance of the ikt so that once its distance from the root is deemed too far it would move along the track? Maybe this is the wrong question to ask. Maybe this is something to be done manually.

Oh, you want to include movement along the track in the IK? Like this:

New bone to represent the track, increase chain length by 1 to include that bone, that new bone is locked in all axes and has stretch enabled.

Not sure I’d recommend it though, as there’s more than one way to solve the system.

Thank you! Although when I tried it the IK stretch appears disabled?

Edit: Ah I had to link the IK… silly

Edit2: Actually I don’t think I understood it correctly. The track bone now just stretches but does not affect the location of the armature, or the root. I have set up the track parented to root and increased the chain length to 1 on the axis_6 bone IK constraint, but not the IK constraint on the track bone.

You can parent that bone to the root and move the root, you can parent it to something else and move that something else, or you can transform that bone directly.

Realistically, the orientation of the track doesn’t change, and it doesn’t scale, so I’d recommend the first or second options; the parent of the scaling bone should also be the parent of the track object.

The chain length should be increased by 1, to 7, to incorporate the scaling bone into the chain. There is no other constraint-- the single IK constraint affects all relevant bones.

robot_rig_help_blenderartist2.blend (3.8 MB)

This worked perfectly… thank you so much bandages!!

1 Like

Hi bandages… I’m back again. I come with you with another issue!

So it was working just fine until the arm had to do a 180 degree rotation(?)
Now it’s clipping the ground it’s meant to stay above…I imagine that I have to do something with bone constraint and limit rotation in the IK but I’m not sure what I’m doing wrong as it doesn’t work intuitively…

Below are two cases where it’s working just fine.


and because the bones are rotating in Y axis, it doesn’t appear to be possible to show the limit angle, unlike for X and Z axis…

Edit: actually after searching in that previous forum I think I am able to get a satisfying result with stiffness on the axis 2 and 3? But still very much open to learn if you have any suggestions. The manufacturer also specifies the motion range as 540 on certain axis but I’m not sure how one would replicate this in blender given that min and max are limited to total of 360…

Like I said, you’re not going to solve collision with rigging. The solution to collision is to pose it like that.

If you provided a file with the transform that you don’t like, I could maybe give some advice. For example, if the issue is that it can’t move far enough along the track:

then you could consider giving it more track to work with, by changing the origin of the stretch bone:

Otherwise, you can change the solution that it prefers by rotating some bones in pose mode (and, probably, keyframing that rotation):

Switching the bones to Eulers and transform locking all but Y makes this easier.

I wouldn’t recommend angle limits on any bones. If the limits become relevant, you’re already flirting with discontinuous interpolation. However, if you want to, it really doesn’t matter which direction these bones point. You can rotate them 90 degrees and lock a different axis instead.

Motion range of the physical device doesn’t much matter, unless it’s less than 360 degrees, and you want to use IK angle limits. But, still, those limits will probably end up causing discontinuities if just used blindly, and their main use will be as a warning that you need to be doing some manual posing.

So after posting this question I think I was able to get around it like you suggest here to pose it like that. So I have been just scrubbing back and forth to detect funky poses and fixing it by moving the ikt so that the transition between frames are smooth.

The stiffness on axis worked wonders as well!