跳到正文

Wiki

YAML與launch啟動過程

約 3 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

本節把模型、控制器配置和啟動檔案連線起來,第一次執行你自己的工作區。

1.示例 1:編寫控制器配置

將以下完整內容儲存為 config/controllers.yaml:

controller_manager:
  ros__parameters:
    update_rate: 100
    joint_state_broadcaster:
      type: joint_state_broadcaster/JointStateBroadcaster
    forward_position_controller:
      type: forward_command_controller/ForwardCommandController
    trajectory_controller:
      type: joint_trajectory_controller/JointTrajectoryController
    learn_position_controller:
      type: learn_position_controller/HoldController
forward_position_controller:
  ros__parameters:
    joints: [joint1, joint2]
    interface_name: position
trajectory_controller:
  ros__parameters:
    joints: [joint1, joint2]
    command_interfaces: [position]
    state_interfaces: [position, velocity]
    state_publish_rate: 50.0
    action_monitor_rate: 20.0
    allow_partial_joints_goal: false
    constraints:
      goal_time: 2.0
      stopped_velocity_tolerance: 0.05
      joint1: {trajectory: 0.3, goal: 0.03}
      joint2: {trajectory: 0.3, goal: 0.03}

1.1.引數屬於誰

controller_manager.ros__parameters 宣告更新頻率和可載入的控制器型別;forward_position_controller.ros__parameters 才是這個控制器自己的引數。

trajectory_controller、learn_position_controller 現在只是登記型別。啟動檔案只加載狀態廣播器和命令轉發器,所以後一個自編外掛尚未建立也不影響當前啟動。

2.示例 2:編寫完整啟動檔案

儲存為 launch/mini.launch.py:

from pathlib import Path
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import Node
from launch_ros.parameter_descriptions import ParameterValue
from launch.substitutions import Command


def generate_launch_description():
    share = get_package_share_directory('learn_control_hardware')
    model = LaunchConfiguration('model')
    description = ParameterValue(Command(['xacro ', model]), value_type=str)
    config = str(Path(share) / 'config' / 'controllers.yaml')
    return LaunchDescription([
        DeclareLaunchArgument('model', default_value=str(Path(share) / 'urdf' / 'mini.urdf')),
        Node(package='robot_state_publisher', executable='robot_state_publisher',
             parameters=[{'robot_description': description}], output='screen'),
        Node(package='controller_manager', executable='ros2_control_node',
             parameters=[config],
             remappings=[('~/robot_description', '/robot_description')], output='screen'),
        Node(package='controller_manager', executable='spawner',
             arguments=['joint_state_broadcaster', '-c', '/controller_manager'], output='screen'),
        Node(package='controller_manager', executable='spawner',
             arguments=['forward_position_controller', '-c', '/controller_manager'], output='screen'),
    ])

2.1.執行關係

robot_state_publisher 取得展开后的 robot_description
  → 通过 /robot_description 发布模型
ros2_control_node 订阅模型
  → ResourceManager 加载 GenericSystem
spawner 等待管理器服务
  → 加载、配置并激活控制器

不要把 LaunchDescription 列表順序當成“上一項初始化完成後才執行下一項”。這些程序可以併發啟動;spawner 自己等待管理器服務。等待超時應該排查管理器為何沒準備好。

ParameterValue(..., value_type=str) 明確告訴引數系統,這是完整 XML 字串。~/robot_description 中的 ~ 表示節點私有名稱,通過 remapping 接到 /robot_description。

3.編譯執行

cd ~/ros2_control_humble_ws
colcon build --symlink-install --packages-select learn_control_hardware
source install/setup.bash
ros2 launch learn_control_hardware mini.launch.py

另開終端,source 系統和學習工作區:

source /opt/ros/humble/setup.bash
source ~/ros2_control_humble_ws/install/setup.bash
ros2 control list_controllers
ros2 control list_hardware_interfaces
ros2 topic pub --once /forward_position_controller/commands \
  std_msgs/msg/Float64MultiArray "{data: [0.4, -0.2]}"
ros2 topic echo /joint_states

3.1.執行輸出與時間順序

在 GenericSystem 預設映象行為下,狀態會很快對應命令。從零編寫模擬硬體外掛換成一階響應外掛後,同樣的目標會表現為逐漸靠近。

陣列 [0.4, -0.2] 的順序由控制器 joints 配置決定。JointState 輸出的陣列順序則要對照它自己的 name 欄位。

4.示例 3:通過引數換模型

ros2 launch learn_control_hardware mini.launch.py model:=/tmp/mini_bad.urdf

先停止正常例項,再做錯誤實驗。這個 model 引數也會在序列埠章節用來選擇不同後端。

4.1.本示例需要注意的點

修改 launch 或 YAML 後,確認安裝空間確實使用新內容。--symlink-install 能簡化資源迭代,但新增檔案、改變安裝規則或 C++ 修改後仍應重新構建。

參考:Humble Controller Manager。


返回 Humble 總覽 · 上一篇:URDF與控制介面 · 下一篇:從零編寫模擬硬體外掛