환경
os: ubuntu 22.04
ROS2: humble
unity: 2022.3.27f1
아래의 유니티 공식 깃허브를 보고 터틀봇3로 쉽게 Nav2를 테스트할 수 있다.
https://github.com/Unity-Technologies/Robotics-Nav2-SLAM-Example
GitHub - Unity-Technologies/Robotics-Nav2-SLAM-Example: An example project which contains the Unity components necessary to comp
An example project which contains the Unity components necessary to complete Navigation2's SLAM tutorial with a Turtlebot3, using a custom Unity environment in place of Gazebo. - Unity-Technolo...
github.com
하지만 나는 다른 로봇 모델로 Nav2를 테스트해야 했고, 굉장히 애를 먹은 경험이 있어서 이 글을 보고 누군가가 테스트 환경을 구축하는데 도움을 받으면 좋겠다.
이 글에서는 다음과 같은 것들을 다룬다.
1. Unity-ROS-Integration
2. URDF를 사용하여 Unity scene에 로봇 모델 생성
3. 로봇 모델에 ROS2연동을 위한 스크립트 추가
4. 간단한 시뮬레이션 환경 구축
5. ROS-Unity 연동 테스트(/cmd_vel, lidar) 및 트러블 슈팅
1. Unity-ROS-Integration
아래 포스트 참고
[Unity] URDF Importer를 사용하여 로봇 모델 생성
https://ko-ko-song.tistory.com/48
2. URDF Import (로봇 모델 생성)
아래 포스트 참고
[Unity] Unity-ROS-Integration
https://ko-ko-song.tistory.com/50
3. 로봇 모델에 ROS2 연동을 위한 스크립트 추가
다음과 같은 스크립트들을 추가해야 한다.
1. 시뮬레이션 시간을 publish하는 스크립트 (/clock)
2. 로봇의 TF, odom을 publish하는 스크립트 (/tf)
3. /cmd_vel을 subscribe하여 로봇 이동시키는 스크립트
4. 2d lidar 데이터를 생성 및 publish 하는 스크립트 (/scan)
https://github.com/Unity-Technologies/Robotics-Nav2-SLAM-Example
위의 링크에서 Robotics-Nav2-SLAM-Example/Nav2SLAMExampleProject/Assets/Scripts에 있는 스크립트들 복사
(스크립트 폴더를 통채로 복사하면 안됨, RosMessage를 못찾는데 namesapce문제인 듯?)
시뮬레이션 시간 publish하는 스크립트 추가
시뮬레이션 환경에서 navigation을 테스트할 것이므로 시뮬레이션 시간을 사용해야 함.
하이러키에서 우클릭 -> Create Empty로 게임오브젝트 생성 후 Clock으로 이름 변경
Clock 오브젝트 클릭 후 Inspector에서 ROS Clock Publisher 스크립트 추가
( /clock 토픽을 publish하는 스크립트)
publish rate 100 → 50으로 변경
로봇을 이동시키는 스크립트 추가
tutlebot burger에 Controller 스크립트 제거, AGV Controller 스크립트 추가
/cmd_vel 토픽을 subscribe해서 differential wheel robot을 이동시키는 스크립트
AGV Controller에 프로퍼티들에 값을 넣어줘야 함.
하이러키에서 wheel_left_link, right_link를 클릭 후 드래그해서 AGV 컨트롤러의 Wheel1, 2로 드랍
나머지는
Max Linear Speed, Max Rotational Speed, Wheel Radius, Track Width는 로봇의 스펙에 맞게 변경
(default는 터틀봇에 맞게 되어있음)
ForceLimit 은 적절한 값 찾아서 넣어줘야 하는데 (이 속성을 잘 모르겠으나 적당히 큰 값 넣어도 되는 듯)
Damping도 적절한 값 찾아서 넣어줘야 함.
(아래 링크에 설명이 있는데 솔직히 이해가 안간다. 테스트를 하면서 적절한 값을 찾아 넣어야 하는 듯)
https://docs.unity3d.com/6000.0/Documentation/ScriptReference/ArticulationDrive.html
TF publish 하는 스크립트 추가
터틀봇에 아래와 같이 ROS Transform Tree Publisher 스크립트 추가
(odom → base_footprint와 로봇의 모든 프레임의 관계(tf)를 /tf 토픽으로로 publish 하는 스크립트)
아래와 같이 Global Frame Ids에 map 삭제 후 길이를1로 변경, Root Game Object에 base_footprint 드래그앤 드랍
(default로 Global Frame Ids에 map도 있는데, 이거 있으면 map → odom을 맵 서버가 publish해야 하는데 시뮬레이터에서 해버림)
2d lidar 스크립트 추가
base_scan 게임 오브젝트에 LaserScanSensor 스크립트를 추가 후 다음과 같이 프로퍼티들 수정
끝
4. 간단한 시뮬레이션 환경 구축
하이러키 우클릭 → 3D object → Plane 생성
동일한 방법으로 cube와 shere도 생성 후 배치
게임오브젝트(cube, spere)를 클릭 후 w를 누르면 이동가능한 화살표가 생김
기본 세팅 끝
5. ROS2-시뮬레이터 연동 테스트
먼저 유니티 상단의 플레이 버튼 클릭
(플레이 버튼을 눌러야 시뮬레이션 환경이 실행된다.)
/cmd_vel 토픽 publish하여 로봇 이동 테스트
#termianl 1
ros2 launch ros_tcp_endpoint endpoint.py
#terminal 2
ros2 topic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z z: 0.0}}'
바퀴는 굴러가는 것 처럼 보이나 제대로 안움직일 것이다.
상단의 메뉴에서 Edit → Project Settings → Time에서 Fixed Timestamp를 0.005로 변경
Project Settings → Physics에서 Default Solver Iterations 30, Default Solver Velocity Iterations 60으로 변경
하지만 그래도 안된다!
버거의 collider를 보니 캐스터휠이 직육면체로 되어있다.
실제 로봇이라면 구형에다가 회전이 가능하게 되어있을텐데 모델이 좀 이상한 것 같다.
Assets에서 우클릭→ Create → Physical Material 생성
이름은 아래와 같이 noFriction으로 변경하고
생성한 Physical Material을 클릭하면 Inspector에서 프로퍼티를 변경할 수 있는데 아래와 같이 변경
하이러키를 아래와 같이 따라간 뒤 Material이 None으로 되어있는데 우측끝에 동그라미 클릭 후 noFriction 선택
이제 정상적으로 동작한다.
(터틀봇 Waffle 모델을 사용할 경우)
아래 스크린샷처럼 기울게 되는데 아무래도 카메라 링크가 너무 무거운 것 같다.
camera_link의 articulation body의 Mass를 줄이면 해결할 수 있다.
아래의 camera frame들도 다 1키로로 되어있어서 다 Mass를 수정해야 함
2d lidar 테스트( unity -> ros2 )
# terminal3
# rviz 실행 명령어
rivz2
왼쪽 하단의 Add 클릭
TF 클릭후 OK 클릭
다시 왼쪽 하단의 Add 클릭 ->By topic 탭 -> /scan토픽 아래의 LaserScan 추가
그 다음 왼쪽 Displays에서
Global Options의 Fixed Frame을 odom으로 변경
LaserScan에 항목들을 위의 스샷과 같이 변경
- Topic - Reliablity를 Best Effort로(변경안하면 rivz에서 안보임)
- size는 0.1로
연동 테스트 끝
6. nav2 연동 및 테스트
최대한 따라하기 쉽게 작성한다고 노력은 했는데 잘 전달되기를..
'Unity Robotics' 카테고리의 다른 글
[Unity] 3D model import 하는 방법 (0) | 2025.01.08 |
---|---|
[Unity] unityhub 로그인이 안될 때 (ubuntu 22.04) (0) | 2025.01.08 |
[Unity] vscode 연동(ubuntu 22.04) (0) | 2025.01.08 |
[Unity] URDF Importer를 사용하여 로봇 모델 생성 (1) | 2024.12.31 |
[Unity] Unity-ROS-Integration (0) | 2024.12.31 |