.. _dsr_robot_tutorial:
DSR_ROBOT2 Python Library Tutorial
==================================
Overview
--------
This tutorial provides an overview of the ``DSR_ROBOT2`` Python library and instructions on how to use it for robot control.
The ``DSR_ROBOT2`` library offers a high-level Python interface for controlling Doosan robots within the ROS 2 ecosystem.
It is designed to simplify robot manipulation by providing a user-friendly API for motion control, configuration, and communication.
Architecture
------------
The ``DSR_ROBOT2`` package acts as a ROS 2 wrapper, enabling robot control through Python scripts.
The architecture is composed by the following layers:
.. image:: ../images/etc/ros2_dsr_robot_flowchart_.png
:alt: ROS2 Interface
:width: 100%
:align: center
.. raw:: html
- **DSR_ROBOT2** (Python Interface): Publishes commands via ROS 2 topics/services and interacts with `dsr_controller2`.
- **dsr_controller2**: Translates ROS 2 service and topic commands into calls to the Doosan robot control library (DRFL).
- **DRFL** (Doosan Robotics Framework Library): C++ API for communicating with the robot controller software.
- **DRCF** (Doosan Robot Controller Framework): The low-level controller running on the robot or emulator.
Quick Start
--------------------------------------
Below is a complete, minimal script to move the robot to a single position. You can save this as a Python file and run it directly after launching the simulation.
.. code-block:: python
import rclpy
import DR_init
import sys
def main(args=None):
rclpy.init(args=args)
ROBOT_ID = "dsr01"
ROBOT_MODEL = "m1013"
DR_init.__dsr__id = ROBOT_ID
DR_init.__dsr__model = ROBOT_MODEL
node = rclpy.create_node('example_py', namespace=ROBOT_ID)
DR_init.__dsr__node = node
from DSR_ROBOT2 import movej, posj, set_robot_mode, ROBOT_MODE_AUTONOMOUS
set_robot_mode(ROBOT_MODE_AUTONOMOUS)
target_pos = posj(0, 0, 90.0, 0, 90.0, 0)
movej(target_pos, vel=100, acc=100)
print("Example complete")
rclpy.shutdown()
if __name__ == '__main__':
main()
Setup and Launch
----------------
This section explains how to configure and execute basic motion control using the ``DSR_ROBOT2`` interface.
.. note::
For practical usage, refer to the ``dsr_example2`` package.
**1. Initializing the Robot Configuration**
Before any operation, you must specify the robot's ID and model name.
The ``DR_init`` module is used to store this configuration.
.. code-block:: python
import DR_init
ROBOT_ID = "dsr01"
ROBOT_MODEL= "m1013"
DR_init.__dsr__id = ROBOT_ID
DR_init.__dsr__model = ROBOT_MODEL
**2. Setting up the ROS 2 Node**
Communication in ROS 2 is handled through nodes. You must initialize the `rclpy` library and create a node giving the namespace.
This node is then assigned to the ``DR_init`` module, enabling the library to communicate over the ROS 2 network.
.. code-block:: python
import rclpy
rclpy.init(args=args)
node = rclpy.create_node('single_robot_simple_py', namespace=ROBOT_ID)
DR_init.__dsr__node = node
**3. Importing Robot Control Functions Needed**
The core functionalities for robot control, such as movement commands and position definitions, are imported from the ``DSR_ROBOT2`` library.
.. code-block:: python
from DSR_ROBOT2 import movej, movejx, movesj, movesx, movel, movec
from DSR_ROBOT2 import posj, posx
from DSR_ROBOT2 import ROBOT_MODE_AUTONOMOUS
.. caution::
``DSR_ROBOT2`` import should come after initializing the ROS 2 node (``DR_init.__dsr__node``).
**4. Setting the Robot's Operational Mode and Speed**
Before sending motion commands or settings, the robot must be set to the correct mode.
- ``ROBOT_MODE_AUTONOMOUS`` : The robot can be controlled and moved.
- ``ROBOT_MODE_MANUAL`` : For robot settings, such as adding tools to the end-effector.
You can also set default global velocities and accelerations if you want.
.. code-block:: python
set_robot_mode(ROBOT_MODE_AUTONOMOUS)
set_velx(30, 20) # Set global task speed: 30(mm/sec), 20(deg/sec)
set_accx(60, 40) # Set global task acceleration: 60(mm/sec2), 40(deg/sec2)
**5. Defining Positions**
You can define target positions mainly in two primary coordinate systems:
- **Joint Space** (``posj``): Defines the angular position of each of the robot's six joints.
- **Task Space** (``posx``): Defines the position (X, Y, Z) and orientation (Roll, Pitch, Yaw) of the robot's end-effector (or tool).
.. code-block:: python
# Joint space position: (j1, j2, j3, j4, j5, j6)
p1 = posj(0, 0, 90.0, 0, 90.0, 0)
# Task space position: (x, y, z, r, p, y)
x1 = posx(400, 500, 800.0, 0.0, 180.0, 0.0)
**6. Executing a Motion Command**
With a target position defined, you can command the robot to move. The ``movej`` function, for example, moves the robot to a specified joint position.
You can override the global speed and acceleration for specific movements.
.. code-block:: python
# Move to joint position p1 with a velocity of 100 deg/s and acceleration of 100 deg/s^2
movej(p1, vel=100, acc=100)
**7. Launch and Execute**
Setup and build the node. Now you can move the robot as you want.
.. code-block:: bash
ros2 launch dsr_bringup2 dsr_bringup2_rviz.launch.py
Run in a new terminal the node you created:
.. code-block:: bash
ros2 run
# ex> ros2 run dsr_example single_robot_simple
**Other Motion APIs**
The library provides various other motion commands (e.g., ``movel`` for linear motion, ``movec`` for circular motion)
to accommodate different application needs. |br|
Check the
:ref:`Full Python API Reference `
or the links below for more details.
References
----------
- `ROS2 Manual (old version) `_
- `DRFL C++ API Manual `_
- `DRL Programming Manual `_