659.99 joint_state_publisher_gui를 이용한 관절 수동 제어
1. 개요
joint_state_publisher_gui는 joint_state_publisher에 GUI(Graphical User Interface) 슬라이더를 추가한 노드이다. 각 가동 관절에 대하여 슬라이더를 제공하여 사용자가 관절 위치를 수동으로 조절할 수 있게 한다. 이 도구는 URDF 모델의 관절 범위 검증, 로봇 자세 시각화, 티칭(teaching) 작업 등에 활용된다.
2. 기능
2.1 GUI 인터페이스
joint_state_publisher_gui는 Qt 기반의 GUI 윈도우를 생성하며, URDF에 정의된 각 가동 관절에 대하여 다음을 표시한다.
| GUI 요소 | 설명 |
|---|---|
| 관절 이름 | URDF에서 정의된 관절 이름 |
| 슬라이더 | 관절 위치를 연속적으로 조절하는 수평 슬라이더 |
| 현재 값 표시 | 관절의 현재 위치 값 (rad 또는 m) |
| 최솟값/최댓값 | URDF의 <limit> 요소에서 정의된 범위 |
2.2 관절별 슬라이더 범위
| 관절 유형 | 슬라이더 범위 |
|---|---|
revolute | lower ~ upper (URDF <limit> 정의) |
continuous | -\pi ~ \pi (기본값) |
prismatic | lower ~ upper (URDF <limit> 정의) |
3. 사용 방법
3.1 런치 파일에서의 사용
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
# URDF 로드
robot_description = ... # Xacro 처리 또는 파일 읽기
return LaunchDescription([
# robot_state_publisher
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{'robot_description': robot_description}],
),
# joint_state_publisher_gui
Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
),
# RViz2
Node(
package='rviz2',
executable='rviz2',
arguments=['-d', rviz_config_path],
),
])
3.2 명령행에서의 실행
# robot_state_publisher 실행 (별도 터미널)
ros2 launch my_robot display.launch.py
# 또는 독립적으로 실행
ros2 run joint_state_publisher_gui joint_state_publisher_gui
4. joint_state_publisher와의 차이
| 특성 | joint_state_publisher | joint_state_publisher_gui |
|---|---|---|
| GUI | 없음 | Qt 슬라이더 제공 |
| 사용자 입력 | 불가 | 슬라이더로 관절 위치 조절 가능 |
| 기본 위치 | 0 또는 URDF 정의값 | 사용자 조절 가능 |
| 의존성 | 경량 | Qt5/PyQt5 필요 |
| 용도 | CI/서버 환경 | 개발/시각화 환경 |
5. 활용 사례
5.1 URDF 모델 검증
새로운 URDF 모델을 작성한 후, joint_state_publisher_gui와 RViz2를 사용하여 관절의 동작 범위와 회전 방향이 올바른지 시각적으로 확인한다. 관절이 예상과 다른 방향으로 회전하면 URDF의 <axis> 또는 <origin> 설정을 수정한다.
5.2 자기 충돌 검사
매니퓰레이터의 관절을 다양한 자세로 조절하며 링크 간의 자기 충돌(self-collision)이 발생하는지 시각적으로 검사한다.
5.3 관절 좌표 기록
원하는 자세에서의 관절 좌표 값을 기록하여 운동 계획이나 티칭에 활용할 수 있다. GUI에 표시되는 현재 값을 참조하거나, /joint_states 토픽을 녹화(ros2 bag record)하여 관절 궤적을 저장한다.
6. 주의 사항
6.1 실제 하드웨어와의 동시 사용 금지
joint_state_publisher_gui는 실제 하드웨어 드라이버와 동시에 실행하면 안 된다. 두 노드가 동일한 /joint_states 토픽에 관절 상태를 발행하면 robot_state_publisher에서 데이터 충돌이 발생한다.
6.2 헤드리스(Headless) 환경
GUI가 없는 서버 환경(예: CI/CD, 원격 서버)에서는 joint_state_publisher_gui 대신 joint_state_publisher를 사용하여야 한다.
6.3 continuous 관절의 범위
continuous 관절은 URDF에 각도 제한이 없으나, GUI 슬라이더는 유한한 범위를 필요로 하므로 기본값인 [-\pi, \pi]로 제한된다. 다중 회전이 필요한 경우에는 프로그래밍적으로 관절 상태를 발행하여야 한다.
7. 요약
joint_state_publisher_gui는 URDF의 가동 관절에 대하여 GUI 슬라이더를 제공하여 사용자가 관절 위치를 수동으로 조절할 수 있게 하는 개발 도구이다. URDF 모델 검증, 관절 범위 확인, 자세 시각화 등에 활용되며, robot_state_publisher 및 RViz2와 함께 사용하여 TF2 변환의 시각적 검증을 수행한다.
참고 문헌 및 출처
joint_state_publisher_gui패키지, https://github.com/ros/joint_state_publisher (ROS2 Humble 브랜치)- ROS2 공식 문서, “URDF Tutorials”, https://docs.ros.org/en/humble/Tutorials/Intermediate/URDF/ (ROS2 Humble Hawksbill)