I searched a lot about blender's Inverse Kinematics API, but I'm really confused right now.
So the goal of my project is to control a robot arm that has 4 degrees of freedom. So far, I managed to model a rig in blender, that has the same characteristics as the arm I'd like to control (see example below). I also successfully added Inverse Kinematics constraints to make it easier to draw shapes in the air (as you can guess by the screenshot).
Now the goal here is, in order to control this arm, I need to export the animation data as a CSV file, where each line contains data from one frame; and each column contains the angles of the joint in local space.
This is the code I have so far, since as a start I wanted to try some debugging of the values I might export later.
import bpy
from math import degrees
class SimpleBoneAnglesPanel(bpy.types.Panel):
bl_label = "Bone Angles"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
def draw(self, context):
arm = context.scene.objects['Armature']
self.drawInfo(arm,"Base")
self.drawInfo(arm,"Shoulder")
self.drawInfo(arm,"Elbow")
self.drawInfo(arm,"Wrist vertical")
def drawInfo(self,armature,boneName):
bone = armature.pose.bones[boneName]
mat = bone.matrix.to_euler()
self.layout.label(text=boneName)
box = self.layout.box()
box.label(text=f'X: {degrees(mat.x):.3f}')
box.label(text=f'Y: {degrees(mat.y):.3f}')
box.label(text=f'Z: {degrees(mat.z):.3f}')
Thanks to this code snippet for the inspiration, it really helped !
So far so good, you might think. As shown in the screenshot and in the above code, I can access the individual rotations of each bone on the x, y and z axis.
The problem is that each joint of my robot can only rotate on one axis. And even though the IK constraint seems to work perfectly fine visually, the numbers I get (see Bone Angles panel on the right of the screenshot), they change on Y and Z as the arm is moving. I need the rotation on Z axis for each of the joints (except for the base it's Y).
So my question is, how can I get the local rotation of each pose bone? It looks like the API has changed, and matrix_local doesn't exist anymore. Thank you for taking the time to read and maybe help me out, I hope I was clear and concise enough.