---
title: "ROS2. Resumen de código"
description: "En este artículo encontraras código de uso habitual en la programación con ROS2."
featured_image: "https://robotica-facil-con-ros2.es/wp-content/uploads/2022/07/id3112p-ROS2-cheatsheet.png"
url: "https://robotica-facil-con-ros2.es/?p=3112"
date_modified: "2026-07-06T07:10:24+00:00"
---

En este artículo voy a ir recopilando código de uso frecuente para tenerlo a mano.

### LINEA DE COMANDO

#### Espacios de trabajo

###### Crear un espacio de trabajo

source /opt/ros/galactic/setup.bash
mkdir -p ~/dev_ws/src

###### Resolver dependencias

rosdep install -i --from-path src --rosdistro galactic -y

###### Compilar todo el espacio de trabajo

colcon build

#### Paquetes

###### Crear un paquete

ros2 pkg create &lt;package_name&gt; --build-type ament_python --dependencies rclpy

###### Crear un paquete con un ejecutable (nodo) vacío

ros2 pkg create &lt;package_name&gt; --node-name &lt;node_name&gt; --build-type ament_python --dependencies rclpy

###### Compilar un paquete

colcon build --packages-select &lt;package_name&gt;

### ARCHIVOS LAUNCH

#### PYTHON

#### Estructura básica

###### Indicando directamente las acciones en el constructor del objeto LaunchDescription

from launch import LaunchDescription

def generate_launch_description():
    return LaunchDescription([
        # Incluir aqu&iacute; las acciones:
        # action_1,
        # action_n,
    ])

#### Acciones

##### GENERICAS

###### DeclareLaunchArgument

from launch.actions import DeclareLaunchArgument

DeclareLaunchArgument(
    &#039;argument_name&#039;,
    default_value=&#039;A&#039;,
    description=&#039;Description text for the argument&#039;,
    choices=[&#039;A&#039;, &#039;B&#039;]
)

###### IncludeLaunchDescription

from launch.actions import IncludeLaunchDescription
from launch_ros.substitutions import FindPackageShare
from launch.launch_description_sources import PythonLaunchDescriptionSource


IncludeLaunchDescription(
    PythonLaunchDescriptionSource(
        [
            FindPackageShare(&#039;package_name&#039;), 
            &#039;/launch&#039;, &#039;/my_file.launch.py&#039;
        ],
        launch_arguments = {&#039;arg1_name&#039;: arg1_val, &#039;arg2_name&#039;: arg2_val}.items()
    )
)

###### SetLaunchConfiguration

from launch.actions import SetLaunchConfiguration
 
SetLaunchConfiguration(&#039;arg_name&#039;, &#039;arg_value&#039;)

###### SetEnvironmentVariable

from launch.actions import SetEnvironmentVariable

SetEnvironmentVariable(&#039;VAR_NAME&#039;, &#039;var_value&#039;)

###### UnsetEnvironmentVariable

from launch.actions import UnsetEnvironmentVariable

UnsetEnvironmentVariable(&#039;VAR_NAME&#039;)

###### LogInfo

from launch.actions import LogInfo

LogInfo(msg=&#039;My text&#039;)

###### GroupAction

from launch.actions import GroupAction

GroupAction(
    actions=[
        # Incluir aqu&iacute; las acciones:
        # action_1,
        # action_n,
    ]
)

###### ExecuteProcess

from launch.actions import ExecuteProcess

ExecuteProcess(
    cmd=[&#039;my_cmd&#039;],
    name=&#039;my_process&#039;,  
    output=&#039;both&#039;,       # Puede ser: screen, log, both.
    additional_env={&#039;env_var&#039;: &#039;env_var_value&#039;},
)

###### TimerAction

from launch.actions import TimerAction

TimerAction(period=5.0, actions=[action_1, action_n])

###### RegisterEventHandler

from launch.actions import RegisterEventHandler
from launch.event_handlers import &lt;event_handler&gt;

RegisterEventHandler(
    event_handler=&lt;event_handler&gt;( &lt;args&gt; )
)

##### ESPECIFICAS DE ROS

###### Node

from launch_ros.actions import Node

Node(
    package=&#039;package_name&#039;,
    executable=&#039;executable_name&#039;,
    name=&#039;node_name&#039;,
    exec_name=&#039;process_name&#039;,
    output=&#039;screen&#039;, 
    namespace=&#039;my_namespace&#039;,
    remappings=[(&quot;src_topic1&quot;, &quot;dest_topic1&quot;), (&quot;src_topic2&quot;, &quot;dest_topic2&quot;)],
    arguments=[&#039;-arg1_name&#039;, &#039;arg1_value&#039;, &#039;-arg2_name&#039;, &#039;arg2_value&#039;],
    parameter=[{&#039;param1&#039;: &#039;param1_value&#039;, &#039;param2&#039;: &#039;param2_value&#039;}],
    ros_arguments=[&#039;__ros_arg_name&#039;, &#039;value&#039;],
)

###### RosTimer

from launch_ros.actions import RosTimer

RosTimer(period=5.0, actions=[action1, action2])

###### SetParameter

from launch_ros.actions import SetParameter

SetParameter(name=&#039;param_name&#039;, value=&#039;param_value&#039;)

###### SetParameterFromFile

from launch_ros.actions import SetParameterFromFile

SetParametersFromFile(&#039;path/to/file.yaml&#039;)

###### SetRemap

from launch_ros.actions import SetRemap

SetRemap(src=&#039;src_topic&#039;, dst=&#039;dst_topic&#039;)

###### SetUseSimTime

from launch_ros.actions import SetUseSimTime

SetUseSimTime(True)

###### PushRosNamespace

from launch_ros.actions import PushRosNamespace

PushRosNamespace(&#039;my_namespace&#039;)

#### Sustituciones

#### Condiciones

###### IfCondition

# La acci&oacute;n se ejecutara si el argumento my_arg = &#039;true&#039;.
condition=IfCondition(LaunchConfiguration(&#039;my_arg&#039;))

# La acci&oacute;n se ejecutara si la variable de entorno USER = &#039;Alex&#039;.
condition=IfCondition(PythonExpression([&quot;&#039;&quot;, EnvironmentVariable(&#039;USER&#039;), &quot;&#039; == &#039;Alex&#039;&quot;]))

###### UnlessCondition

from launch.conditions import IfCondition

# La acci&oacute;n se ejecutara si el argumento my_arg = &#039;false&#039;.
condition=UnlessCondition(LaunchConfiguration(&#039;my_arg&#039;))

# La acci&oacute;n se ejecutara si la variable de entorno USER != &#039;Alex&#039;.
condition=UnlessCondition(PythonExpression([&quot;&#039;&quot;, EnvironmentVariable(&#039;USER&#039;), &quot;&#039; == &#039;Alex&#039;&quot;]))

###### LaunchConfigurationEquals

from launch.conditions import UnlessCondition

# La acci&oacute;n se ejecutara si el argumento user = &#039;Alex&#039;.
condition=LaunchConfigurationEquals(&#039;user&#039;, &#039;Alex&#039;)

# La acci&oacute;n se ejecutara si el valor del argumentos user y my_name coinciden.
condition=LaunchConfigurationEquals(&#039;user&#039;, LaunchConfiguration(&#039;my_name&#039;))

#### Eventos

#### XML

#### YAML

### TF2

#### Transformaciones estáticas

###### Publicar una transformación estática

from geometry_msgs.msg import TransformStamped
from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster


self.static_tf_broadcaster = StaticTransformBroadcaster(self)

tf = TransformStamped()
tf.header.stamp = self.get_clock().now().to_msg()
tf.header.frame_id = &#039;parent_frame&#039;
tf.child_frame_id = &#039;child_frame&#039;

tf.transform.translation.x = &lt;translation_x_value&gt;
tf.transform.translation.y = &lt;translation_y_value&gt;
tf.transform.translation.z = &lt;translation_z_value&gt;

tf.transform.rotation.x = &lt;quaternion_x_value&gt;
tf.transform.rotation.y = &lt;quaternion_y_value&gt;
tf.transform.rotation.z = &lt;quaternion_z_value&gt;
tf.transform.rotation.w = &lt;quaternion_w_value&gt;

self.static_tf_broadcaster.sendTransform(tf)

###### Convertir de ángulos de Euler a cuaternion

from tf_transformations import quaternion_from_euler

quat = quaternion_from_euler(roll, pitch, yaw)

###### Convertir de cuaternion a ángulos de Euler

from tf_transformations import euler_from_quaternion

euler = euler_from_quaternion(x, y, z, w)

#### Robot State Publisher

robot_state_publisher_node = Node(
    package=&#039;robot_state_publisher&#039;,
    executable=&#039;robot_state_publisher&#039;,
    name=&#039;my_robot_state_publisher&#039;,
    emulate_tty=True,
    parameters=[{&#039;use_sim_time&#039;: True, &#039;robot_description&#039;: xml}],
    remappings=[(&quot;/robot_description&quot;, &quot;/my_robot_description&quot;)
    ],
    output=&quot;screen&quot;
)