Actuator limits in non-Cartesian machines (cylindrical coordinate system)

Hi all,
I’m building a polar 3D printer and am currently looking for a platform to control it. I’m new to Smoothie and really like the way it works.
Unfortunately I didn’t found an arm solution for the cylindrical coordinate system in the arm_solution folder.

When taking a further look into the source code I found the actuator position is defined in millimetres (actuator_mm).

In the MorganSCARA solution however angular actuator positions are used through the variable actuator_mm.
MorganSCARAsolution.cpp

    actuator_mm[ALPHA_STEPPER] = to_degrees(SCARA_theta);             // Multiply by 180/Pi  -  theta is support arm angle
    actuator_mm[BETA_STEPPER ] = to_degrees(SCARA_theta + SCARA_psi); // Morgan kinematics (dual arm)
    //actuator_mm[BETA_STEPPER ] = to_degrees(SCARA_psi);             // real scara
    actuator_mm[GAMMA_STEPPER] = cartesian_mm[Z_AXIS];                // No inverse kinematics on Z - Position to add bed offset?

If I understand correctly it goes wrong in Robot.ccp where the speed of every path segment is clipped to the maximum actuator speed, again defined in mm(/s).
void Robot::append_milestone( float target[], float rate_mm_s )

    // find actuator position given cartesian position, use actual adjusted target
    arm_solution->cartesian_to_actuator( adj_target, actuator_pos );
</span><span class="hl-comment">// check per-actuator speed limits</span><span class="hl-code">
</span><span class="hl-reserved">for</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-types">int</span><span class="hl-code"> </span><span class="hl-identifier">actuator</span><span class="hl-code"> = </span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-identifier">actuator</span><span class="hl-code"> &lt;= </span><span class="hl-number">2</span><span class="hl-code">; </span><span class="hl-identifier">actuator</span><span class="hl-code">++</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
    </span><span class="hl-types">float</span><span class="hl-code"> </span><span class="hl-identifier">actuator_rate</span><span class="hl-code">  = </span><span class="hl-identifier">fabs</span><span class="hl-brackets">(</span><span class="hl-identifier">actuator_pos</span><span class="hl-brackets">[</span><span class="hl-identifier">actuator</span><span class="hl-brackets">]</span><span class="hl-code"> - </span><span class="hl-identifier">actuators</span><span class="hl-brackets">[</span><span class="hl-identifier">actuator</span><span class="hl-brackets">]</span><span class="hl-code">-&gt;</span><span class="hl-identifier">last_milestone_mm</span><span class="hl-brackets">)</span><span class="hl-code"> * </span><span class="hl-identifier">rate_mm_s</span><span class="hl-code"> / </span><span class="hl-identifier">millimeters_of_travel</span><span class="hl-code">;

    </span><span class="hl-reserved">if</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-identifier">actuator_rate</span><span class="hl-code"> &gt; </span><span class="hl-identifier">actuators</span><span class="hl-brackets">[</span><span class="hl-identifier">actuator</span><span class="hl-brackets">]</span><span class="hl-code">-&gt;</span><span class="hl-identifier">max_rate</span><span class="hl-brackets">)</span><span class="hl-code">
        </span><span class="hl-identifier">rate_mm_s</span><span class="hl-code"> *= </span><span class="hl-brackets">(</span><span class="hl-identifier">actuators</span><span class="hl-brackets">[</span><span class="hl-identifier">actuator</span><span class="hl-brackets">]</span><span class="hl-code">-&gt;</span><span class="hl-identifier">max_rate</span><span class="hl-code"> / </span><span class="hl-identifier">actuator_rate</span><span class="hl-brackets">)</span><span class="hl-code">;
</span><span class="hl-brackets">}</span>

In a cylindrical coordinate system the actuator driving the angle

α

will be limited to a maximum rotational speed

αt(r)

, which is a linear function of r, the radius vector length from origin to tool.

Shouldn’t the actuator speed clipping in Robot.cpp be solution depended?
Has anyone considered implementing this?

According to the smoothieware front page Smoothie is “Designed to support non-Cartesian machines”, is it?

Imported from wikidot