> For the complete documentation index, see [llms.txt](https://artem-hachatryan.gitbook.io/ros-translation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://artem-hachatryan.gitbook.io/ros-translation/glava-12.-servoprivody-dynamixel-i-ros/12.9-nastroika-i-zapusk-dynamixel_controllers/12.9.2-launch-fail-dynamixel_controllers.md).

# Подглава 12.9.2 launch-файл dynamixel\_controllers

Файл dynamixels.launch в каталоге rbx1\_dynamixels/launch показывает, как запустить сервоконтроллеры, когда у нас есть контроллер USB2Dynamixel на устройстве /dev/ttyUSB0 и два сервопривода Dynamixel на шине с аппаратными идентификаторами 1 и 2. Давайте взглянем на него сейчас:

```
<launch>
    <param name="/use_sim_time" value="false" />
    
    <!-- Load the URDF/Xacro model of our robot -->
        <param name="robot_description" command="$(find xacro)/xacro.py '$(find 
rbx1_description)/urdf/turtlebot_with_head.xacro'" />
    <!-- Publish the robot state -->
        <node name="robot_state_publisher" pkg="robot_state_publisher" 
type="state_publisher">
        <param name="publish_frequency" value="20.0" />
    </node>
    
    <!-- Start the Dynamixel low-level driver manager with parameters -->
    <node name="dynamixel_manager" pkg="dynamixel_controllers" 
         type="controller_manager.py" required="true" output="screen">
        <rosparam>
            namespace: turtlebot_dynamixel_manager
             serial_ports:
                 dynamixel_ax12:
                     port_name: "/dev/ttyUSB0"
                     baud_rate: 1000000
                     min_motor_id: 1
                     max_motor_id: 2
                     update_rate: 20
         </rosparam>
    </node>
    
    <!-- Load the joint controller configuration from a YAML file -->
    <rosparam file="$(find rbx1_dynamixels)/config/dynamixel_params.yaml" 
command="load" />

    <!-- Start the head pan and tilt controllers -->
    <node name="dynamixel_controller_spawner_ax12" pkg="dynamixel_controllers" 
    type="controller_spawner.py" 
        args="--manager=turtlebot_dynamixel_manager  
              --port=dynamixel_ax12  
              --type=simple  
        head_pan_joint  
        head_tilt_joint" 
        output="screen" />
    <!-- Start the Dynamixel Joint States Publisher -->
    
    <node name="dynamixel_joint_states_publisher" pkg="rbx1_dynamixels" 
type="dynamixel_joint_state_publisher.py" output="screen" />
    <!-- Start all Dynamixels in the relaxed state -->
    <node pkg="rbx1_dynamixels" type="relax_all_servos.py" 
name="relax_all_servos" />
</launch>
```

Если ваш контроллер USB2Dynamixel находится на устройстве, отличном от /dev/ttyUSB0, и / или ваши идентификаторы сервоприводов отличаются от 1 и 2, отредактируйте этот файл сейчас, прежде чем идти дальше.

launch-файл сначала загружает модель URDF для робота и запускает узел robot\_state\_publisher для публикации состояния робота в tf. Затем мы запускаем узел controller\_manager.py, загружаем файл dynamixels\_param.yaml, который мы рассматривали ранее, затем порождает пару совместных контроллеров, по одному для каждого сервопривода.

Следующий запущенный узел называется dynamixel\_joint\_state\_publisher.py и находится в каталоге rbx1\_dynamixels/nodes. Он не является частью пакета dynamixel\_controllers, но нам необходимо исправить одно несоответствие в том, как пакет публикует совместные состояния. Вместо использования стандартного типа сообщения ROS JointState, который мы ввели ранее, пакет dynamixel\_controllers использует пользовательский тип сообщения для публикации состояний шарниров, включая некоторую дополнительную полезную информацию, такую как температура сервопривода. Если вы посмотрите на код узла dynamixel\_joint\_state\_publisher.py, вы увидите, что он просто переиздает пользовательскую информацию о совместном состоянии как стандартное сообщение JointState в теме /joint\_states.

Наконец, в launch-файлe запускается узел relax\_all\_servos.py, находящийся в каталоге rbx1\_dynamixels/nodes, который ослабляет крутящий момент на каждом сервоприводе и устанавливает разумный предел скорости и крутящего момента по умолчанию. (Подробнее об этом ниже.)
