Hitachi-LG LDS Lidar icon Hitachi-LG LDS Lidar Hitachi-LG LDS 360-degree LiDAR driver streaming scans into ARC NMS for obstacle detection, SLAM use, Arduino hookup, config options and variables. Try it →
Asked

Inverse Kinematics Guidance For Cybot3000

I have a question regarding the use of the Inverse Kinematics robot skill in Synthiam ARC. I've managed to create the general arm configuration based on the initial instructions, but I would like to know if there is a comprehensive video tutorial available, along with more detailed instructions on using this skill effectively.

For my setup, which is for the Cybot3000, I have both arms mounted in a downward position on each shoulder. Each arm consists of five servos using EZ-Robot HDD servos and grippers. I've configured them as follows:

  • Right Arm:

    • v4 = Shoulder
    • v5 = Arm
    • v6 = Elbow
    • v7 = Wrist
    • v8 = Gripper
  • Left Arm:

    • v11 = Shoulder
    • v12 = Arm
    • v13 = Elbow
    • v14 = Wrist
    • v15 = Gripper

Any guidance on using Inverse Kinematics with this configuration would be greatly appreciated.



Related Hardware (view all EZB hardware)
EZ-B V4 by EZ-Robot
EZ-B v4/2 robot controller: dual Cortex ARM, Wi-Fi, audio/video, 24 servo/digital ports, I2C/UART, camera and Synthiam ARC control for custom robots
Wi-Fi / USB
Servos 24
Camera
Audio
UART 3
I2C
ADC 8
Digital 24

Related Robot Skills (view all robot skills)
Camera Device by Synthiam
Use PC or robot cameras for vision tracking: color, QR, glyph, face, object, motion; record video/data, control servos and movement, run scripts
Control robot arms with inverse and forward kinematics, converting X/Y/Z positions into joint motion and reporting end-effector location.

ARC Pro

Upgrade to ARC Pro

Join the ARC Pro community and gain access to a wealth of resources and support, ensuring your robot's success.

Author Avatar
PRO
Canada
Twitter YouTube GitHub
#1  

Thanks - good details. Below is a focused, practical guide for using the Inverse Kinematics (IK) Arm robot skill with your Cybot3000 shouldermounted arms (5 servos each). I also include configuration/checklist items, testing steps, sample JavaScript scripts you can paste into ARC, and follow-up questions so I can give more targeted help.

Helpful links

Quick summary for your hardware

  • EZ-B v4 (EZB Firmware) - EZB index should be 0 for the IK skill unless you have multiple EZBs.
  • Right arm virtual servo ports: v4 (shoulder), v5 (arm), v6 (elbow), v7 (wrist), v8 (gripper).
  • Left arm virtual servo ports: v11..v15 (same order).
  • Each arm is mounted downward on shoulders (this affects joint type/orientation and offsets).

Stepbystep configuration checklist (recommended order)

  1. Add two instances of the IK skill (one per arm).

    • Project Add robot skill search "Inverse Kinematic Arm".
    • Rename the skill instances to something clear (e.g., "IK Right Arm" and "IK Left Arm").
  2. Open skill settings (kebab/hamburger menu - top right of the robot skill window).

    • Use the three-line hamburger to open Configuration.
  3. Create joints in correct mechanical order (base end effector).

    • Add joints in order: Shoulder, Arm, Elbow, Wrist, EndEffector(Gripper).
    • For each joint entry:
      • Set the servo port to the virtual port (v4, v5, etc.). Note: when entering servo constants in scripts you must NOT put them in quotes (i.e. Servo.setPosition(v8, 260)) - same in the config dialogs use the port selector.
      • Set EZB Index to 0 if your EZB is the primary board.
      • Choose Joint Type:
        • Shoulder: Rotation (revolute) if it rotates the whole arm side-to-side.
        • Arm / Elbow / Wrist: Lever (prismatic-style lifting) - the skill calls them Lever/Rotation; use Lever for joints that lift the arm up/down.
      • Length (mm): measure center-to-center of the joint shafts (this is critical for correct IK).
      • Offset (mm): if joint pivot is offset horizontally relative to previous joint.
      • Servo Range & servo Offset (degrees): set realistic min/max travel and physical mounting offsets. Use Invert checkbox if the servo moves opposite to expected.
      • Save each joint.
  4. Configure workspace limits (Range Limits for X/Y/Z) to safely constrain the arm and avoid collisions.

  5. Test and calibrate joint parameters:

    • With servos powered and EZB connected, manually move each servo in the skill UI or using a simple servo control to set comfortable MIN/CENTER/MAX positions.
    • Use the Forward Kinematics display in the IK skill: move servos and watch X/Y/Z displayed. This verifies lengths/offsets alignment.
  6. Home/Initialization:

    • Create an INIT script or a startup script that moves the arm to a known, safe pose at startup (see example below).
    • Don’t rely on assumed positions - always initialize by moving to a safe known pose.
  7. Fine tune:

    • Adjust lengths/offsets and servo offsets until the FK display corresponds to the physical pose.
    • Tune gripper open/close servo positions so gripping does not strain the servo.

Important notes about mounting / mirroring (shoulder on each side)

  • Left arm will be mirrored relative to the right arm. Options:
    • Configure the Left arm skill instance with appropriate servo offsets and/or check Invert for appropriate joints.
    • If a joint physically faces the opposite direction, set servo Offset (deg) or Invert checkbox - better to use offsets for precise mapping.
  • The IK solver treats X/Y/Z in the skill’s coordinate system. If you want both arms to use the same coordinate frame but mirrored, adjust offsets or transform the X value in your scripts (e.g., x -> -x for mirrored side).

Testing procedure (safe order)

  1. Test servos individually with the Vertical/Horizontal servo skill to confirm wiring/port mapping.
  2. With IK skill open and configuration saved, slowly move each joint from the skill UI while watching FK X/Y/Z.
  3. Move the whole arm to a few simple positions with ControlCommand(... "MoveTo" ...) and verify real-world position.
  4. If the arm binds, press PANIC to release servos, correct configuration, then re-test.

Example JavaScript snippets

  • Important: use print() (not console.log()) if you want to log in ARC script panels.
  1. Move an IK skill instance to a Cartesian position (assumes you named the skill "IK Right Arm"):
// Move the right arm end effector to X=10cm, Y=8cm, Z=15cm
ControlCommand("IK Right Arm", "MoveTo", 10, 8, 15);
print("Requested IK Right Arm MoveTo 10,8,15");
  1. Open / close the gripper servo (virtual port v8 for right gripper):
// Open gripper (example position)
Servo.setPosition(v8, 260); // don't put v8 in quotes
sleep(800);
// Close gripper (example)
Servo.setPosition(v8, 190);
  1. Homing both arms at startup (example assumes skill names "IK Right Arm" and "IK Left Arm"):
// Example startup: open grippers, then move arms to safe pose
Servo.setPosition(v8, 260); // right gripper open
Servo.setPosition(v15, 260); // left gripper open
sleep(1000);

// Move both arms to a safe home position (X,Y,Z in cm)
ControlCommand("IK Right Arm", "MoveTo", 10, 10, 12);
ControlCommand("IK Left Arm",  "MoveTo", -10, 10, 12);
sleep(2000);
print("Homing complete");
  1. Camera IK pick example (adapted from the manual). This assumes camera variables $CameraObjectX, $CameraObjectY, $CameraObjectWidth are being set by the Camera Device, and your skill instance is named "IK Right Arm":
// Example: open gripper then move to mapped camera coordinates (Right arm)
Servo.setPosition(v8, 260); // open right gripper
sleep(800);

// map camera pixel coords to CM - adjust ranges for your camera distance/setup
var x = Utility.map(getVar("$CameraObjectX"), 0, 320, -20, 20);
var y = Utility.map(getVar("$CameraObjectY"), 0, 240, 35, 5);
var z = Utility.map(getVar("$CameraObjectWidth"), 40, 100, 20, 30);

// Move the arm (Y is height; modify as needed)
ControlCommand("IK Right Arm", "MoveTo", x, y, z);
sleep(1500);

// Close gripper
Servo.setPosition(v8, 190);

Calibration tips & common pitfalls

  • Lengths (mm) and joint center-to-center measurements are the most critical values for valid IK. Use calipers for accuracy.
  • If FK shows weird behavior when you manually move servos, your joint order, lengths, offsets, or joint types are incorrect.
  • Tune servo ranges so the skill won’t command travel past physical stops.
  • Virtual servo ports (v4, v5, etc.) are constants - use them without quotes in scripts.
  • If the arm jumps to extreme pose when using MoveTo, stop, use Panic, check joint min/max, and re-check mount orientation/offsets.
  • If speed/acceleration available, use small speeds during testing.
  • Always test within the workspace limits you set to avoid collisions with the torso/head.

Video tutorial availability

  • There isn’t a single official stepbystep video that covers every IK configuration variant (arm geometry and mounts vary widely). The support page includes screenshots and examples. The written Inverse Kinematics support article (link above) plus the Camera/Servo docs are the best resources. If you want, I can create a focused step list or Example Project for your exact Cybot3000 setup that you can import into ARC.

A few questions so I can help further (pick the ones you can answer)

  1. Did you add two separate IK skill instances (one per arm), or did you try to configure both arms inside a single skill instance?
  2. For each joint, did you set the joint Type as Rotation or Lever? If not sure, tell me the physical motion axis for each joint (shoulder: rotates left/right? arm: lifts up/down?).
  3. Have you measured and entered the joint lengths in mm (center-to-center)? If not, I can list how to measure each joint for accuracy.
  4. Do you want example homing coordinates and initialization script tuned for Cybot3000 (I can create one if you confirm approximate shoulder mounting offsets and typical arm reach)?
  5. Are you using a camera for pick-and-place, or do you just want manual MoveTo and preset poses now?

Next steps I can provide

  • A tailored init/home script for both arms.
  • A camera-to-IK pick-and-place example tuned to your Cybot3000 (need camera position / mounting height).
  • Help debugging a specific bad behavior (send me the exact symptom: FK numbers behaving oddly, servos moving wrong direction, MoveTo failing, etc.)

Would you like me to produce a ready-to-import Example Project with two IK skill instances and a startup script for Cybot3000? If yes, tell me:

  • the exact skill names you used (or I’ll use "IK Right Arm" and "IK Left Arm"),
  • approximate shoulder mounting X offset in mm (distance from robot center to shoulder), and
  • how far forward the arm should reach (approx reach in cm).

I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
#2  

I could not try any of the above script examples. When I go and paste them into JavaScript script window, ARC comes back saying these are created in Blocky. What is that?

#3  

A message with a meaning like that does not exist in the software, due to the inability to "paste blockly". Providing either a screenshot of the pop-up or the exact message is necessary to properly assist. Posting a screenshot is the easiest way to convey the error, so the phrasing of the exact message is clear.

Provide a screenshot and we'll be able to get you up and running:)

#4  

Fixed that issue. Found that my default editor was set for Blocky. I usually set it for ezscript. I tried a quick test,and was able to paste a file into a javascript from above.

#5   — Edited

I just tried to run this test script from above to see what happens.....

// Move the right arm end effector to X=10cm, Y=8cm, Z=15cm
ControlCommand("IK Right Arm", "MoveTo", 10, 8, 15);
print("Requested IK Right Arm MoveTo 10,8,15");

This is what I got as an error.....why?

Start
Execution Error Line 2 Col 0 -  ControlCommand Error for 'IK Right Arm' sending 'MoveTo'. 'ControlCommand' with parameter MoveTo, 10,8,15 is not supported for this control (IK Right Arm)
Done (00:00:00.0231139)

Am I missing something important make this run?

Author Avatar
PRO
Canada
Twitter YouTube GitHub
#6  

Thanks - good info. The error means ARC does not recognize the MoveTo ControlCommand for the specific skill instance name you used. That usually happens for one of these reasons:

  • The control name string you passed doesn't exactly match the robot skill window title (including spaces/case).
  • You renamed the skill to something else and that instance doesn’t expose a MoveTo command.
  • The IK skill window isn’t running/active, or you added a different skill that doesn’t provide MoveTo.
  • Your script editor was still set to Blocky/EZ-Script when you pasted (you fixed this earlier, but re-check).

Do these quick checks and fixes (step-by-step)

  1. Verify the exact skill name
  • Open the IK skill window (the small control window).
  • Read the exact title in the title bar. Copy that name. Use that exact string in ControlCommand. Example: if the title is "Inverse Kinematics Arm" use that, not "IK Right Arm" unless the title actually reads "IK Right Arm".
  1. Confirm the MoveTo command is supported (use the Cheat Sheet)
  • In the script editor (JavaScript mode), right-click ControlCommand (or use the Cheat Sheet) choose the IK skill from the list.
  • The Cheat Sheet will show the exact available control commands for that skill. If MoveTo is listed, select it to auto-insert the exact syntax. If it’s not listed, the skill instance does not provide MoveTo.
  1. If MoveTo is missing
  • You probably opened a different robot skill window (or the skill was renamed to something else). Remove and re-add the official Inverse Kinematic Arm skill (Project Add robot skill Inverse Kinematic Arm), then rename its title to what you want. Use that exact title in scripts.
  • Make sure the skill window is running (visible) in the ARC project.
  1. Example correct JavaScript (ensure the skill title matches exactly)
// Example using the default skill name
ControlCommand("Inverse Kinematics Arm", "MoveTo", 10, 8, 15);
print("Requested IK MoveTo 10,8,15");

or, if your skill title really is "IK Right Arm":

ControlCommand("IK Right Arm", "MoveTo", 10, 8, 15);
print("Requested IK Right Arm MoveTo 10,8,15");
  1. Use the Cheat Sheet to avoid typos
  • Right-click in the editor ControlCommand pick your control pick "MoveTo" the arguments will be inserted correctly.

If you still see the same error, please do one of the following (fastest to debug):

  • Paste the exact skill title as shown in the IK window title bar.
  • Paste a screenshot of the Cheat Sheet showing the list of commands for that skill (or tell me whether MoveTo appears in that list).
  • Paste the exact error text (you already provided one - helpful) and tell me the skill title you used in ControlCommand.

Once I can see the skill name or whether MoveTo appears in the Cheat Sheet, I’ll give the exact fix (or provide an alternate ControlCommand name if the skill version uses a different command).Would you like me to walk you through opening the Cheat Sheet and inserting the command step-by-step?


I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
#7  

Ok,something is not right here. My test skill is titled "IK Right Arm". Is there yet another skill I am to create to put that in?

In the actual Inverse Kinematic Arm skill, there is nothing but the main configuration that says joints and settings, above that File, and a picture of the arm i created with joint info. In the main window it shows x,y,z cordinates. This skill is very confusing to me,thats why someone needs to create a detailed video on how use this exactly.

Author Avatar
PRO
Canada
Twitter YouTube GitHub
#8  

Good - you’re close. The error means ARC couldn’t find a ControlCommand named MoveTo for the control string you passed. That almost always comes down to one of three things:

  • The control (skill) name you used in ControlCommand() does not exactly match the control’s registered Title.
  • You added a different skill (or a copy) that does not expose MoveTo.
  • The skill isn’t actually running or the configuration Title was edited in a way that changed the registered control name.

Here’s a clear checklist and exact steps to find/fix it, plus a quick test script.

  1. Confirm the exact control (skill) name ARC expects
  • Open the Inverse Kinematic Arm control window in ARC (the small skill window that shows joints and X/Y/Z).
  • Click the kebab (three horizontal lines) on the top-right of the skill window Choose Configuration (or Advanced) locate the Title field. This Title is the exact string you must use in ControlCommand().
  • If Title is blank or a default, fill it with the name you want (for example IK Right Arm). Save the config (File Save or OK).

Note: the top of the skill window may show a slightly different text while the settings dialog is open; the Title in the Advanced/Configuration settings is the authoritative name used by ControlCommand().

  1. Verify MoveTo is supported for that control (use the Cheat Sheet)
  • Open any JavaScript script editor in ARC (Project Scripts Add Script JavaScript).
  • Click the Cheat Sheet (or the ControlCommand helper) in the editor. Select the control name you just verified from the list. The Cheat Sheet will list all supported ControlCommand names for that skill (MoveTo should appear).
  • If MoveTo is NOT listed, you don’t actually have the Inverse Kinematic Arm skill instance that supports MoveTo. Remove and re-add the built-in Inverse Kinematic Arm skill: Project Add robot skill search "Inverse Kinematic Arm" Add. Then set its Title and configuration.
  1. Make sure the control is running / enabled
  • Some skills have start/stop or an enabled state. Ensure the IK skill instance is active and visible in your project (not disabled). If it has a small play/stop button, start it.
  1. Paste and run this minimal test (use exact Title from step 1)
  • Replace "IK Right Arm" with the exact Title string you confirmed in the skill configuration:
ControlCommand("IK Right Arm", "MoveTo", 10, 8, 15);
print("Requested IK Right Arm MoveTo 10,8,15");

Important script tips:

  • Use print() for logging.
  • Use the exact skill Title string (case, spaces, punctuation all matter).
  • Virtual servo constants (v4, v5, etc.) should NOT be quoted in scripts if you use Servo.* functions.
  1. If you still get the same error Please provide one of the following (fastest for me to diagnose):
  • A screenshot of the IK skill window title bar and the Configuration Advanced Title field (so I can see the exact registered name).
  • A screenshot of the Cheat Sheet list of commands for your IK skill (so I can confirm whether MoveTo is actually available).
  • Or paste the exact Title value you used and the exact error message.

Extra help I can provide

  • I can create an example ARC project (two IK skill instances named "IK Right Arm" & "IK Left Arm") with a startup/home script you can import. Tell me if you want that and confirm the Title strings to use.
  • If you paste the screenshots I asked for I’ll give the exact fix step-by-step.

Useful link

Which would you like to do next - paste a screenshot of your IK skill title/Advanced Title field, or shall I build a ready-to-import Example Project for your Cybot3000?


I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.