Wiki
YAML与launch启动过程
Existing English translations were reused. 21 current source blocks remain in Simplified Chinese, without triggering paid translation.
本节把模型、控制器配置和启动文件连接起来,第一次运行你自己的工作区。
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.Run output and chronological order
在 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.Points to note in this example
修改 launch 或 YAML 后,确认安装空间确实使用新内容。--symlink-install 能简化资源迭代,但新增文件、改变安装规则或 C++ 修改后仍应重新构建。
返回 Humble 总览 · 上一篇:URDF与控制接口 · 下一篇:从零编写模拟硬件插件