659.98 joint_state_publisher를 이용한 관절 상태 발행

1. 개요

joint_state_publisher는 URDF에 정의된 가동 관절의 상태(sensor_msgs/msg/JointState)를 /joint_states 토픽으로 발행하는 ROS2 노드이다. 이 노드는 주로 실제 하드웨어 드라이버가 없는 개발 초기 단계나 시각화 목적으로 사용되며, robot_state_publisher에 관절 위치 데이터를 공급하여 TF2 변환 트리를 완성한다.

2. 역할과 위치

2.1 시스템에서의 위치

URDF → robot_state_publisher → TF2 (/tf, /tf_static)
                 ↑
          /joint_states
                 ↑
       joint_state_publisher (또는 하드웨어 드라이버)

joint_state_publisher/joint_states 토픽의 소스로서, 실제 하드웨어 드라이버(예: ros2_control)의 대체 역할을 수행한다.

2.2 사용 시나리오

시나리오역할
URDF 모델 검증 및 시각화관절 위치를 기본값(0)으로 발행하여 RViz2에서 로봇 모델 확인
시뮬레이션 없는 개발실제 하드웨어 없이 소프트웨어 테스트 가능
다중 관절 소스 통합여러 소스의 관절 데이터를 단일 /joint_states로 병합

3. 동작 방식

3.1 기본 동작

  1. robot_description 매개변수에서 URDF를 파싱한다.
  2. 모든 가동 관절(revolute, continuous, prismatic)의 목록을 추출한다.
  3. 각 관절의 위치를 기본값(0 또는 URDF에 정의된 초기값)으로 설정한다.
  4. 설정된 주기(rate 매개변수)로 JointState 메시지를 발행한다.

3.2 다중 관절 소스 통합

source_list 매개변수를 통하여 다른 토픽에서 발행되는 관절 상태를 수신하고, 이를 joint_state_publisher가 관리하는 관절과 병합하여 통합된 /joint_states로 발행할 수 있다.

joint_state_publisher:
  ros__parameters:
    rate: 50
    source_list:
      - "/arm_joint_states"        # 매니퓰레이터 관절
      - "/gripper_joint_states"    # 그리퍼 관절

이 설정에서 joint_state_publisher/arm_joint_states/gripper_joint_states를 구독하고, 두 토픽의 관절 데이터를 병합하여 /joint_states로 발행한다.

4. 런치 파일에서의 사용

from launch import LaunchDescription
from launch_ros.actions import Node


def generate_launch_description():
    return LaunchDescription([
        Node(
            package='joint_state_publisher',
            executable='joint_state_publisher',
            name='joint_state_publisher',
            parameters=[{
                'rate': 50,
                'source_list': [],
            }],
        ),
    ])

5. 주요 매개변수

매개변수유형기본값설명
rateint10발행 주파수 (Hz)
source_liststring[][]관절 상태를 수신할 추가 토픽 목록
publish_default_positionsbooltrueURDF에 미정의된 관절의 기본 위치(0) 발행 여부
publish_default_velocitiesboolfalse기본 속도(0) 발행 여부
publish_default_effortsboolfalse기본 힘/토크(0) 발행 여부

6. 실제 하드웨어와의 구분

실제 로봇 운영 시에는 joint_state_publisher를 사용하지 않고, 하드웨어 드라이버가 직접 /joint_states를 발행한다.

환경/joint_states 발행 주체
개발/시각화joint_state_publisher
시뮬레이션 (Gazebo)Gazebo ros2_control 플러그인
실제 하드웨어ros2_control 하드웨어 인터페이스

런치 파일에서 조건부로 joint_state_publisher를 활성화/비활성화하여 환경에 따른 전환을 수행한다.

use_sim = LaunchConfiguration('use_sim')

joint_state_publisher = Node(
    package='joint_state_publisher',
    executable='joint_state_publisher',
    condition=UnlessCondition(use_sim),
)

7. 요약

joint_state_publisher는 URDF의 가동 관절에 대한 기본 관절 상태를 발행하는 노드로, 개발 초기 단계의 모델 검증과 시각화에 활용된다. 다중 관절 소스의 통합 기능을 제공하며, 실제 하드웨어 운용 시에는 ros2_control 기반의 하드웨어 드라이버로 대체된다.


참고 문헌 및 출처

  • joint_state_publisher 패키지, https://github.com/ros/joint_state_publisher (ROS2 Humble 브랜치)
  • ROS2 공식 문서, “URDF Tutorials”, https://docs.ros.org/en/humble/Tutorials/Intermediate/URDF/ (ROS2 Humble Hawksbill)