This page shows the three ways to get the geometry of a Yaskawa Motoman arm for the offline kinematics of the SDK: the catalog of 169 models, the `ALL.PRM` parameter file of the controller, or your own DH parameters. It also explains the meaning of each parameter.

## DH parameters

`DhParameters` holds the 9 values that change from one 6-axis Yaskawa arm to another. The other values of the Denavit-Hartenberg table are the same for every arm.

![The lengths of a GP7, drawn at zero pulse. A1 to A3 and D4 to D6 are in mm. D5 is 0 on a robot with a spherical wrist.](/yaskawa/documentation/diagrams/kinematics-dh-parameters.svg)

| Parameter | Meaning                                                        | GP7  |
| --------- | -------------------------------------------------------------- | ---- |
| `A1`      | Offset between the S axis and the L axis, along the arm (mm)   | 40   |
| `A2`      | Lower arm: L axis to U axis (mm)                               | 445  |
| `A3`      | Elbow offset: U axis to the forearm axis (mm)                  | 40   |
| `D4`      | Forearm: U axis to the wrist (mm)                              | 440  |
| `D5`      | Wrist offset along the B axis (mm). 0 for a spherical wrist    | 0    |
| `D6`      | Wrist to flange, along the T axis (mm)                         | 80   |
| `Theta2`  | DH angle of the L axis at zero pulse (degrees)                 | -90  |
| `Theta3`  | DH angle of the U axis at zero pulse (degrees)                 | 0    |
| `Theta5`  | DH angle of the B axis at zero pulse (degrees)                 | 0    |

The parameters use the modified DH convention (Craig). `KinematicsCategory` tells which solver is used: `Opw` when `D5` is 0, `J5OffsetWrist` otherwise.

## From the catalog

`ArmKinematicModels` lists 169 models: GP (33), MH (48), ES (14), SP (14), HC (15), HP (7), AR (6), MS (6), PH (5), MotoMINI and others. `FromArmKinematicModel` returns their parameters. `FromArmKinematicModelName` finds a model by its name, and returns `null` when the name is not known.

**C# : KinematicsModels**
```csharp
using UnderAutomation.Yaskawa.Common;
using UnderAutomation.Yaskawa.Kinematics;

public class KinematicsModels
{
    static void Main()
    {
        /**/
        // From the enumeration: 169 models of the catalog
        DhParameters gp7 = DhParameters.FromArmKinematicModel(ArmKinematicModels.GP7);

        // From the name of the model, case ignored. Null if the model is not known.
        DhParameters hc10 = DhParameters.FromArmKinematicModelName("HC10");

        Console.WriteLine(gp7);  // A1=40, A2=445, A3=40, D4=440, D5=0, D6=80...
        Console.WriteLine(gp7.KinematicsCategory);  // Opw
        Console.WriteLine(hc10.KinematicsCategory); // J5OffsetWrist

        // Every model of the catalog
        foreach (ArmKinematicModels model in Enum.GetValues(typeof(ArmKinematicModels)))
            Console.WriteLine(model);
        /**/
    }
}
```

**Python : KinematicsModels**
```python
from underautomation.yaskawa.common.dh_parameters import DhParameters
from underautomation.yaskawa.kinematics.arm_kinematic_models import ArmKinematicModels
from underautomation.yaskawa.kinematics.kinematics_utils import KinematicsUtils

##
# From the enumeration: 169 models of the catalog
gp7 = DhParameters.from_arm_kinematic_model(ArmKinematicModels.GP7)

# From the name of the model, case ignored. None if the model is not known.
hc10 = DhParameters.from_arm_kinematic_model_name("HC10")

print(gp7)                            # A1=40, A2=445, A3=40, D4=440, D5=0, D6=80...
print(gp7.kinematics_category.name)   # Opw
print(hc10.kinematics_category.name)  # J5OffsetWrist

# Every model of the catalog
for model in ArmKinematicModels:
    print(model.name)
##
```

Some models have several variants, with the order code in the name (for example `HC10DT_1_06VXHC10_B10`). Use the variant of the name plate of your robot. Do not store the integer value of the enumeration: new models are added in alphabetical order and shift the values. Store the name.

## From the controller

The `ALL.PRM` file of a controller contains the geometry of its robot. `FromPrmFile` reads a file saved on the PC, `FromPrmContent` the text of the file. DX100, DX200, FS100, YRC1000 and YRC1000micro files are supported. The parameters of the first robot (R1) are read.

**C# : KinematicsPrmFile**
```csharp
using UnderAutomation.Yaskawa;
using UnderAutomation.Yaskawa.Common;
using UnderAutomation.Yaskawa.Kinematics;

public class KinematicsPrmFile
{
    static void Main()
    {
        /**/
        // ALL.PRM saved from the controller, on the PC
        DhParameters fromFile = DhParameters.FromPrmFile(@"C:\Backup\ALL.PRM");

        // Or downloaded from the controller (1.4 MB, about 13 s on a YRC1000micro)
        var parameters = new ConnectParameters("192.168.0.1");
        parameters.Ftp.Enable = true;
        var robot = new YaskawaRobot();
        robot.Connect(parameters);

        string content = robot.Ftp.GetFile("ALL.PRM");
        DhParameters dh = DhParameters.FromPrmContent(content);

        // Joint solutions of the current position (tool 0, robot frame)
        var position = robot.HighSpeedEServer.GetRobotCartesianPosition();
        foreach (JointsAngles solution in KinematicsUtils.InverseKinematics(position, dh))
            Console.WriteLine(solution);

        robot.Disconnect();
        /**/
    }
}
```

**Python : KinematicsPrmFile**
```python
from underautomation.yaskawa.yaskawa_robot import YaskawaRobot
from underautomation.yaskawa.connect_parameters import ConnectParameters
from underautomation.yaskawa.common.dh_parameters import DhParameters
from underautomation.yaskawa.kinematics.kinematics_utils import KinematicsUtils

##
# ALL.PRM saved from the controller, on the PC
from_file = DhParameters.from_prm_file(r"C:\Backup\ALL.PRM")

# Or downloaded from the controller (1.4 MB, about 13 s on a YRC1000micro)
parameters = ConnectParameters("192.168.0.1")
parameters.ftp.enable = True
robot = YaskawaRobot()
robot.connect(parameters)

content = robot.ftp.get_file("ALL.PRM")
dh = DhParameters.from_prm_content(content)

# Joint solutions of the current position (tool 0, robot frame)
position = robot.high_speed_e_server.get_robot_cartesian_position()
for solution in KinematicsUtils.inverse_kinematics(position, dh):
    print(solution)

robot.disconnect()
##
```

Download `ALL.PRM` with [FTP](/yaskawa/documentation/ftp-transfer), [HTTP](/yaskawa/documentation/http) or the [High Speed Ethernet Server](/yaskawa/documentation/hses-files). The file is about 1.4 MB: FTP and HTTP take about 13 s on a YRC1000micro, the High Speed Ethernet Server about 45 s. Save it once, then use `FromPrmFile`.

On a MotoMINI, the parameters read from `ALL.PRM` are equal to `ArmKinematicModels.MotoMINI` of the catalog. The file is the right choice for a model that is not in the catalog, or to check the model of a robot.

A file of a robot with a structure that is not supported throws a `NotSupportedException`. See [Supported robots](/yaskawa/documentation/kinematics#supported_robots).

## Your own values

The constructor takes `A1`, `A2`, `A3`, `D4`, `D5`, `D6` in mm, then `Theta2`, `Theta3`, `Theta5` in degrees. Two `DhParameters` with the same values are equal.

**C# : KinematicsCustomDh**
```csharp
using UnderAutomation.Yaskawa.Common;
using UnderAutomation.Yaskawa.Kinematics;

public class KinematicsCustomDh
{
    static void Main()
    {
        /**/
        // A1, A2, A3, D4, D5, D6 in mm, then Theta2, Theta3, Theta5 in degrees
        var dh = new DhParameters(40, 445, 40, 440, 0, 80, -90, 0, 0);

        // Same values as the catalog: the same geometry
        bool sameAsGp7 = dh.Equals(DhParameters.FromArmKinematicModel(ArmKinematicModels.GP7));

        // The solver is chosen from the values: D5 = 0 is a spherical wrist
        Console.WriteLine(dh.KinematicsCategory); // Opw
        /**/
    }
}
```

**Python : KinematicsCustomDh**
```python
from underautomation.yaskawa.common.dh_parameters import DhParameters
from underautomation.yaskawa.kinematics.arm_kinematic_models import ArmKinematicModels

##
# A1, A2, A3, D4, D5, D6 in mm, then Theta2, Theta3, Theta5 in degrees
dh = DhParameters(40, 445, 40, 440, 0, 80, -90, 0, 0)

# Same values as the catalog: the same geometry
same_as_gp7 = dh == DhParameters.from_arm_kinematic_model(ArmKinematicModels.GP7)

# The solver is chosen from the values: D5 = 0 is a spherical wrist
print(dh.kinematics_category.name)  # Opw
##
```

`DhParameters` implements `IDhParameters`: your own class can also implement this interface and be passed to `KinematicsUtils`.

## Reference

**Members of Common.DhParameters**
```csharp
public class DhParameters : IDhParameters {
    // Initializes a new instance of <xref href="UnderAutomation.Yaskawa.Common.DhParameters" data-throw-if-not-resolved="false"></xref> with zero lengths and standard home angles
    // (<xref href="UnderAutomation.Yaskawa.Common.DhParameters.Theta2" data-throw-if-not-resolved="false"></xref> = -90, <xref href="UnderAutomation.Yaskawa.Common.DhParameters.Theta3" data-throw-if-not-resolved="false"></xref> = 0, <xref href="UnderAutomation.Yaskawa.Common.DhParameters.Theta5" data-throw-if-not-resolved="false"></xref> = 0).
    public DhParameters()

    // Initializes a new instance of <xref href="UnderAutomation.Yaskawa.Common.DhParameters" data-throw-if-not-resolved="false"></xref> with the specified values.
    public DhParameters(double a1, double a2, double a3, double d4, double d5, double d6, double theta2, double theta3, double theta5)

    // Initializes a new instance of <xref href="UnderAutomation.Yaskawa.Common.DhParameters" data-throw-if-not-resolved="false"></xref> by copying an existing <xref href="UnderAutomation.Yaskawa.Common.IDhParameters" data-throw-if-not-resolved="false"></xref>.
    public DhParameters(IDhParameters parameters)

    // Offset between the S axis and the L axis, along the arm (mm).
    public double A1 { get; set; }

    // Lower arm length, between the L axis and the U axis (mm).
    public double A2 { get; set; }

    // Elbow offset, between the U axis and the forearm axis (mm).
    public double A3 { get; set; }

    // Forearm length, between the U axis and the wrist (mm).
    public double D4 { get; set; }

    // Wrist offset along the B axis (mm). Zero for a spherical wrist.
    public double D5 { get; set; }

    // Distance between the wrist and the flange, along the T axis (mm).
    public double D6 { get; set; }

    public override bool Equals(object obj)

    // Returns the DH parameters of a known robot model.
    public static DhParameters FromArmKinematicModel(ArmKinematicModels model)

    // Returns the DH parameters of a known robot model, from its name (for example "GP7" or "HC10DTP").
    // The comparison ignores case.
    public static DhParameters FromArmKinematicModelName(string modelName)

    // Reads the DH parameters of robot group 1 from the text content of an ALL.PRM parameter file.
    // DX100, DX200, FS100, YRC1000 and YRC1000micro files are supported.
    public static DhParameters FromPrmContent(string content)

    // Reads the DH parameters of robot group 1 from an ALL.PRM parameter file saved from a controller.
    // DX100, DX200, FS100, YRC1000 and YRC1000micro files are supported.
    public static DhParameters FromPrmFile(string path)

    public override int GetHashCode()

    // Kinematic structure of the arm: <xref href="UnderAutomation.Yaskawa.Common.KinematicsCategory.Opw" data-throw-if-not-resolved="false"></xref> when <xref href="UnderAutomation.Yaskawa.Common.DhParameters.D5" data-throw-if-not-resolved="false"></xref> is 0,
    // <xref href="UnderAutomation.Yaskawa.Common.KinematicsCategory.J5OffsetWrist" data-throw-if-not-resolved="false"></xref> otherwise.
    public KinematicsCategory KinematicsCategory { get; }

    // DH angle of the L axis when the L axis is at zero pulse (degrees).
    public double Theta2 { get; set; }

    // DH angle of the U axis when the U axis is at zero pulse (degrees).
    public double Theta3 { get; set; }

    // DH angle of the B axis when the B axis is at zero pulse (degrees).
    public double Theta5 { get; set; }

    public override string ToString()
}
```

**Members of Common.IDhParameters**
```csharp
public interface IDhParameters {
    // Offset between the S axis and the L axis, along the arm (mm).
    double A1 { get; }

    // Lower arm length, between the L axis and the U axis (mm).
    double A2 { get; }

    // Elbow offset, between the U axis and the forearm axis (mm).
    double A3 { get; }

    // Forearm length, between the U axis and the wrist (mm).
    double D4 { get; }

    // Wrist offset along the B axis (mm). Zero for a spherical wrist.
    double D5 { get; }

    // Distance between the wrist and the flange, along the T axis (mm).
    double D6 { get; }

    // DH angle of the L axis when the L axis is at zero pulse (degrees).
    double Theta2 { get; }

    // DH angle of the U axis when the U axis is at zero pulse (degrees).
    double Theta3 { get; }

    // DH angle of the B axis when the B axis is at zero pulse (degrees).
    double Theta5 { get; }
}
```

**Members of Kinematics.ArmKinematicModels**
```csharp
public enum ArmKinematicModels {
    // AR1440
    [ArmModel("AR1440", 155, 614, 200, 640, 0, 100, -90, 0, 0)]
    AR1440 = 0

    // AR1730
    [ArmModel("AR1730", 150, 760, 200, 795, 0, 100, -90, 0, 0)]
    AR1730 = 1

    // AR2010
    [ArmModel("AR2010", 150, 760, 200, 1082, 0, 100, -90, 0, 0)]
    AR2010 = 2

    // AR3120
    [ArmModel("AR3120", 145, 1150, 250, 1812, 0, 100, -90, 0, 0)]
    AR3120 = 3

    // AR700
    [ArmModel("AR700", 40, 345, 40, 340, 0, 80, -90, 0, 0)]
    AR700 = 4

    // AR900
    [ArmModel("AR900", 40, 445, 40, 440, 0, 80, -90, 0, 0)]
    AR900 = 5

    // DX1350D
    [ArmModel("DX1350D", 200, 600, 75, 550, 0, 120, -90, 0, 0)]
    DX1350D = 6

    // EP4000D
    [ArmModel("EP4000D", 550, 1100, 250, 2135, 0, 255, 0, 0, 0)]
    EP4000D = 7

    // EPH130D
    [ArmModel("EPH130D", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    EPH130D = 8

    // EPH400D
    [ArmModel("EPH400D", 550, 1100, 250, 2135, 0, 255, 0, 0, 0)]
    EPH400D = 9

    // EPX1250
    [ArmModel("EPX1250", 200, 520, 130, 520, 0, 86.5, -90, 0, 0)]
    EPX1250 = 10

    // ES0165D-A00
    [ArmModel("ES0165D-A00", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    ES0165D_A00 = 11

    // ES0165D-A10
    [ArmModel("ES0165D-A10", 285, 1150, 250, 1590, 0, 225, -90, 0, 0)]
    ES0165D_A10 = 12

    // ES0165D-B00
    [ArmModel("ES0165D-B00", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    ES0165D_B00 = 13

    // ES0165D-B10
    [ArmModel("ES0165D-B10", 285, 1150, 250, 1590, 0, 225, -90, 0, 0)]
    ES0165D_B10 = 14

    // ES0165D-Z10
    [ArmModel("ES0165D-Z10", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    ES0165D_Z10 = 15

    // ES0200D
    [ArmModel("ES0200D", 285, 1150, 250, 1225, 0, 250, -90, 0, 0)]
    ES0200D = 16

    // ES0280D
    [ArmModel("ES0280D", 285, 1150, 250, 1225, 0, 250, -90, 0, 0)]
    ES0280D = 17

    // ES165RD
    [ArmModel("ES165RD", 740, 1150, 250, 1225, 0, 225, 0, 0, 0)]
    ES165RD = 18

    // ES200D
    [ArmModel("ES200D", 285, 1150, 250, 1225, 0, 250, -90, 0, 0)]
    ES200D = 19

    // ES200RD-A00-Proto
    [ArmModel("ES200RD-A00-Proto", 740, 1150, 250, 1225, 0, 250, 0, 0, 0)]
    ES200RD_A00_Proto = 20

    // ES200RD-A10
    [ArmModel("ES200RD-A10", 740, 1150, 250, 2100, 0, 225, 0, 0, 0)]
    ES200RD_A10 = 21

    // ES200RD-J00
    [ArmModel("ES200RD-J00", 740, 1150, 250, 1225, 0, 250, 0, 0, 0)]
    ES200RD_J00 = 22

    // ES200RD-Pack-Proto
    [ArmModel("ES200RD-Pack-Proto", 740, 1150, 250, 1225, 0, 250, 0, 0, 0)]
    ES200RD_Pack_Proto = 23

    // ES280D
    [ArmModel("ES280D", 285, 1150, 250, 1225, 0, 250, -90, 0, 0)]
    ES280D = 24

    // GA50
    [ArmModel("GA50", 330, 870, 250, 800, 0, 175, -90, 0, 0)]
    GA50 = 25

    // GG250
    [ArmModel("GG250", 285, 1150, 300, 1275, 0, 250, -90, 0, 0)]
    GG250 = 26

    // GP110
    [ArmModel("GP110", 320, 870, 235, 1020, 0, 200, -90, 0, 0)]
    GP110 = 27

    // GP110H
    [ArmModel("GP110H", 320, 870, 300, 800, 0, 250, -90, 0, 0)]
    GP110H = 28

    // GP12
    [ArmModel("GP12", 155, 614, 200, 640, 0, 100, -90, 0, 0)]
    GP12 = 29

    // GP165R
    [ArmModel("GP165R", 740, 1150, 250, 1225, 0, 225, 0, 0, 0)]
    GP165R = 30

    // GP180
    [ArmModel("GP180", 325, 1150, 300, 1225, 0, 225, -90, 0, 0)]
    GP180 = 31

    // GP180H
    [ArmModel("GP180H", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    GP180H = 32

    // GP180-120
    [ArmModel("GP180-120", 325, 1150, 300, 1590, 0, 225, -90, 0, 0)]
    GP180_120 = 33

    // GP200R
    [ArmModel("GP200R", 740, 1150, 250, 1225, 0, 250, 0, 0, 0)]
    GP200R = 34

    // GP200S
    [ArmModel("GP200S", 325, 700, 300, 830, 0, 250, -90, 0, 0)]
    GP200S = 35

    // GP20HL
    [ArmModel("GP20HL", 145, 1150, 250, 1812, 0, 100, -90, 0, 0)]
    GP20HL = 36

    // GP215
    [ArmModel("GP215", 285, 1150, 250, 1490, 0, 250, -90, 0, 0)]
    GP215 = 37

    // GP225
    [ArmModel("GP225", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    GP225 = 38

    // GP225H
    [ArmModel("GP225H", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    GP225H = 39

    // GP25
    [ArmModel("GP25", 150, 760, 200, 795, 0, 100, -90, 0, 0)]
    GP25 = 40

    // GP250
    [ArmModel("GP250", 285, 1150, 250, 1285, 0, 250, -90, 0, 0)]
    GP250 = 41

    // GP25SV
    [ArmModel("GP25SV", -150, 614, 200, 795, 0, 100, -90, 0, 0)]
    GP25SV = 42

    // GP25-12
    [ArmModel("GP25-12", 150, 760, 200, 1082, 0, 100, -90, 0, 0)]
    GP25_12 = 43

    // GP280
    [ArmModel("GP280", 285, 1150, 250, 1015, 0, 250, -90, 0, 0)]
    GP280 = 44

    // GP280L
    [ArmModel("GP280L", 270, 1250, 300, 1566, 0, 270, -90, 0, 0)]
    GP280L = 45

    // GP300R
    [ArmModel("GP300R", 750, 1050, 280, 1400, 0, 250, 0, 0, 0)]
    GP300R = 46

    // GP35H
    [ArmModel("GP35H", 145, 870, 250, 1025, 0, 175, -90, 0, 0)]
    GP35H = 47

    // GP35L
    [ArmModel("GP35L", 145, 1150, 210, 1225, 0, 175, -90, 0, 0)]
    GP35L = 48

    // GP360
    [ArmModel("GP360", 270, 1250, 300, 1277, 0, 270, -90, 0, 0)]
    GP360 = 49

    // GP4
    [ArmModel("GP4", 0, 260, 15, 290, 0, 72, -90, 0, 0)]
    GP4 = 50

    // GP400
    [ArmModel("GP400", 400, 1050, 250, 1605, 0, 300, -90, 0, 0)]
    GP400 = 51

    // GP400R
    [ArmModel("GP400R", 280, 1100, 250, 2135, 0, 255, 0, 0, 0)]
    GP400R = 52

    // GP50
    [ArmModel("GP50", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    GP50 = 53

    // GP600
    [ArmModel("GP600", 400, 1050, 250, 1605, 0, 300, -90, 0, 0)]
    GP600 = 54

    // GP7
    [ArmModel("GP7", 40, 445, 40, 440, 0, 80, -90, 0, 0)]
    GP7 = 55

    // GP70L
    [ArmModel("GP70L", 320, 1165, 235, 1225, 0, 175, -90, 0, 0)]
    GP70L = 56

    // GP8
    [ArmModel("GP8", 40, 345, 40, 340, 0, 80, -90, 0, 0)]
    GP8 = 57

    // GP88
    [ArmModel("GP88", 320, 870, 210, 1025, 0, 175, -90, 0, 0)]
    GP88 = 58

    // GP8L
    [ArmModel("GP8L", 155, 714, 200, 740, 0, 80, -90, 0, 0)]
    GP8L = 59

    // HC10
    [ArmModel("HC10", 0, 700, 0, 500, 162, 130, -90, 90, 0)]
    HC10 = 60

    // HC10DTF
    [ArmModel("HC10DTF", 0, 700, 0, 500, 162, 170, -90, 0, 0)]
    HC10DTF = 61

    // HC10DTFP
    [ArmModel("HC10DTFP", 0, 700, 0, 500, 162, 170, -90, 0, 0)]
    HC10DTFP = 62

    // HC10DTP
    [ArmModel("HC10DTP", 0, 700, 0, 500, 162, 170, -90, 0, 0)]
    HC10DTP = 63

    // HC10DT_1-06VXHC10-A10
    [ArmModel("HC10DT_1-06VXHC10-A10", 0, 700, 0, 500, 162, 170, -90, 90, 0)]
    HC10DT_1_06VXHC10_A10 = 64

    // HC10DT_1-06VXHC10-B10
    [ArmModel("HC10DT_1-06VXHC10-B10", 0, 700, 0, 500, 162, 170, -90, 0, 0)]
    HC10DT_1_06VXHC10_B10 = 65

    // HC10DT_1-06VXHC10-B11
    [ArmModel("HC10DT_1-06VXHC10-B11", 0, 700, 0, 500, 162, 170, -90, 0, 0)]
    HC10DT_1_06VXHC10_B11 = 66

    // HC10DT_1-06VXHC10-B12
    [ArmModel("HC10DT_1-06VXHC10-B12", 0, 700, 0, 500, 162, 170, -90, 0, 0)]
    HC10DT_1_06VXHC10_B12 = 67

    // HC10DT_1-06VXHC10-C11
    [ArmModel("HC10DT_1-06VXHC10-C11", 0, 700, 0, 500, 162, 170, -90, 90, 0)]
    HC10DT_1_06VXHC10_C11 = 68

    // HC10SDTP
    [ArmModel("HC10SDTP", 0, 550, 0, 350, 162, 170, -90, 0, 0)]
    HC10SDTP = 69

    // HC20DT
    [ArmModel("HC20DT", 0, 820, 0, 880, 0, 200, -90, 0, 0)]
    HC20DT = 70

    // HC20DTP
    [ArmModel("HC20DTP", 0, 820, 0, 880, 0, 200, -90, 0, 0)]
    HC20DTP = 71

    // HC20SDT
    [ArmModel("HC20SDT", 0, 725, 0, 475, 185, 200, -90, 0, 0)]
    HC20SDT = 72

    // HC20SDTP
    [ArmModel("HC20SDTP", 0, 725, 0, 475, 185, 200, -90, 0, 0)]
    HC20SDTP = 73

    // HC30PL
    [ArmModel("HC30PL", 0, 820, 0, 880, 0, 200, -90, 0, 90)]
    HC30PL = 74

    // HP0020D-A00
    [ArmModel("HP0020D-A00", 150, 760, 140, 795, 0, 105, -90, 0, 90)]
    HP0020D_A00 = 75

    // HP0020D-A10
    [ArmModel("HP0020D-A10", 150, 760, 140, 995, 0, 105, -90, 0, 90)]
    HP0020D_A10 = 76

    // HP0020D-B00
    [ArmModel("HP0020D-B00", 150, 760, 140, 795, 0, 105, -90, 0, 90)]
    HP0020D_B00 = 77

    // HP0020D-B10
    [ArmModel("HP0020D-B10", 150, 760, 140, 995, 0, 105, -90, 0, 90)]
    HP0020D_B10 = 78

    // HP0020F
    [ArmModel("HP0020F", 150, 760, 140, 795, 0, 105, -90, 0, 90)]
    HP0020F = 79

    // HP0165D
    [ArmModel("HP0165D", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    HP0165D = 80

    // HP020RD
    [ArmModel("HP020RD", 450, 760, 140, 795, 0, 105, 0, 0, 0)]
    HP020RD = 81

    // MA02010
    [ArmModel("MA02010", 150, 760, 200, 1082, 0, 100, -90, 0, 0)]
    MA02010 = 82

    // MA03120
    [ArmModel("MA03120", 145, 1150, 200, 1815, 0, 100, -90, 0, 0)]
    MA03120 = 83

    // MA1440
    [ArmModel("MA1440", 155, 614, 200, 640, 0, 100, -90, 0, 0)]
    MA1440 = 84

    // MC02000
    [ArmModel("MC02000", 330, 870, 250, 800, 0, 175, -90, 0, 0)]
    MC02000 = 85

    // MCL0020
    [ArmModel("MCL0020", 150, 730, 140, 765, 0, 105, -90, 0, 90)]
    MCL0020 = 86

    // MCL020F
    [ArmModel("MCL020F", 150, 730, 140, 765, 0, 105, -90, 0, 90)]
    MCL020F = 87

    // MH00005
    [ArmModel("MH00005", 88, 310, 40, 305, 0, 86.5, -90, 0, 0)]
    MH00005 = 88

    // MH00006-A00
    [ArmModel("MH00006-A00", 150, 614, 155, 640, 0, 95, -90, 0, 90)]
    MH00006_A00 = 89

    // MH00006-A30
    [ArmModel("MH00006-A30", 150, 614, 155, 640, 0, 95, -90, 0, 90)]
    MH00006_A30 = 90

    // MH00006-B00
    [ArmModel("MH00006-B00", 150, 614, 155, 640, 0, 95, -90, 0, 90)]
    MH00006_B00 = 91

    // MH00006-B30
    [ArmModel("MH00006-B30", 150, 614, 155, 640, 0, 95, -90, 0, 90)]
    MH00006_B30 = 92

    // MH00006-C00
    [ArmModel("MH00006-C00", 150, 614, 155, 640, 0, 100, -90, 0, 90)]
    MH00006_C00 = 93

    // MH0000J
    [ArmModel("MH0000J", 0, 275, 0, 270, 0, 63, -90, 0, 0)]
    MH0000J = 94

    // MH00024-A00
    [ArmModel("MH00024-A00", 150, 760, 200, 795, 0, 100, -90, 0, 0)]
    MH00024_A00 = 95

    // MH00024-A10
    [ArmModel("MH00024-A10", 150, 760, 200, 1082, 0, 100, -90, 0, 0)]
    MH00024_A10 = 96

    // MH00024-Z00-Proto
    [ArmModel("MH00024-Z00-Proto", 150, 760, 200, 795, 0, 100, -90, 0, 0)]
    MH00024_Z00_Proto = 97

    // MH0003F
    [ArmModel("MH0003F", 0, 260, 30, 270, 0, 90, -90, 0, 0)]
    MH0003F = 98

    // MH00050-A00
    [ArmModel("MH00050-A00", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MH00050_A00 = 99

    // MH00050-A10
    [ArmModel("MH00050-A10", 145, 1150, 200, 1800, 0, 105, -90, 0, 90)]
    MH00050_A10 = 100

    // MH00050-A20
    [ArmModel("MH00050-A20", 145, 1150, 210, 1225, 0, 175, -90, 0, 0)]
    MH00050_A20 = 101

    // MH00050-B00
    [ArmModel("MH00050-B00", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MH00050_B00 = 102

    // MH00050-B10
    [ArmModel("MH00050-B10", 145, 1150, 200, 1800, 0, 105, -90, 0, 90)]
    MH00050_B10 = 103

    // MH00050-B20
    [ArmModel("MH00050-B20", 145, 1150, 210, 1225, 0, 175, -90, 0, 0)]
    MH00050_B20 = 104

    // MH00050-J00
    [ArmModel("MH00050-J00", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MH00050_J00 = 105

    // MH00050-J10
    [ArmModel("MH00050-J10", 145, 1150, 200, 1800, 0, 105, -90, 0, 90)]
    MH00050_J10 = 106

    // MH00050-J20
    [ArmModel("MH00050-J20", 145, 1150, 210, 1225, 0, 175, -90, 0, 0)]
    MH00050_J20 = 107

    // MH00050-Z00
    [ArmModel("MH00050-Z00", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MH00050_Z00 = 108

    // MH0005F
    [ArmModel("MH0005F", 88, 310, 40, 305, 0, 80, -90, 0, 0)]
    MH0005F = 109

    // MH0005L
    [ArmModel("MH0005L", 88, 400, 40, 405, 0, 86.5, -90, 0, 0)]
    MH0005L = 110

    // MH0005S
    [ArmModel("MH0005S", 88, 310, 40, 305, 0, 80, -90, 0, 0)]
    MH0005S = 111

    // MH0006F
    [ArmModel("MH0006F", 150, 614, 155, 640, 0, 95, -90, 0, 90)]
    MH0006F = 112

    // MH0006S
    [ArmModel("MH0006S", 150, 305, 155, 520, 0, 95, -90, 0, 90)]
    MH0006S = 113

    // MH00080
    [ArmModel("MH00080", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MH00080 = 114

    // MH00165-A00
    [ArmModel("MH00165-A00", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    MH00165_A00 = 115

    // MH00165-A10
    [ArmModel("MH00165-A10", 285, 1150, 250, 1590, 0, 225, -90, 0, 0)]
    MH00165_A10 = 116

    // MH00165-B00
    [ArmModel("MH00165-B00", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    MH00165_B00 = 117

    // MH00200
    [ArmModel("MH00200", 285, 1150, 250, 1225, 0, 250, -90, 0, 0)]
    MH00200 = 118

    // MH00215
    [ArmModel("MH00215", 285, 1150, 250, 1490, 0, 250, -90, 0, 0)]
    MH00215 = 119

    // MH00250
    [ArmModel("MH00250", 285, 1150, 250, 1285, 0, 250, -90, 0, 0)]
    MH00250 = 120

    // MH00280
    [ArmModel("MH00280", 285, 1150, 250, 1015, 0, 250, -90, 0, 0)]
    MH00280 = 121

    // MH003BM
    [ArmModel("MH003BM", 0, 260, 30, 270, 0, 90, -90, 0, 0)]
    MH003BM = 122

    // MH00400
    [ArmModel("MH00400", 400, 1050, 250, 1605, 0, 300, -90, 0, 0)]
    MH00400 = 123

    // MH005BM
    [ArmModel("MH005BM", 0, 350, 40, 350, 0, 115, -90, 0, 0)]
    MH005BM = 124

    // MH005LF
    [ArmModel("MH005LF", 88, 400, 40, 405, 0, 80, -90, 0, 0)]
    MH005LF = 125

    // MH005LS
    [ArmModel("MH005LS", 88, 400, 40, 405, 0, 80, -90, 0, 0)]
    MH005LS = 126

    // MH00600
    [ArmModel("MH00600", 400, 1050, 250, 1605, 0, 300, -90, 0, 0)]
    MH00600 = 127

    // MH006SF
    [ArmModel("MH006SF", 150, 305, 155, 520, 0, 95, -90, 0, 90)]
    MH006SF = 128

    // MH00900
    [ArmModel("MH00900", 500, 1700, 350, 2480, 0, 440, -90, 0, 0)]
    MH00900 = 129

    // MH110
    [ArmModel("MH110", 320, 870, 235, 1020, 0, 200, -90, 0, 0)]
    MH110 = 130

    // MH12
    [ArmModel("MH12", 155, 614, 200, 640, 0, 100, -90, 0, 0)]
    MH12 = 131

    // MH180-A00
    [ArmModel("MH180-A00", 325, 1150, 300, 1225, 0, 225, -90, 0, 0)]
    MH180_A00 = 132

    // MH180-A10
    [ArmModel("MH180-A10", 325, 1150, 300, 1590, 0, 225, -90, 0, 0)]
    MH180_A10 = 133

    // MH180-C00
    [ArmModel("MH180-C00", 325, 1150, 300, 1225, 0, 225, -90, 0, 0)]
    MH180_C00 = 134

    // MH225
    [ArmModel("MH225", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    MH225 = 135

    // MHP045L
    [ArmModel("MHP045L", 0, 1400, 0, 1450, 0, 175, -90, 0, 0)]
    MHP045L = 136

    // MPL0080
    [ArmModel("MPL0080", 145, 870, 210, 1025, 0, 175, -90, 0, 90)]
    MPL0080 = 137

    // MPX1150
    [ArmModel("MPX1150", 0, 320, 75, 400, 0, 86.5, -90, 0, 0)]
    MPX1150 = 138

    // MPX1400
    [ArmModel("MPX1400", 200, 520, 130, 520, 0, 86.5, -90, 0, 0)]
    MPX1400 = 139

    // MPX1950
    [ArmModel("MPX1950", 0, 725, 0, 725, 0, 100, -90, 0, 0)]
    MPX1950 = 140

    // MS00080
    [ArmModel("MS00080", 145, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MS00080 = 141

    // MS00120
    [ArmModel("MS00120", 100, 750, 300, 900, 0, 225, -90, 0, 0)]
    MS00120 = 142

    // MS0080W
    [ArmModel("MS0080W", 320, 870, 210, 1025, 0, 175, -90, 0, 0)]
    MS0080W = 143

    // MS100
    [ArmModel("MS100", 320, 870, 235, 1020, 0, 200, -90, 0, 0)]
    MS100 = 144

    // MS165
    [ArmModel("MS165", 325, 1150, 300, 1225, 0, 225, -90, 0, 0)]
    MS165 = 145

    // MS210
    [ArmModel("MS210", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    MS210 = 146

    // MotoMINI
    [ArmModel("MotoMINI", 20, 165, 0, 165, 0, 40, -90, 0, 90)]
    MotoMINI = 147

    // PH130F
    [ArmModel("PH130F", 285, 1150, 250, 1225, 0, 225, -90, 0, 0)]
    PH130F = 148

    // PH130RF
    [ArmModel("PH130RF", 720, 1050, 250, 1700, 0, 230, 0, 0, 0)]
    PH130RF = 149

    // PH13RLD
    [ArmModel("PH13RLD", 720, 1050, 250, 1700, 0, 230, 0, 0, 0)]
    PH13RLD = 150

    // PH200R
    [ArmModel("PH200R", 550, 1100, 250, 2135, 0, 255, 0, 0, 0)]
    PH200R = 151

    // PH200RF
    [ArmModel("PH200RF", 550, 1100, 250, 2135, 0, 255, 0, 0, 0)]
    PH200RF = 152

    // SP100
    [ArmModel("SP100", 320, 870, 235, 1020, 0, 200, -90, 0, 0)]
    SP100 = 153

    // SP110H
    [ArmModel("SP110H", 320, 870, 300, 800, 0, 250, -90, 0, 0)]
    SP110H = 154

    // SP130
    [ArmModel("SP130", 320, 870, 235, 1020, 0, 200, -90, 0, 0)]
    SP130 = 155

    // SP150R
    [ArmModel("SP150R", 740, 1150, 250, 1225, 0, 225, 0, 0, 0)]
    SP150R = 156

    // SP165
    [ArmModel("SP165", 325, 1150, 300, 1225, 0, 225, -90, 0, 0)]
    SP165 = 157

    // SP165-105
    [ArmModel("SP165-105", 325, 1150, 300, 1590, 0, 225, -90, 0, 0)]
    SP165_105 = 158

    // SP180H
    [ArmModel("SP180H", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    SP180H = 159

    // SP180H-110
    [ArmModel("SP180H-110", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    SP180H_110 = 160

    // SP185R
    [ArmModel("SP185R", 740, 1150, 250, 1225, 0, 250, 0, 0, 0)]
    SP185R = 161

    // SP210
    [ArmModel("SP210", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    SP210 = 162

    // SP225H
    [ArmModel("SP225H", 325, 1150, 300, 1225, 0, 250, -90, 0, 0)]
    SP225H = 163

    // SP225H-135
    [ArmModel("SP225H-135", 325, 1150, 300, 1480, 0, 250, -90, 0, 0)]
    SP225H_135 = 164

    // SP235
    [ArmModel("SP235", 285, 1150, 250, 1285, 0, 250, -90, 0, 0)]
    SP235 = 165

    // SP80
    [ArmModel("SP80", 320, 870, 210, 1025, 0, 175, -90, 0, 0)]
    SP80 = 166

    // UP0350D
    [ArmModel("UP0350D", 280, 1050, 250, 1320, 0, 270, -120, 0, 0)]
    UP0350D = 167

    // UP400RD
    [ArmModel("UP400RD", 280, 1100, 250, 2135, 0, 255, 0, 0, 0)]
    UP400RD = 168
}
```

## What to read next

- [Offline kinematics](/yaskawa/documentation/kinematics): forward and inverse kinematics.
- [FTP file transfers](/yaskawa/documentation/ftp-transfer): download `ALL.PRM` and the other files of the controller.