# Add external axes

> Learn how to use an external axis in your NOVA simulation.

Create and configure an external axis for your robot by building a static base and moving carriage, applying necessary APIs and joints, and mounting your robot on top.

Configure the external axis position using one of two methods:

1. `ActionGraph`-based, with position control via signal exchange with `On BUS IO Change` OGN or
2. `ArticulationRootAPI`-based, with position control via dedicated virtual controller.

Final result:

Video: [/video/omniservice/external\_axis/final\_result.webm](/video/omniservice/external_axis/final_result.webm)

## Step 1: Model the external axis in Isaac Sim

Build the external axis structure with a static base and moving carriage as shown in the stage tree below.

1. In the `World` prim, create the Xform `cell` with the child `external axis`.
2. Create the children Xforms `base` and `carriage`.
3. Create one `Cube` mesh for each child Xform. Scale and position as you like.
4. Add `Rigid Body with Colliders Preset` to `base` and `carriage`.
5. Create a **PrismaticJoint** that connects `base` and `carriage`.
6. Create a **FixedJoint** called `root_joint` with the Xform `base` as `Body 0`.
7. Import a robot into the scene and place it onto the carriage.
8. Start the simulation and test your setup at runtime.

![stage tree for axis](/assets/nova/omniservice/external_axis/stage_tree_axis.webp)

Video: [/video/omniservice/external\_axis/create\_external\_axis.webm](/video/omniservice/external_axis/create_external_axis.webm)

### Controlling the external axis

There are two approaches to control the external axis from _NOVA_. One is a more _Isaac Sim_ native approach based on robot or bus signals on _NOVA_ side and an _Action Graph_ on _Isaac Sim_ side. The other is more sophisticated, based on specific APIs and allows for a _NOVA_ native control via virtual controllers.

**Action Graph**

This approach aligns more closely with native Isaac Sim workflows but provides less convenience. The position of the external axis is set via a dedicated signal created in NOVA. The following configurations must be made in NOVA and Isaac Sim.

#### NOVA

1. Create NOVA instance.
2. Create robot virtual controller.
3. Add a Bus signal with the following values:
   - IO ID: string, e.g., Some ID
   - Data type: REAL
   - Address: 800
   - Description: optional

![profinet signal in NOVA](/assets/nova/omniservice/external_axis/profinet_signal.webp)

#### Isaac Sim

1. Create the Action Graph as depicted on the right.
2. The highlighted node controls the property `drive:linear:physics:targetPosition` of the external axis' PrismaticJoint\`.
3. The other `Write Prim Attribute` node sets the robot's property `xformOp:translate` to equal the `carriage` prim's attribute of the external axis offset by _0.55m_, because there is an offset in z direction with the _Yaskawa\_AR3120_ base link.
4. Configure the `On Bus IO Change` node to listen to the Bus signal, e.g., `Some ID`, you created earlier in NOVA.

![action graph](/assets/nova/omniservice/external_axis/action_graph.webp)

**ArticulationRootAPI**

### Applying the `ArticulationRootAPI` to the external axis

This approach is more sophisticated, but offers more convenience, because both the external axis and the robot can be controlled via two dedicated virtual controllers in NOVA.

1. Add `ArticulationRootAPI` to the external axis' Xform using `Add` → `Physics` → `Articulation Root`.
2. Apply the `IsaacRobotAPI` to the external axis' Xform using `Add` → `Edit API Schema`.
3. In the same window, apply `IsaacLinkAPI` to the `base` and `carriage` Xforms and `IsaacJointAPI` to the `PrismaticJoint`.
4. In the external axis Xform's `Property` window, assign the `PrismaticJoint` to the `isaac:physics:robotJoints` property and `base` and `carriage` to the `isaac:physics:robotLinks` property.
5. In the robot's `Property` window, specify `carriage` as `Body 0`.
6. Add the `Linear Drive` API to your `PrismaticJoint` and set the damping and stiffness as displayed.
7. Connect your robot and the external axis articulation to your NOVA virtual controllers.

![isaac robot api](/assets/nova/omniservice/external_axis/isaacrobotapi.webp)

![api schema](/assets/nova/omniservice/external_axis/api_schema.webp)

![root joint](/assets/nova/omniservice/external_axis/root_joint.webp)

![linear drive api](/assets/nova/omniservice/external_axis/linear_drive.webp)
