Wiki
YAML與spawner啟動過程
約 2 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
本節連線模型、管理器、控制器引數和 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與控制介面 · 下一篇:從零編寫模擬硬體外掛