{"id":5098,"date":"2026-01-10T17:53:35","date_gmt":"2026-01-10T17:53:35","guid":{"rendered":"https:\/\/learnbydoing.dev\/?p=5098"},"modified":"2026-01-10T21:46:54","modified_gmt":"2026-01-10T21:46:54","slug":"configuring-and-launching-controllers-in-ros-2-with-ros2_control","status":"publish","type":"post","link":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/","title":{"rendered":"Configuring and Launching Controllers in ROS 2 with ros2_control"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"5098\" class=\"elementor elementor-5098\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e28ab35 e-flex e-con-boxed e-con e-parent\" data-id=\"e28ab35\" data-element_type=\"container\" data-e-type=\"container\" id=\"content\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-62ab6e3 e-con-full e-flex e-con e-child\" data-id=\"62ab6e3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-62ab203 elementor-align-center elementor-widget elementor-widget-post-info\" data-id=\"62ab203\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"post-info.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-inline-items elementor-icon-list-items elementor-post-info\">\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-2c98363 elementor-inline-item\" itemprop=\"about\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-terms\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-post-info__terms-list\">\n\t\t\t\t<span class=\"elementor-post-info__terms-list-item\">ROS 2<\/span>, <span class=\"elementor-post-info__terms-list-item\">Tutoriales<\/span>\t\t\t\t<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0650e10 e-con-full e-flex e-con e-child\" data-id=\"0650e10\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ac19582 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"ac19582\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"75\" height=\"75\" viewbox=\"0 0 75 75\" fill=\"none\"><path d=\"M74.9999 75H13.1889V73.0002H71.5859L0.460938 1.87521L1.87515 0.460999L73.0001 71.586V13.1889H74.9999V75Z\" fill=\"white\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-47aa245d e-flex e-con-boxed e-con e-parent\" data-id=\"47aa245d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c16836 elementor-widget elementor-widget-image\" data-id=\"0c16836\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2-1024x576.webp\" class=\"attachment-large size-large wp-image-5077\" alt=\"\" srcset=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2-1024x576.webp 1024w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2-300x169.webp 300w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2-768x432.webp 768w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2-1536x864.webp 1536w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2-18x10.webp 18w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp 1920w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4bc31ca3 elementor-widget elementor-widget-text-editor\" data-id=\"4bc31ca3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"399\" data-end=\"732\">When a robotic system starts moving real or simulated actuators, it enters one of the most delicate phases of its entire architecture: control. In ROS 2, this responsibility is handled by <strong data-start=\"587\" data-end=\"603\">ros2_control<\/strong>, a framework designed to manage the interaction between high-level software and hardware in a modular, extensible, and safe way.<br \/><br \/><\/p><p data-start=\"734\" data-end=\"1081\">The goal of ros2_control is to clearly separate <strong data-start=\"782\" data-end=\"806\">hardware description<\/strong>, <strong data-start=\"808\" data-end=\"836\">controller configuration<\/strong>, and <strong data-start=\"842\" data-end=\"864\">runtime activation<\/strong>, avoiding rigid or hard-to-maintain solutions. In this article, we walk through the complete operational flow: configuration using YAML, controller startup, and runtime interaction through the Command Line Interface.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12a4ca0 elementor-widget elementor-widget-text-editor\" data-id=\"12a4ca0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"1234\" data-end=\"1282\">\ud83e\udd14<strong> Why ros2_control is central to modern robotic systems<\/strong><\/h3><p data-start=\"1149\" data-end=\"1503\">ros2_control was created to solve a very concrete problem: how to manage the control of different robots, with different hardware, without rewriting high-level logic every time. The framework introduces a clear separation between <strong data-start=\"1379\" data-end=\"1402\">hardware interfaces<\/strong> and <strong data-start=\"1407\" data-end=\"1422\">controllers<\/strong>, allowing one component to be replaced without affecting the rest of the system.<br \/><br \/><\/p><p data-start=\"1505\" data-end=\"1792\">This approach is essential when working with multiple robots, simulation and real hardware, or when transitioning from a test platform to an industrial setup. Configuration is no longer hard-coded inside nodes but becomes an external, editable, and versionable description of the system.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4229593 elementor-widget elementor-widget-text-editor\" data-id=\"4229593\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"1799\" data-end=\"1839\"><strong>\ud83d\udee0\ufe0f Configuring controllers using YAML<\/strong><\/h3><p data-start=\"1841\" data-end=\"2090\">As systems grow in complexity, passing parameters individually through the CLI is no longer sustainable. This is where <strong data-start=\"1960\" data-end=\"1988\">YAML configuration files<\/strong> become essential, allowing the entire control setup to be described in a structured and readable way.<br \/><br \/><\/p><p data-start=\"2092\" data-end=\"2337\">In a ros2_control-based system, the YAML configuration defines the <strong data-start=\"2159\" data-end=\"2181\">controller manager<\/strong>, the controllers to be loaded, and their main properties. This enables the entire control stack to be initialized consistently with a single configuration.<\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ca20e2 elementor-widget elementor-widget-text-editor\" data-id=\"3ca20e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"2521\" data-end=\"2572\"><strong data-start=\"2207\" data-end=\"2224\">&lt;\/&gt; Complete Code<\/strong><\/h3><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c39e8e2 elementor-widget elementor-widget-code-highlight\" data-id=\"c39e8e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>controller_manager:\r\n  ros__parameters:\r\n    update_rate: 100\r\n\r\n    joint_state_broadcaster:\r\n      type: joint_state_broadcaster\/JointStateBroadcaster\r\n\r\n    diff_drive_controller:\r\n      type: diff_drive_controller\/DiffDriveController\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-961c2f7 elementor-widget elementor-widget-text-editor\" data-id=\"961c2f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"2586\" data-end=\"2639\"><strong>\ud83e\udde9 Breaking Down the Code \u2013 YAML Configuration<\/strong><\/h3><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-635f0ee elementor-widget elementor-widget-code-highlight\" data-id=\"635f0ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>controller_manager:\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-424d237 elementor-widget elementor-widget-text-editor\" data-id=\"424d237\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"4742\" data-end=\"4808\">This key identifies the <strong data-start=\"2749\" data-end=\"2771\">controller manager<\/strong>, the core node of ros2_control. It is responsible for loading, managing, and coordinating all controllers in the system.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-34e2893 elementor-widget elementor-widget-code-highlight\" data-id=\"34e2893\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros__parameters:\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ed0bb9 elementor-widget elementor-widget-text-editor\" data-id=\"0ed0bb9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"3271\" data-end=\"3402\">All runtime parameters for the controller manager and its controllers are declared inside this section. ROS 2 uses this namespace to clearly distinguish node parameters.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fbbfe30 elementor-widget elementor-widget-code-highlight\" data-id=\"fbbfe30\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>update_rate: 100\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc28add elementor-widget elementor-widget-text-editor\" data-id=\"dc28add\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"4153\" data-end=\"4283\">This parameter defines the control loop frequency in hertz. A value of 100 Hz is typical for mobile robots, providing a good balance between responsiveness and computational load.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7da3562 elementor-widget elementor-widget-code-highlight\" data-id=\"7da3562\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>joint_state_broadcaster:\r\n  type: joint_state_broadcaster\/JointStateBroadcaster\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a73b77a elementor-widget elementor-widget-text-editor\" data-id=\"a73b77a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The <strong data-start=\"3402\" data-end=\"3429\">joint_state_broadcaster<\/strong> publishes the state of the robot\u2019s joints. Without it, tools such as RViz, TF, and diagnostic nodes would not have access to the robot\u2019s kinematic information.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9790003 elementor-widget elementor-widget-code-highlight\" data-id=\"9790003\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>diff_drive_controller:\r\n  type: diff_drive_controller\/DiffDriveController\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-09ad431 elementor-widget elementor-widget-text-editor\" data-id=\"09ad431\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"3677\" data-end=\"3812\">This controller implements the kinematic model of a differential-drive robot, converting velocity commands into coherent wheel motions.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-37d278a elementor-widget elementor-widget-text-editor\" data-id=\"37d278a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"3819\" data-end=\"3871\"><strong>\ud83d\ude80 Launching ros2_control and loading controllers<\/strong><\/h3><p data-start=\"3873\" data-end=\"4155\">Once the configuration is defined, the controller manager is started as a ROS 2 node. Importantly, controllers are typically <strong data-start=\"3998\" data-end=\"4040\">loaded but not activated automatically<\/strong>. This design choice allows precise control over system initialization and reduces the risk of unexpected behavior.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a993aad elementor-widget elementor-widget-text-editor\" data-id=\"a993aad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"4162\" data-end=\"4208\">\ud83d\udec3 <strong>Runtime interaction via ros2_control CLI<\/strong><\/h3><p data-start=\"4210\" data-end=\"4420\">One of the major strengths of ros2_control is the ability to manage the control system <strong data-start=\"4297\" data-end=\"4311\">at runtime<\/strong>, without restarting the robot or the software. This is crucial during testing, debugging, and commissioning.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4e8e9d7 elementor-widget elementor-widget-text-editor\" data-id=\"4e8e9d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"2521\" data-end=\"2572\"><strong data-start=\"2207\" data-end=\"2224\">&lt;\/&gt; Complete Code \u2013 ros2_control CLI Commands<\/strong><\/h3><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-77d11f3 elementor-widget elementor-widget-code-highlight\" data-id=\"77d11f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>-ros2 control list_controllers\r\n\r\n-ros2 control load_controller diff_drive_controller\r\n\r\n-ros2 control set_controller_state diff_drive_controller active\r\n\r\n-ros2 control set_controller_state diff_drive_controller inactive<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-16e426a elementor-widget elementor-widget-text-editor\" data-id=\"16e426a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"4918\" data-end=\"4976\"><strong>\ud83e\udde9 Code Breakdown \u2013 CLI Commands<\/strong><\/h3>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bc70a6a elementor-widget elementor-widget-code-highlight\" data-id=\"bc70a6a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros2 control list_controllers\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d5a147 elementor-widget elementor-widget-text-editor\" data-id=\"6d5a147\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"1569\" data-end=\"1754\">This command queries the controller manager and returns a list of all controllers along with their current states. It is the first step to understand the system status.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed33290 elementor-widget elementor-widget-code-highlight\" data-id=\"ed33290\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros2 control load_controller diff_drive_controller\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76f6a8b elementor-widget elementor-widget-text-editor\" data-id=\"76f6a8b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"1569\" data-end=\"1754\">Here, the specified controller is loaded and initialized but not yet activated. This allows configuration checks before enabling actual control.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ca6dc74 elementor-widget elementor-widget-code-highlight\" data-id=\"ca6dc74\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros2 control set_controller_state diff_drive_controller active\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d4d05e7 elementor-widget elementor-widget-text-editor\" data-id=\"d4d05e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"1569\" data-end=\"1754\">This command transitions the controller into the <em data-start=\"5329\" data-end=\"5337\">active<\/em> state. From this moment on, it starts receiving commands and interacting with hardware.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-83cfd7f elementor-widget elementor-widget-code-highlight\" data-id=\"83cfd7f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-bash\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros2 control set_controller_state diff_drive_controller inactive\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-371ee39 elementor-widget elementor-widget-text-editor\" data-id=\"371ee39\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"5505\" data-end=\"5626\">This disables the controller without unloading it, which is useful during testing or when temporarily suspending control.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a4d5b58 elementor-widget elementor-widget-text-editor\" data-id=\"a4d5b58\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"5633\" data-end=\"5673\"><strong>\ud83d\udc8e The complete ros2_control workflow<\/strong><\/h3><p data-start=\"5675\" data-end=\"5978\">Putting everything together, the workflow becomes clear: the system is first described declaratively, then the controller manager is started, controllers are loaded, and finally activated when needed. This separation of responsibilities results in a modular, robust, and extensible control architecture.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-078e0ac elementor-widget elementor-widget-text-editor\" data-id=\"078e0ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"8212\" data-end=\"8228\"><strong>\ud83c\udfaf Conclusion<\/strong><\/h3><p data-start=\"6000\" data-end=\"6263\">In this article, you explored how a ros2_control-based system is configured, how controllers are defined and launched, and how they are managed at runtime through the CLI. Each step plays a precise role in making robotic control systems reliable and maintainable.<\/p><p data-start=\"6265\" data-end=\"6483\">In real applications, additional complexity arises: heterogeneous hardware, custom controllers, navigation integration, and fault handling. Addressing these challenges requires deeper understanding and guided practice.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c5d20e7 e-con-full e-flex e-con e-parent\" data-id=\"c5d20e7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e8bdddd elementor-bg-transform elementor-bg-transform-move-left elementor-cta--layout-image-left elementor-cta--mobile-layout-image-above elementor-cta--skin-classic elementor-animated-content elementor-widget elementor-widget-call-to-action\" data-id=\"e8bdddd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-cta\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg\" style=\"background-image: url(https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/plan_navigation.webp);\" role=\"img\" aria-label=\"plan_navigation\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h2 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t\tWant to learn more?\t\t\t\t\t<\/h2>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__description elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t\tIf you want to learn how to design and build professional robotic systems, check out our \"Self Driving and ROS 2 - Learn by doing! Odometry &amp; Control\" course\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t<a class=\"elementor-cta__button elementor-button elementor-size-\" href=\"\" target=\"_blank\">\n\t\t\t\t\t\tEnroll Now\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-ribbon elementor-ribbon-right\">\n\t\t\t\t<div class=\"elementor-ribbon-inner\">\n\t\t\t\t\tDISCOUNT\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>When a robotic system starts moving real or simulated actuators, it enters one of the most delicate phases of its entire architecture: control. In ROS 2, this responsibility is handled by ros2_control, a framework designed to manage the interaction between high-level software and hardware in a modular, extensible, and safe way. The goal of ros2_control [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":5077,"comment_status":"closed","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[45,43],"tags":[328,347,381,349,179,66,74,96,110,343,396,348,296,402,371,379,71,107,383,382,386,374,377,401,398,397,403,393,404,400,399],"class_list":["post-5098","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ros-2","category-tutorials","tag-antonio-brandi","tag-brandi","tag-c-robotics","tag-costmaps","tag-lbd","tag-learn-by-doing","tag-linux","tag-nav2","tag-navigation","tag-obstacle","tag-os2_control","tag-pc","tag-raspberry","tag-robot-controllers-ros-2","tag-robot-modeling-ros-2","tag-robotics-programming","tag-ros","tag-ros-2","tag-ros-2-advanced-tutorial","tag-ros-2-beginner-tutorial","tag-ros-2-best-practices","tag-ros-2-c-tutorial","tag-ros-2-cli-tools","tag-ros-2-control-cli","tag-ros-2-control-framework","tag-ros-2-controllers","tag-ros-2-differential-drive","tag-ros-2-professional-robotics","tag-ros-2-robotics-control","tag-ros-2-yaml-configuration","tag-ros2_control-tutorial"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Configuring and Launching Controllers in ROS 2 with ros2_control - Learn by Doing!<\/title>\n<meta name=\"description\" content=\"Learn how to configure and manage ros2_control in ROS 2 using YAML and CLI, from controller setup to runtime activation and control.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/learnbydoing.dev\/es\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configuring and Launching Controllers in ROS 2 with ros2_control\" \/>\n<meta property=\"og:description\" content=\"Learn by Doing!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/learnbydoing.dev\/es\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\" \/>\n<meta property=\"og:site_name\" content=\"Learn by Doing!\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-10T17:53:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-10T21:46:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Configuring and Launching Controllers in ROS 2 with ros2_control\",\"datePublished\":\"2026-01-10T17:53:35+00:00\",\"dateModified\":\"2026-01-10T21:46:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\"},\"wordCount\":746,\"publisher\":{\"@id\":\"https:\/\/learnbydoing.dev\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp\",\"keywords\":[\"antonio brandi\",\"brandi\",\"C++ robotics\",\"costmaps\",\"lbd\",\"learn by doing\",\"Linux\",\"nav2\",\"navigation\",\"obstacle\",\"os2_control\",\"pc\",\"Raspberry\",\"robot controllers ROS 2\",\"Robot modeling ROS 2\",\"robotics programming\",\"ROS\",\"ROS 2\",\"ROS 2 advanced tutorial\",\"ROS 2 beginner tutorial\",\"ROS 2 best practices\",\"ROS 2 C++ tutorial\",\"ROS 2 CLI tools\",\"ROS 2 control CLI\",\"ROS 2 control framework\",\"ROS 2 controllers\",\"ROS 2 differential drive\",\"ROS 2 professional robotics\",\"ROS 2 robotics control\",\"ROS 2 YAML configuration\",\"ros2_control tutorial\"],\"articleSection\":[\"ROS 2\",\"Tutorials\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\",\"url\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\",\"name\":\"Configuring and Launching Controllers in ROS 2 with ros2_control - Learn by Doing!\",\"isPartOf\":{\"@id\":\"https:\/\/learnbydoing.dev\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp\",\"datePublished\":\"2026-01-10T17:53:35+00:00\",\"dateModified\":\"2026-01-10T21:46:54+00:00\",\"description\":\"Learn how to configure and manage ros2_control in ROS 2 using YAML and CLI, from controller setup to runtime activation and control.\",\"breadcrumb\":{\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage\",\"url\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp\",\"contentUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/learnbydoing.dev\/es\/learn-by-doing-es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configuring and Launching Controllers in ROS 2 with ros2_control\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/learnbydoing.dev\/es\/#website\",\"url\":\"https:\/\/learnbydoing.dev\/es\/\",\"name\":\"Learn by Doing!\",\"description\":\"Learn Robotics the fun way\",\"publisher\":{\"@id\":\"https:\/\/learnbydoing.dev\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/learnbydoing.dev\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/learnbydoing.dev\/es\/#organization\",\"name\":\"Learn by Doing!\",\"url\":\"https:\/\/learnbydoing.dev\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/learnbydoing.dev\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png\",\"contentUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png\",\"width\":512,\"height\":512,\"caption\":\"Learn by Doing!\"},\"image\":{\"@id\":\"https:\/\/learnbydoing.dev\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/antonio-brandi-512166bb\/\"]},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\/\/learnbydoing.dev\/es\/author\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Configuring and Launching Controllers in ROS 2 with ros2_control - Learn by Doing!","description":"Learn how to configure and manage ros2_control in ROS 2 using YAML and CLI, from controller setup to runtime activation and control.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/learnbydoing.dev\/es\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/","og_locale":"es_ES","og_type":"article","og_title":"Configuring and Launching Controllers in ROS 2 with ros2_control","og_description":"Learn by Doing!","og_url":"https:\/\/learnbydoing.dev\/es\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/","og_site_name":"Learn by Doing!","article_published_time":"2026-01-10T17:53:35+00:00","article_modified_time":"2026-01-10T21:46:54+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#article","isPartOf":{"@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/"},"author":{"name":"","@id":""},"headline":"Configuring and Launching Controllers in ROS 2 with ros2_control","datePublished":"2026-01-10T17:53:35+00:00","dateModified":"2026-01-10T21:46:54+00:00","mainEntityOfPage":{"@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/"},"wordCount":746,"publisher":{"@id":"https:\/\/learnbydoing.dev\/es\/#organization"},"image":{"@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage"},"thumbnailUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp","keywords":["antonio brandi","brandi","C++ robotics","costmaps","lbd","learn by doing","Linux","nav2","navigation","obstacle","os2_control","pc","Raspberry","robot controllers ROS 2","Robot modeling ROS 2","robotics programming","ROS","ROS 2","ROS 2 advanced tutorial","ROS 2 beginner tutorial","ROS 2 best practices","ROS 2 C++ tutorial","ROS 2 CLI tools","ROS 2 control CLI","ROS 2 control framework","ROS 2 controllers","ROS 2 differential drive","ROS 2 professional robotics","ROS 2 robotics control","ROS 2 YAML configuration","ros2_control tutorial"],"articleSection":["ROS 2","Tutorials"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/","url":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/","name":"Configuring and Launching Controllers in ROS 2 with ros2_control - Learn by Doing!","isPartOf":{"@id":"https:\/\/learnbydoing.dev\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage"},"image":{"@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage"},"thumbnailUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp","datePublished":"2026-01-10T17:53:35+00:00","dateModified":"2026-01-10T21:46:54+00:00","description":"Learn how to configure and manage ros2_control in ROS 2 using YAML and CLI, from controller setup to runtime activation and control.","breadcrumb":{"@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#primaryimage","url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp","contentUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/12\/Titolo-2.webp","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/learnbydoing.dev\/configuring-and-launching-controllers-in-ros-2-with-ros2_control\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/learnbydoing.dev\/es\/learn-by-doing-es\/"},{"@type":"ListItem","position":2,"name":"Configuring and Launching Controllers in ROS 2 with ros2_control"}]},{"@type":"WebSite","@id":"https:\/\/learnbydoing.dev\/es\/#website","url":"https:\/\/learnbydoing.dev\/es\/","name":"Learn by Doing!","description":"Learn Robotics the fun way","publisher":{"@id":"https:\/\/learnbydoing.dev\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/learnbydoing.dev\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/learnbydoing.dev\/es\/#organization","name":"Learn by Doing!","url":"https:\/\/learnbydoing.dev\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/learnbydoing.dev\/es\/#\/schema\/logo\/image\/","url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png","contentUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png","width":512,"height":512,"caption":"Learn by Doing!"},"image":{"@id":"https:\/\/learnbydoing.dev\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/antonio-brandi-512166bb\/"]},{"@type":"Person","@id":"","url":"https:\/\/learnbydoing.dev\/es\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/5098","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/comments?post=5098"}],"version-history":[{"count":17,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/5098\/revisions"}],"predecessor-version":[{"id":5466,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/5098\/revisions\/5466"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/media\/5077"}],"wp:attachment":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/media?parent=5098"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/categories?post=5098"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/tags?post=5098"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}