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 기본 동작
robot_description매개변수에서 URDF를 파싱한다.- 모든 가동 관절(revolute, continuous, prismatic)의 목록을 추출한다.
- 각 관절의 위치를 기본값(0 또는 URDF에 정의된 초기값)으로 설정한다.
- 설정된 주기(
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. 주요 매개변수
| 매개변수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
rate | int | 10 | 발행 주파수 (Hz) |
source_list | string[] | [] | 관절 상태를 수신할 추가 토픽 목록 |
publish_default_positions | bool | true | URDF에 미정의된 관절의 기본 위치(0) 발행 여부 |
publish_default_velocities | bool | false | 기본 속도(0) 발행 여부 |
publish_default_efforts | bool | false | 기본 힘/토크(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)