모바일 로봇 및 협동 로봇 통합 제어 시스템
- AMCL 알고리즘 검토
- map상에서 로봇의 초기 위치를 Localization하는데 너무 오랜 시간이 걸림
- 또한, 로봇을 실제로 많이 움직이고 회전해야 겨우 위치를 맞춤
- 로봇 위치를 실제 위치와 맞추지 못하는 경우가 크게 발생
- 초기 Rviz에서 맵을 불러올 때 Odom 좌표계는 0,0에 위치함
- 하지만, map의 경우 한쪽으로 치우쳐져 있음(갭단차 테스트베드 쪽이 0,0에 위치하는 상황)
- 해결 방안?
- 불러오는 맵의 위치 변경
- AMCL알고리즘 이외의 다른 알고리즘을 활용하여 초기 로봇 위치를 빠르게 탐색
본 워크스페이스는 Woosh TR200 모바일 로봇과 **두산 협동 로봇(Doosan A0912)**을 활용한 두 가지 프로젝트를 포함합니다.
| 프로젝트 | 설명 | 드라이버 | Launch 파일 | 클라이언트 스크립트 | 빠른 실행 |
|---|---|---|---|---|---|
| 🔬 갭단차 측정 | 모바일+협동로봇 협업 | woosh_service_driver.py |
woosh_service_driver.launch |
ldj_testbed_operation_client_all_*.py |
|
| 🗺️ SLAM/Navigation | 맵 생성 및 자율주행 | woosh_topic_bridge.py |
woosh_topic_driver.launch |
test_move_goback_topic.py |
|
| 🧪 모바일 로봇 테스트 | 모바일 로봇 토픽 제어 | woosh_topic_bridge.py |
woosh_topic_driver.launch |
test_move_goback_topic.launch |
# ============================================
# 터미널 1: roscore 실행
# ============================================
docker start my_noetic_ws
docker exec -it my_noetic_ws bash
source devel/setup.bash
roscore
# ============================================
# 터미널 2: 두산 로봇 연결
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
roslaunch dsr_launcher single_robot.launch mode:=real host:=192.168.137.100 port:=12345 model:=a0912
# ============================================
# 터미널 3: Woosh TR-200 연결 (서비스 방식)
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
roslaunch woosh_bringup woosh_service_driver.launch robot_ip:=169.254.128.2
# ============================================
# 터미널 4: 갭단차 측정 시퀀스 실행
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
# 연속 구동 방식
rosrun woosh_control ldj_testbed_operation_client_all_continuous.py
# 단계적 구동 방식 (Enter 입력)
rosrun woosh_control ldj_testbed_operation_client_all_sequence.py조작 방법: [Enter] 키를 누를 때마다 다음 동작 실행
Enter → 모바일 전진 → Enter → 두산 작업자세 → Enter → 두산 홈 → Enter → 모바일 후진 → (반복)
# ============================================
# 터미널 1: roscore 실행
# ============================================
docker start my_noetic_ws
docker exec -it my_noetic_ws bash
source devel/setup.bash
roscore
# ============================================
# 터미널 2: SLAM 시스템 실행 (토픽 방식 드라이버 포함)
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
roslaunch woosh_slam slam_gmapping.launch robot_ip:=169.254.128.2
# ============================================
# 터미널 3: 키보드 조작
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=cmd_vel_raw
# ============================================
# 터미널 4: 맵 저장 (맵핑 완료 후)
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
rosrun woosh_slam save_map.py my_map_name키보드 조작: i(전진), ,(후진), j(좌회전), l(우회전), k(정지)
모바일 로봇만 토픽 형태로 제어하여 전후진 및 회전 테스트를 수행합니다.
# ============================================
# 터미널 1: roscore 실행
# ============================================
docker start my_noetic_ws
docker exec -it my_noetic_ws bash
source devel/setup.bash
roscore
# ============================================
# 터미널 2: 모바일 로봇 토픽 드라이버 실행
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
roslaunch woosh_bringup woosh_topic_driver.launch robot_ip:=169.254.128.2
# ============================================
# 터미널 3: 모바일 로봇 제어 스크립트 실행 (부드러운 속도 프로파일 포함)
# ============================================
docker exec -it my_noetic_ws bash
source devel/setup.bash
roslaunch woosh_control test_move_goback_topic.launch조작 방법:
g입력: 전진 (기본 0.2m)b입력: 후진 (기본 0.2m)r+입력: 시계방향 5도 회전r-입력: 반시계방향 5도 회전q입력: 프로그램 종료
토픽 흐름:
test_move_goback_topic → /cmd_vel_raw → smooth_cmd_vel → /cmd_vel → woosh_topic_bridge → 로봇
모바일 로봇과 협동 로봇이 순차적으로 동작하여 차체 갭단차를 측정하는 시스템입니다.
┌─────────────────────────────────────────────────────────────────┐
│ 갭단차 측정 시스템 구조 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [사용자 Enter 입력] │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ ldj_testbed_operation_client_all_ │ │
│ │ sequence.py (시퀀스 제어 클라이언트) │ │
│ └─────────────────────────────────────────┘ │
│ │ │ │
│ ▼ (Service Call) ▼ (Service Call) │
│ /mobile_positiontwist /dsr01a0912/movej │
│ │ │ │
│ ┌─────────────────┐ ┌─────────────────────┐ │
│ │ woosh_service_ │ │ Doosan Robot Driver │ │
│ │ driver.py │ │ (dsr_launcher) │ │
│ │ │ │ │ │
│ │ IP: 169.254. │ │ IP: 192.168.137.100 │ │
│ │ 128.2 │ │ Port: 12345 │ │
│ └─────────────────┘ └─────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────────┐ │
│ │ 🤖 Woosh TR200 │ │ 🦾 Doosan A0912 │ │
│ │ (모바일 로봇) │ │ (협동 로봇) │ │
│ └─────────────────┘ └─────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
[시퀀스 흐름]
Enter → 모바일 전진 → Enter → 두산 작업자세 → Enter → 두산 홈 →
Enter → 모바일 후진 → (반복)
연구원 로비 환경에서 맵 생성 및 자율 주행을 위한 시스템입니다.
┌─────────────────────────────────────────────────────────────────┐
│ SLAM/Navigation 시스템 구조 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ROS Navigation Stack │ │
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────────────┐ │ │
│ │ │ AMCL │ │ move_base│ │ global/local_planner │ │ │
│ │ │ (위치추정)│ │ (경로계획)│ │ (경로 생성) │ │ │
│ │ └──────────┘ └──────────┘ └──────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ▲ ▲ │ │
│ │ │ ▼ │
│ /map /odom /cmd_vel │
│ │ │ │ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ woosh_topic_bridge.py │ │
│ │ (모듈화 버전) │ │
│ │ │ │
│ │ 발행: /odom, /scan, /imu/data │ 구독: /cmd_vel │ │
│ │ TF: odom → base_link → base_scan, imu_link │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 🤖 Woosh TR200 │ │
│ │ IP: 169.254. │ │
│ │ 128.2 │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
[워크플로우]
1. SLAM으로 맵 생성 (GMapping/SLAM Toolbox)
2. 맵 저장 (save_map.py)
3. Navigation으로 목표점 자동 주행
모바일 로봇만 토픽 형태로 제어하여 전후진 및 회전 테스트를 수행하는 시스템입니다.
┌─────────────────────────────────────────────────────────────────┐
│ 모바일 로봇 테스트 시스템 구조 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [사용자 입력: g/b/r+/r-/q] │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ test_move_goback_topic.py │ │
│ │ (토픽 제어 클라이언트) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ (/cmd_vel_raw 발행) │
│ ┌─────────────────────────────────────────┐ │
│ │ smooth_cmd_vel 노드 │ │
│ │ (부드러운 속도 프로파일 적용) │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ (/cmd_vel 발행) │
│ ┌─────────────────────────────────────────┐ │
│ │ woosh_topic_bridge.py │ │
│ │ (토픽 브릿지, 모듈화 버전) │ │
│ │ │ │
│ │ 발행: /odom, /scan, /imu/data │ │
│ │ 구독: /cmd_vel │ │
│ │ TF: odom → base_link → base_scan │ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 🤖 Woosh TR200 │ │
│ │ IP: 169.254. │ │
│ │ 128.2 │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
[토픽 흐름]
사용자 입력 → test_move_goback_topic → /cmd_vel_raw →
smooth_cmd_vel → /cmd_vel → woosh_topic_bridge → 로봇
[제어 명령]
g: 전진, b: 후진, r+: 시계방향 회전, r-: 반시계방향 회전, q: 종료
| 구분 | 서비스 방식 (갭단차) | 토픽 방식 (SLAM/Nav/테스트) |
|---|---|---|
| 통신 | 요청-응답 (블로킹) | 연속 발행 (비동기) |
| 용도 | 단일 명령 실행, 두산+모바일 협업 | 실시간 제어/센서, 모바일만 제어 |
| 장점 | 명령 완료 확인 용이 | 고속, 연속 데이터 처리 |
| 노드 | woosh_service_driver.py |
woosh_topic_bridge.py |
| Launch | woosh_service_driver.launch |
woosh_topic_driver.launch |
| 클라이언트 | ldj_testbed_operation_client_all_*.py |
test_move_goback_topic.py |
- Host OS: Ubuntu 24.04 LTS
- ROS 환경: Docker + ROS Noetic
- 로봇 하드웨어:
| 로봇 | IP 주소 | 포트 |
|---|---|---|
| Doosan A0912 | 192.168.137.100 | 12345 |
| Woosh TR200 | 169.254.128.2 | 5480 |
robot_ws/
├── src/
│ │
│ │ ┌──────────────────────────────────────────────────────┐
│ │ │ 🤖 Woosh TR200 Mobile Robot │
│ │ └──────────────────────────────────────────────────────┘
│ │
│ ├── woosh_bringup/ # 🔌 로봇 드라이버 (통합)
│ │ ├── scripts/
│ │ │ ├── woosh_topic_bridge.py # 토픽 방식 (SLAM/Nav/테스트, 모듈화 버전)
│ │ │ ├── woosh_topic_driver.py # 토픽 방식 (레거시)
│ │ │ ├── woosh_service_driver.py # 서비스 방식 (갭단차 측정)
│ │ │ └── robot_imu_bridge.py # IMU 브릿지 프로세스
│ │ ├── src/woosh_bringup/bridge_components/ # 모듈화된 브릿지 컴포넌트
│ │ │ ├── constants.py # 상수 정의
│ │ │ ├── odometry_bridge.py # Odometry 처리
│ │ │ ├── laserscan_bridge.py # LaserScan 처리
│ │ │ ├── imu_bridge.py # IMU 처리
│ │ │ └── cmd_vel_handler.py # cmd_vel 처리
│ │ ├── srv/
│ │ │ ├── MobilePosition.srv
│ │ │ └── MobilePositionTwist.srv
│ │ └── launch/
│ │ ├── woosh_topic_driver.launch # 토픽 드라이버 실행 (SLAM/Nav/테스트)
│ │ └── woosh_service_driver.launch # 서비스 드라이버 실행 (갭단차 측정)
│ │
│ ├── woosh_slam/ # 🗺️ SLAM 관련
│ │ ├── scripts/
│ │ │ └── save_map.py # 자동 크롭 맵 저장
│ │ ├── launch/
│ │ │ ├── slam_gmapping.launch # GMapping SLAM
│ │ │ └── slam_toolbox.launch # slam_toolbox SLAM
│ │ ├── config/
│ │ │ └── slam_toolbox_params.yaml
│ │ ├── rviz/
│ │ │ └── slam.rviz
│ │ └── maps/ # 저장된 맵 파일
│ │
│ ├── woosh_control/ # 🎮 속도 제어/갭단차 측정/모바일 테스트
│ │ ├── scripts/
│ │ │ ├── smooth_cmd_vel.py # S-curve 속도 프로파일
│ │ │ ├── ldj_testbed_operation_client_all_continuous.py # 갭단차 연속 구동
│ │ │ ├── ldj_testbed_operation_client_all_sequence.py # 갭단차 단계별 구동
│ │ │ └── test_move_goback_topic.py # 모바일 로봇 토픽 제어 테스트
│ │ ├── srv/
│ │ │ ├── MoveJoint.srv # 두산 로봇 관절 이동
│ │ │ └── MobilePositionTwist.srv # 모바일 로봇 이동
│ │ └── launch/
│ │ ├── smooth_cmd_vel.launch # 부드러운 속도 프로파일
│ │ ├── test_move_goback_topic.launch # 모바일 로봇 테스트 (smooth_cmd_vel 포함)
│ │ └── teleop.launch # 키보드 조작
│ │
│ ├── woosh_utils/ # 🔧 유틸리티 패키지
│ │ ├── scripts/
│ │ │ └── battery_check.py # 배터리 상태 확인 스크립트
│ │ └── src/woosh_utils/
│ │ └── __init__.py # Colors, print_battery_status 포함
│ │
│ ├── woosh_robot_py/ # 📡 Woosh Robot Python SDK
│ │ └── ...
│ │
│ │ ┌──────────────────────────────────────────────────────┐
│ │ │ 🦾 Doosan Cobot (A0912) │
│ │ └──────────────────────────────────────────────────────┘
│ │
│ ├── doosan-robot/ # 🦾 두산 로봇 공식 드라이버
│ │ ├── dsr_launcher/ # 로봇 실행 런치 파일
│ │ ├── dsr_control/ # 로봇 제어 노드
│ │ ├── dsr_msgs/ # 메시지/서비스 정의
│ │ └── moveit_config_a0912/ # MoveIt 설정
│ │
│ └── serial/ # 📡 시리얼 통신 라이브러리
│ └── ...
│
└── docs/ # 📖 문서
├── SLAM_docs/
│ ├── WOOSH_SLAM_IMPLEMENTATION_GUIDE.md
│ └── TROUBLESHOOTING_GUIDE.md
└── Manual SDK/ # Woosh 로봇 매뉴얼
Woosh 로봇은 두 가지 드라이버 방식을 지원합니다:
| 구분 | 토픽 방식 | 서비스 방식 |
|---|---|---|
| 노드 | woosh_topic_bridge.py (모듈화 버전) |
woosh_service_driver.py |
| Launch | woosh_topic_driver.launch |
woosh_service_driver.launch |
| 통신 | ROS 토픽 (연속 발행) | ROS 서비스 (요청-응답) |
| 발행 토픽 | /odom, /scan, /imu/data, TF |
없음 |
| 구독 토픽 | /cmd_vel |
없음 |
| 명령 방식 | /cmd_vel 구독 |
서비스 호출 (/mobile_positiontwist) |
| 용도 | SLAM, Navigation, 텔레옵, 모바일 테스트 | 두산+모바일 협업, 갭단차 측정 |
| 클라이언트 | test_move_goback_topic.py |
ldj_testbed_operation_client_all_*.py |
# 로봇 연결 (토픽 드라이버)
roslaunch woosh_bringup woosh_topic_driver.launch robot_ip:=169.254.128.2
# 발행 토픽: /odom, /scan, /imu/data
# 구독 토픽: /cmd_vel
# TF: odom → base_link → base_scan, imu_link
# 모바일 로봇 테스트 (부드러운 속도 프로파일 포함)
roslaunch woosh_control test_move_goback_topic.launch사용 시나리오:
- SLAM:
woosh_slam패키지와 함께 사용 - Navigation: ROS Navigation Stack과 함께 사용
- 모바일 테스트:
test_move_goback_topic.launch와 함께 사용
# 로봇 연결 (서비스 드라이버)
roslaunch woosh_bringup woosh_service_driver.launch robot_ip:=169.254.128.2
# 갭단차 측정 시퀀스 실행
# 연속 구동 방식
rosrun woosh_control ldj_testbed_operation_client_all_continuous.py
# 단계별 구동 방식 (Enter 입력)
rosrun woosh_control ldj_testbed_operation_client_all_sequence.py
# 서비스 호출 예시 (수동)
rosservice call /mobile_positiontwist "distance: 0.3
speed: 0.2
linear_or_angular: 0"사용 시나리오:
- 두산 로봇과 모바일 로봇 협업 (갭단차 측정)
- 순차적 제어가 필요한 작업
# GMapping SLAM
roslaunch woosh_slam slam_gmapping.launch robot_ip:=169.254.128.2
# slam_toolbox SLAM (권장)
roslaunch woosh_slam slam_toolbox.launch robot_ip:=169.254.128.2rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=cmd_vel_raw| 키 | 동작 |
|---|---|
i |
전진 |
, |
후진 |
j |
좌회전 |
l |
우회전 |
k |
정지 |
# 자동 크롭 맵 저장
rosrun woosh_slam save_map.py my_map_name
# 원본도 함께 저장
rosrun woosh_slam save_map.py my_map_name --keep-original- 환경 구축 가이드 - Docker 및 ROS 환경 설정
- 통합 개발 가이드 - 시스템 개발 및 확장 방법
- SLAM 구현 가이드 - Woosh SLAM 구현
- 트러블슈팅 가이드 - 오류 해결 방법
- central_coordinator - 중앙 관제 노드
- doosan_helper - 두산 로봇 제어
- mobile_robot_control - 모바일 로봇 제어
| 토픽 이름 | 메시지 타입 | 설명 |
|---|---|---|
/mobile/cmd |
std_msgs/Float64MultiArray |
모바일 로봇 이동 명령 [distance, speed] |
/mobile/status |
std_msgs/String |
모바일 로봇 상태 (IDLE, MOVING, COMPLETED, ERROR) |
/katech/robot_command |
std_msgs/Int32 |
두산 로봇 자세 명령 (0, 1, 99) |
/doosan/status |
std_msgs/String |
두산 로봇 상태 (IDLE, MOVING, COMPLETED, ERROR) |
/dsr01a0912/state |
dsr_msgs/RobotState |
두산 로봇 시스템 상태 (드라이버 발행) |
# 모바일 로봇 배터리 확인
rosrun woosh_utils battery_check.py출력: 배터리 잔량을 색상 막대 그래프로 표시 (80%↑: 초록, 20~49%: 노란색, 20%↓: 빨강)
cd ~/catkin_ws
catkin_make
source devel/setup.bash# 상태 모니터링
rostopic echo /mobile/status
rostopic echo /doosan/status
# 수동 명령 테스트
rostopic pub /mobile/cmd std_msgs/Float64MultiArray "data: [0.3, 0.2]"
rostopic pub /katech/robot_command std_msgs/Int32 "data: 99"
# 노드 그래프 확인
rqt_graph⚠️ 티치 펜던트에서 '서보 온(Servo On)' 버튼을 눌러주세요
# IP 확인
ping 169.254.128.2
# 로그 확인
rosnode info /mobile_robot_ros_nodeDocker 컨테이너에서 파일/폴더를 생성할 때 권한 오류가 발생하는 경우:
# 문제 증상
mkdir: cannot create directory 'new_folder': Permission denied
touch: cannot touch 'new_file.txt': Permission denied해결 방법: 호스트에서 소유권 변경
# 호스트 PC에서 실행 (워크스페이스가 마운트된 경우)
sudo chown -R $USER:$USER ~/robot_ws
sudo chmod -R 755 ~/robot_wsCopyright © 2025 KATECH (Korea Automotive Technology Institute)
Smart Manufacturing Technology Research Center
Author: LDJ (Dongjun Lee)
Email: djlee2@katech.re.kr
본 소프트웨어는 한국자동차연구원 스마트제조기술연구센터에서 개발되었습니다.
상업적 사용 및 재배포 시 사전 승인이 필요합니다.
본 프로젝트는 KATECH 내부 프로젝트입니다.
문의 사항은 djlee2@katech.re.kr로 연락주시기 바랍니다.
- ✅ 코드 모듈화 및 리팩토링
woosh_topic_bridge.py: 모듈화된 토픽 브릿지 (이전woosh_topic_driver_ldj.py)bridge_components: 기능별 모듈 분리 (Odometry, LaserScan, IMU, CmdVel)- IMU 지원:
/imu/data토픽 발행 및 TF 브로드캐스팅
- ✅ 모바일 로봇 테스트 도구 추가
test_move_goback_topic.py: 토픽 방식 모바일 로봇 제어test_move_goback_topic.launch: 부드러운 속도 프로파일 포함 통합 실행
- ✅ Launch 파일 정리 및 명확화
woosh_service_driver.launch: 갭단차 측정용woosh_topic_driver.launch: SLAM/Navigation/테스트용
- ✅ Woosh TR200 SLAM 기능 추가
woosh_bringup: 로봇 드라이버/ROS 브릿지woosh_slam: GMapping/slam_toolbox SLAM 지원woosh_control: S-curve 속도 프로파일, 텔레옵
- ✅ 자동 크롭 맵 저장 도구 (
save_map.py) - ✅ Docker X11 GUI 지원 (RViz)
- ✅ SLAM 트러블슈팅 가이드 추가
- ✅ 중앙 관제 시스템 구축 완료
- ✅ 모바일-협동로봇 왕복 시퀀스 구현
- ✅ 자동 초기화 및 상태 감지 기능
- ✅ ROS Topic 기반 통신 구조 확립