Вариант реализации регулирования

Файл step_0.launch.py

def generate_launch_description():
    namespace = 'waterstrider'
    config_file = os.path.join(get_package_share_directory('lesson_07'),
                                       'config',
                                       'control-config.yaml')

    return LaunchDescription([
        Node(
            package='lesson_07',
            namespace=namespace,
            executable='pid_node',
            name='pid_distance',
            parameters=[config_file]
        ),
        Node(
            package='lesson_07',
            namespace=namespace,
            executable='pid_node',
            name='pid_heading',
            parameters=[config_file]
        ),
        Node(
            package='lesson_07',
            namespace=namespace,
            executable='step_0',
            name='controller'
        ),
        Node(
            package='rviz2',
            namespace=namespace,
            executable='rviz2',
            name='rviz2',
            arguments=['-d' + config('lesson_07', 'waterstrider.rviz')]
        ),
    ])

Важные моменты

  1. Дважды используется одна и та же нода PID-регулятора

  2. Использование config-файла

lesson_07/config/control-config.yaml

/**:
  pid_heading:
    ros__parameters:
        angular: true
        clamp: 1.0
        inverted: false
        kd: 0.9
        ki: 0.0
        kp: 0.9
        start_type_description_service: true
        use_sim_time: false
  pid_distance:
    ros__parameters:
        angular: true
        clamp: 1.0
        inverted: false
        kd: 0.9
        ki: 0.0
        kp: 0.4
        start_type_description_service: true
        use_sim_time: false

Чтобы получить первое приближение этих файлов можно воспользоваться rqt (parameter reconfigure):

rqt (parameter reconfigure)