# How to move a Doosan robot with movej, movel, and asynchronous motion commands

**URL:** <https://www.robotexchange.io/t/how-to-move-a-doosan-robot-with-movej-movel-and-asynchronous-motion-commands/4679>\
**Category:** 💡 How-to\
**Tags:** Python, drl-studio, Doosan-robot\
**Created:** [September 2, 2026, 12:16am UTC](https://www.robotexchange.io/t/how-to-move-a-doosan-robot-with-movej-movel-and-asynchronous-motion-commands/4679 "2026-09-02T00:16:14Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![thijs](https://www.robotexchange.io/user_avatar/www.robotexchange.io/thijs/32/4_2.png) [@thijs](https://www.robotexchange.io/u/thijs)\
**Post date:** [September 2, 2026, 12:16am UTC](https://www.robotexchange.io/t/how-to-move-a-doosan-robot-with-movej-movel-and-asynchronous-motion-commands/4679/1 "2026-09-02T00:16:14Z")

</div>

_Based on contributions by dimitar.prisadnikov._

Doosan robots are programmed in DRL, a Python-based scripting language. This article covers the basic motion commands (`movej`, `movel`) and their asynchronous counterparts (`amovej`, `amovel`), which is the first thing you need to move the robot at all.

## What you need

- A Doosan robot, or a RoboDK simulation of one
- A laptop with [DRL Studio](https://www.homberger-robotica.com/prodotti/homberger-hub/drl-studio/) (Homberger Hub) installed
- Familiarity with joint coordinates (`posj`) and Cartesian coordinates (`posx`) — see the [motion concepts guide](https://doc.dorna.ai/docs/guides/motion-concepts/#coordinate-system) if these are new to you

> ⚠ **Safety:** the code examples below use joint and Cartesian coordinates that, depending on your robot’s placement and surroundings, could cause a collision. When running any new movement for the first time, set the speed to a low value and keep your hand near the emergency stop. All examples assume the robot starts from its home position.

## Steps

### 1. Understand synchronous vs. asynchronous movement

Doosan movement commands come in pairs: `movej`/`amovej`, `movel`/`amovel`, `movejx`/`amovejx`, `movec`/`amovec`. The `a`-prefixed versions are **asynchronous** : the program continues executing the next line immediately, without waiting for the robot to finish moving. The non-`a` versions **block** until the move is complete. That is the only functional difference between the two.

### 2. Move in joint coordinates with movej

```python
# get the current pose of the robot in joint coordinates
current_posj = get_current_posj()

# create a new pose based on the current one
target_posj = addto(current_posj, [0, 0, 135, 45, 45, 0])

# move to the target pose
movej(target_posj, v=20, a=100)

# log a message
tp_log(str("What is the robot doing as this message appears?"))

# move back to the starting pose
movej(current_posj, v=20, a=100)

```

The current position is read as `posj`, then `addto()` creates a new pose by adding offsets to it — here joints 3, 4 and 5 are increased by 135°, 45° and 45° while the rest stay unchanged. The robot moves to the new pose, then back. Because `movej` is synchronous, the `tp_log` message only appears after the first move has fully finished.

### 3. Move in a straight line with movel

```python
# get the current pose in cartesian coordinates
current_posx, _ = get_current_posx()

# transform the current pose by increasing its Y value by 200mm
target_posx = trans(current_posx, posx(0, 200, 0, 0, 0, 0))

# move linearly to the target pose
movel(target_posx, v=20, a=100)

# move linearly back to the starting pose
movel(current_posx, v=20, a=100)

```

`trans()` creates a new Cartesian pose by applying an offset to the current one — here the Y value increases by 200 mm relative to the robot base (the default reference frame). `movel` moves the tool center point there in a straight line, then back.

### 4. Move without blocking, with amovej

```python
# get the current pose of the robot in joint coordinates
current_posj = get_current_posj()

# create a new pose based on the current one
target_posj = addto(current_posj, [0, 0, 135, 45, 45, 0])

# move to the target pose async
amovej(target_posj, v=20, a=100)

# log a message
tp_log(str("What is the robot doing as this message appears?"))

```

This is the same move as step 2, but asynchronous. The `tp_log` message is printed as soon as the move _starts_, not after it finishes, because the program doesn’t wait for `amovej` to complete before moving on.

## Troubleshooting

- Cobots have physical limits. Joint movements (`movej`) are generally reliable. Other move types can run into **singularities** , which can cause unexpected or erratic motion — test any new `movel`/`movec` path at low speed first.
- `movej`, `movel` and related functions accept more parameters than shown here (reference coordinates, reach time, blending radius, etc.). Only pose, velocity (`v`) and acceleration (`a`) are covered in this article — check the Doosan Robotics Programming Manual for the rest.
- ⚠ Check: some other Doosan how-tos call these same functions with `vel=`/`acc=` instead of `v=`/`a=` (see [How to rotate the Doosan robot tool and avoid servo lock errors](https://www.robotexchange.io/t/how-to-rotate-the-doosan-robot-tool-and-avoid-servo-lock-errors/4680)). Both may work as aliases in your DRL Studio version, but if you get a parameter error, check the autocomplete/manual for the exact keyword names your firmware version expects.

## Related

- [How to rotate the Doosan robot tool and avoid servo lock errors](https://www.robotexchange.io/t/how-to-rotate-the-doosan-robot-tool-and-avoid-servo-lock-errors/4680)
- [How to set up safety area (space) limits on a Doosan robot](https://www.robotexchange.io/t/how-to-set-up-safety-area-space-limits-on-a-doosan-robot/4682)

* * *

_Rewritten and consolidated (Sept 2026) from the original student how-to’s: [Movements on a Doosan robot](https://www.robotexchange.io/t/movements-on-a-doosan-robot/3044)._
