underactuated arm modeling

Discussion in 'Modeling' started by elementli, Nov 26, 2017.

  1. How to model an robotic arm like this?

    I have a big arm link and a forearm link, and in between is an underactuated joint as shown in the picture.


    [​IMG]


    I learned that use tendon and equality could solve this kind of underactuated modeling. But I'm having trouble getting the structure right.

    Code:
    <worldbody>
        <body name="bigarm_link" pos="0.04 0 0.05">
            <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
            <!-- <joint name="bigarm_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-1.48353 1.48353" /> -->
            <geom size="0.02 0.02 0.065" pos="0 0 0.065" type="box" rgba="1 1 1 1" />
            <joint name="arm_link_end" type="hinge" pos="0 0 0.6" axis="0 1 0"/>
            <joint name="arm_link_body" type="hinge" pos="0 0 0.6" axis="1 0 0"/>
            <body name="under_link" pos="0 0 0.13">
                <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
                <joint name="under_joint" pos="0 0 0" axis="0 1 0" limited="true" range="0.785 2.356" />
                <geom size="0.02 0.01" pos="0 0 0.01" type="cylinder" rgba="0.5 0.5 0 1" />
                <body name="under_lower_link" pos="0 0 0.02">
                    <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
                    <joint name="under_lower_joint" pos="0 0 0" axis="0 1 0" limited="true" range="0.785 2.356" />
                    <geom size="0.02 0.01" pos="0 0 0.01" type="cylinder" rgba="0.5 0.5 0 1" />
                    <body name="under_upper_link" pos="0 0 0.02">
                    </body>
                </body>
            </body>
            <body name="elbow_link" pos="0 0 0.13">
                <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
                <joint name="elbow_joint" pos="0 0 0" axis="0 1 0" limited="true" range="0.785 2.356" />
                <geom size="0.02 0.01" pos="0 0 0.01" type="cylinder" rgba="0.5 0.5 0 1" />
                <body name="forearm_link" pos="0 0 0.02">
                    <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
                    <joint name="forearm_joint" pos="0 0 0" axis="0 0 1" limited="true" range="-2.094 2.094" />
                    <geom size="0.0125 0.0125 0.08" pos="0 0 0.08" type="box" rgba="1 1 1 1" />
                    <body name="hand_link" pos="0 0 0.16">
                        <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
                        <joint name="hand_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-1.594 1.594" />
                        <geom size="0.01 0.005 0.015" pos="0 0 0.015" type="box" rgba="0.8 0 0 1" />
                        <body name="endeffector" pos="0 0 0.03">
                            <inertial pos="0 0 0" quat="0.707107 0.707107 0 0" mass=".1" diaginertia="1 1 0.5" />
                            <joint name="endeff_joint" pos="0 0 0.01" axis="0 0 1" limited="true" range="-2.094 2.094" />
                            <geom size="0.04 0.0025 0.0025" pos="-0.04 0 0.0025" type="box" rgba="1 1 1 1" />
                        </body>
                    </body>
                </body>
            </body>
        </body>
    </worldbody>
    
    <tendon>
        <fixed name="T_index32_cpl" range="0 1">
            <joint joint="under_lower_joint"  coef="0.00705"/>
            <joint joint="under_joint"  coef="-0.00805"/>
        </fixed>
    </tendon>
    
    <equality>
        <tendon name="E_index32_cpl"    tendon1="T_index32_cpl"/>
        <joint name="ring_pinky_cpl" joint1="arm_link_end" joint2="arm_link_body" polycoef="0 0.5 0 0 0"/>
    </equality>
    
     
  2. Emo Todorov

    Emo Todorov Administrator Staff Member

    This is not really under-actuated in the sense of having a null-space where the robot is free to move. You essentially have a single degree of freedom, with a complicated transmission mechanism. If I were you, I would simply model the servo motor as acting directly on the joint and ignore the transmission. If you want to make it more accurate, you could model the two small links of the transmission as a separate kinematic chain, and then define a point equality constraint to connect the transmission mechanism to the large link.
     
    Kyokushin likes this.