Skip to content

Wiki

YAML与spawner启动过程

About 2 min read

Existing English translations were reused. 18 current source blocks remain in Simplified Chinese, without triggering paid translation.

本节连接模型、管理器、控制器参数和 spawner。控制器参数要明确交给控制器,而不能只交给管理器。

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
    position_hold:
      type: jazzy_position_controller/PositionHold
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]
    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 登记 update_rate 和控制器类型;各控制器自己的 ros__parameters 保存 joints、接口和容差。

trajectory_controller 与 position_hold 暂时只登记,启动文件不会加载它们,因此自编控制器包可以稍后再创建。

2.示例 2:完整启动文件

保存为 launch/two_joint.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 Command, LaunchConfiguration
from launch_ros.actions import Node
from launch_ros.parameter_descriptions import ParameterValue


def generate_launch_description():
    share = Path(get_package_share_directory('jazzy_control_hardware'))
    model = LaunchConfiguration('model')
    config = str(share / 'config' / 'controllers.yaml')
    description = ParameterValue(Command(['xacro ', model]), value_type=str)
    return LaunchDescription([
        DeclareLaunchArgument('model', default_value=str(share / 'urdf' / 'two_joint.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], output='screen'),
        Node(package='controller_manager', executable='spawner',
             arguments=['joint_state_broadcaster', '-c', '/controller_manager',
                        '--param-file', config], output='screen'),
        Node(package='controller_manager', executable='spawner',
             arguments=['forward_position_controller', '-c', '/controller_manager',
                        '--param-file', config], output='screen'),
    ])

2.1.执行顺序

robot_state_publisher 发布 robot_description,Jazzy 管理器接收这个模型。两个 spawner 等待管理器服务,再加载、配置和激活控制器。LaunchDescription 中的进程可以并发启动,列表顺序不是初始化完成顺序。

这里 --param-file 将 YAML 交给 spawner。管理器读取同一文件来登记类型,不表示文件中的所有控制器参数会自动进入控制器节点。

3.构建运行

cd ~/ros2_control_jazzy_ws
colcon build --symlink-install --packages-select jazzy_control_hardware
source install/setup.bash
ros2 launch jazzy_control_hardware two_joint.launch.py

另一终端:

source /opt/ros/jazzy/setup.bash
source ~/ros2_control_jazzy_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

GenericSystem 的反馈应很快对应目标。下一步换成自己的模拟后端后,可以用相同命令观察逐渐收敛的响应。

3.1.检查方法

找不到包时检查 build 与 source;spawner 等待时检查管理器是否已取得模型;控制器配置失败时查看该控制器日志中的参数内容。不要只增加等待时间掩盖模型或插件错误。


返回 Jazzy 总览 · 上一篇:URDF与控制接口 · 下一篇:从零编写模拟硬件插件