# Move API
# Create Move Action
curl -X POST \
-H "Content-Type: application/json" \
-d '{"creator": "xxx", "type": "standard" ...}' \
http://192.168.25.25:8090/chassis/moves
Returns
{
"id": 5 // The ID of the newly created action.
}
Request Parameters
interface MoveActionCreate {
creator: string; // The initiator of the action (for diagnostic purposes only).
type:
| 'standard'
| 'charge' // Go to the charger and dock with it.
| 'return_to_elevator_waiting_point'
| 'enter_elevator'
| 'leave_elevator' // Deprecated. Do not use.
| 'along_given_route' // Follow a specified path.
| 'align_with_rack' // Crawl under a rack (to jack it up later).
| 'to_unload_point' // Move to a rack unload point (to jack it down later).
| 'follow_target'; // Follow a moving target.
target_x?: number;
target_y?: number;
target_z?: number;
target_ori?: number;
target_accuracy?: number; // In meters (optional).
// A path to follow.
//
// Only valid when `type` is `along_given_route`.
// A list of coordinates as a comma-separated string,
// in the format "x1, y1, x2, y2".
route_coordinates?: string;
// The allowed detour distance when navigating around an obstacle
// while following a specified path.
//
// Only valid when `type` is `along_given_route`.
// When 0 is specified, the robot will always stop and wait before an obstacle
// instead of attempting to go around it.
detour_tolerance?: number;
// If true, the action will succeed immediately
// when within the radius of `target_accuracy`.
use_target_zone?: boolean = false;
charge_retry_count?: number; // Number of retries before the `charge` action fails.
rack_area_id: string; // When executing point-to-area or area-to-area cargo move actions, provide the target rack area ID.
properties?: { // Optional: since 2.11.0
inplace_rotate?: boolean; // Optional. since 2.11.0: strictly rotate without any linear velocity.
// Optional. An index into the layers of a rack stack.
// For type = "align_with_rack" and "to_unload_point".
rack_layer?: number;
}
}
# Jack Device
Since 2.7.0, there is a new model (codename Longjack) that can crawl under a rack and jack it up.
In a typical point-to-point task, the robot should use the following sequence of commands to load cargo and unload it at another location:
- Crawl under the rack: Create a move action with
type=align_with_rackto crawl under the rack. - Raise the jack device: When the move succeeds, call
/services/jack_up.- The progress of the jack device is reported via the Jack State Topic.
- When the jack is fully up, the footprint of the robot will expand to accommodate that of the rack. The updated footprint can be received via the Robot Model Topic.
- Move to the unload point: When the jack is fully up, create another move action with
type=to_unload_pointto move to the unload point. - Lower the jack device: Call
/services/jack_downto unload. - Optionally, create the next move action. The robot will move away from the rack point before initiating the next action.
| Robot Admin Screenshot | Photo |
|---|---|
![]() | ![]() |
WARNING
Certain parameters must be configured correctly for safe operation. See rack.specs
# Point-to-Area Move
In addition to point-to-point moves, which transport a rack or pallet from one point to another, we also support:
- Point-to-area move: This is the most commonly used move when it is not known in advance which points in the target area are empty.
- Area-to-area move: Used when you want to move every rack or pallet from one area to another.
On the mapping platform, a rack area polygon should be added. All rack points within this area are considered part of a group.
Upon receiving a move action with type=to_unload_point and rack_area_id={SOME_ID}, the robot scans all rack points in that area and moves to the first empty point. If all points are occupied, the move fails with the error NoFreeSpaceInRackArea.
Several new failure reasons have been introduced, such as:
InvalidRackAreaIdInvalidRackAreaUnknownRackSpaceStateNoRackInRackAreaAlignFailedInRackAreaNoFreeSpaceInRackAreaFailedToUnloadInRackArea
# Area-to-Area Move
Create a move action with type=align_with_rack and rack_area_id={SOME_ID}; the robot patrols the source area, finds the first rack point containing a rack, and aligns with it.
# Follow Given Route Strictly
When route_coordinates is provided and detour_tolerance=0, the robot follows the route as closely as possible and does not attempt to evade obstacles (it will only stop in front of them).
This is frequently used for stock inspection.

# Follow Target
This action instructs the robot to follow a moving target.
curl -X POST
-H "content-type: application/json" \
--data '{"type":"follow_target"}' \
http://192.168.25.25:8090/chassis/moves
Once this action is created, the user should send target poses via the WebSocket topic /follow_target_state: See Follow Target
# Get Move Action Detail
curl http://192.168.25.25:8090/chassis/moves/4409
{
"id": 4409,
"creator": "robot-admin-web",
"state": "cancelled",
"type": "standard",
"target_x": 0.7310126134385344,
"target_y": -1.5250144001960249,
"target_z": 0.0,
"target_ori": null,
"target_accuracy": null,
"use_target_zone": null,
"is_charging": null,
"charge_retry_count": 0,
"fail_reason": 0, // See MoveFailReason
"fail_reason_str": "None - None",
"fail_message": "",
"create_time": 1647509573,
"last_modified_time": 1647509573
}
Response Explained
interface MoveAction extends MoveActionCreate {
state: 'idle' | 'moving' | 'succeeded' | 'failed' | 'cancelled';
create_time: number; // Unix timestamp (e.g., 1647509573).
last_modified_time: number; // Unix timestamp (e.g., 1647509573).
fail_reason: number; // Failure code. Only valid when state="failed".
// Internal failure message for debugging. Only valid when state="failed".
fail_reason_str: string;
// Internal failure message in Chinese for debugging. Only valid when state="failed".
fail_message: string;
}
# Move Action List
The history of all move actions.
curl http://192.168.25.25:8090/chassis/moves
[
{
"id": 4409,
"creator": "robot-admin-web",
"state": "cancelled",
"type": "standard",
"fail_reason": 0, // See MoveFailReason
"fail_reason_str": "None - None",
"fail_message": "",
"create_time": 1647509573,
"last_modified_time": 1647509573
},
{
"id": 4408,
"creator": "control_unit",
"state": "succeeded",
"type": "none",
"fail_reason": 0, // See MoveFailReason
"fail_reason_str": "None - None",
"fail_message": "",
"create_time": 1647427995,
"last_modified_time": 1647428509
}
]
# Move State Feedback
Use the WebSocket topic /planning_state to receive updates on the move state.
{
"topic": "/planning_state",
"move_state": "moving",
"target_poses": [
{
"pos": [2.3, 20.82],
"ori": 0
}
],
"charger_pose": {
"pos": [0, 0],
"ori": 0
},
"going_back_to_charger": false,
"action_id": 4410, // The ID of the currently executing (or last) move action.
"fail_reason": 0, // See MoveFailReason
"fail_reason_str": "none",
"remaining_distance": 3.546117067337036,
"move_intent": "none",
"intent_target_pose": {
"pos": [0, 0],
"ori": 0
},
"stuck_state": "none"
}
# Cancel Current Move Action
curl -X PATCH \
-H "Content-Type: application/json" \
-d '{state: "cancelled"}' \
http://192.168.25.25:8090/chassis/moves/current
{ "state": "cancelled" }
# Move Failure Reasons
The fail_reason field is a numeric code indicating why a move action failed.
enum MoveFailReason
{
none = 0, // None
unknown = 1, // Unknown reason
GetMapFailed = 2, // Failed to obtain map (WorldMap)
StartingPointOutOfMap = 3, // Starting point is outside the map
EndingPointOutOfMap = 4, // Ending point is outside the map
StartingPointNotInGround = 5, // Starting point is not in a passable area
EndingPointNotInGround = 6, // Ending point is not in a passable area
StartingEqualEnding = 7, // Starting point and ending point are the same
CalculateGlobalPathExtendedDataError = 8, // Failed to calculate global path extended data
CalculationFailed = 9, // Roads are not connected
CalculationTimeout = 10, // Calculation timeout
NoGlobalPath = 11, // No global path available
NotGrabStartIndexOnGlobalPath = 12, // Failed to grab starting point on the global path
NotGrabEndIndexOnGlobalPath = 13, // Failed to grab ending point on the global path
PlanningTimeout = 14, // Path planning unsuccessful for a long time
MoveTimeout = 15, // Path planning successful, move timeout
ControlCostmapError = 16, // Local obstacle avoidance map data error, sensor data anomaly
PowerCableConnected = 17, // Currently charging with cable
RotateTimeout = 18, // Rotation timeout
ChargeRetryCountExceeded = 100, // Charge retry count exceeded
ChargeDockDetectionError = 101, // Charge dock detection error
ChargeDockSignalError = 102, // Did not receive successful docking signal from charge dock
InvalidChargeDock = 103, // Invalid charge dock position
AlreadyInCharging = 104, // Currently already charging
NoChargeCurrent = 105, // No charge current received for a long time after contact
InvalidCabinetPos = 200, // Invalid cabinet position
CabinetDetectionError = 201, // Cabinet detection error
NoDockWithConveyer = 202, // No docking with conveyer at the moment
NoApproachConveyer = 203, // No approaching conveyer at the moment
ElevatorPointOccupied = 300, // Elevator point occupied
ElevatorClosed = 301, // Elevator closed
ElevatorPointObscuredTimeout = 302, // Elevator point obscured for a long time
ElevatorPointOccupancyDetectionTimeout = 303, // Elevator point occupancy detection timeout
ElevatorEnterProgressUpdateTimeout = 304, // Elevator entry progress update timeout
InvalidTrackPoints = 400, // Invalid track points (number of input coordinates is not even or number of track points < 2)
TooFarFromStartOfTrack = 401, // Too far from start of track
InvalidRackDetectionPos = 500, // Invalid rack detection point
RackDetectionError = 501, // Rack detection error
RackRetryCountExceeded = 502, // Exceeded retry count for docking
UnloadPointOccupied = 503, // Unload point occupied
UnloadPointUnreachable = 504, // Unload point unreachable
RackMoved = 505, // Rack moved significantly
JackInUpState = 506, // Jack in raised state
InvalidRackAreaId = 507, // Invalid rack area ID
InvalidRackArea = 508, // Invalid rack area (no rack positions)
UnknownRackSpaceState = 509, // Unknown rack space state
NoRackInRackArea = 510, // No racks in rack area
AlignFailedInRackArea = 511, // Docking failed in rack area with racks
NoFreeSpaceInRackArea = 512, // No free space in rack area
FailedToUnloadInRackArea = 513, // Failed to unload in rack area with free rack positions
FollowFailed = 600, // Follow target lost
PoiDetectionError = 700, // POI detection error
PoiUnreachable = 701, // POI unreachable
BarcodeDetectionError = 702, // Barcode detection error
PlatformAlertError = 1000, // System exception
ServiceCallError = 1001, // Service call error (restapi usage)
InternalError = 1002, // Internal ASSERT error
MapChanged = 1003, // Map changed or cleared during task execution
MoveActionTypeDeprecated = 1004, // Interface deprecated
}
A more up-to-date version is available at this URL (opens new window).

