ROS2 공부 3일차 - ROS2 기본 명령 익히기
1. Turtlesim 설치와 실행
- ros galactic 버전을 설치할 때 desktop 버전을 선택했다면 turtlesim도 같이 설치된다. 혹시 설치가 안되었다면
sudo apt install ros-galactic-turtlesim
- 위 명령을 실행하면 된다.
- ROS2에서는 실행 가능한 최소한의 단위를 노드(node)라고 한다. 그리고 다수의 노드와 여러 설정을 모아 둔 것을 패키지(package)라고 부른다.
- ROS2에서 노드를 하나 실행하기 위한 명령어는 다음과 같다.
ros2 run <패키지 이름> <노드 이름>
- 그래서 지금은 turtlesim이라는 패키지의 turtlesim_node라는 노드를 실행하고자 다음 명령어를 입력한다.
ros2 run turtlesim turtlesim_node
2. 다시 강조하는 setup.zsh 환경
- 먼저 'sudo apt install' 명령으로 설치한 패키지들의 환경은
/opt/ros/galactic
- 위 경로에 setup.zsh 파일을 읽어 오면 된다.
- zsh 파일은 source 명령으로 읽으면 터미널에 환경이 세팅된다.
- 그러니까 결국, 어떤 터미널을 실행한 후 어떻게든
source /opt/ros/galactic/setup.zsh
- 라는 명령은 실행이 되어야 한다.
- 그래야만 'sudo apt install' 명령으로 설치된 ROS 관련 명령이나 패키지를 실행할 수 있다.
3. ROS Node
- 또 다른 터미널을 켜서 ros2 galactic을 실행하고 다음 명령어를 입력해보자.
ros2 node list
- 위 명령은 아래 사진 처럼 현재 노드가 얼마나 실행되고 있는지 목록을 확인할 수 있다.
- 우리는 turtlesim_node라는 노드를 실행했고, 그 이름이 turtlesim이라는 것을 알 수 있다.
ros2 node info/turtlesim
- 위 명령은 /turtlesim의 정보(info)를 조회하는 명령이다.
- 위 사진을 보면 아직은 잘 모르지만 /turtlesim이라는 노드는 구독(Subscribes)라는 것이 있고, 발행(Publishers)하는 것이 있는 것 같다. 이는 나중에 다룰 토픽(Topic)이라는 것이다.
- 그리고 서비스(Service)가 있고, 액션(Action Servers, Clients)도 있다.
- 아직은 모두 다 잘 모르지만 결론적으로 node info라는 명령은 토픽, 서비스, 액션의 이름을 알 수 있고, 그때 사용하는 데이터의 형도 알 수 있다.
4. ROS Service
- 두 노드(node)가 데이터를 주고 받는 방식 중에 클라이언트(client)가 서버(server)에게 요청(request)하면 응답(response)을 받을 수 있는 방식을 ROS에서는 서비스(service)라고 한다.
- 이때 입력 혹은 출력 데이터는 있을 수도 있고 없을 수도 있다.
ros2 service list
- 위 명령어를 통해 현재 사용 가능한 서비스(Service)들이 나타나 있다.
- 위 사진을 보면 현재 사용 가능한 서비스(service)들이 나타나 있다.
ros2 service type/turtle1/teleport_absolute
- 명령을 사용하면 해당 서비스가 사용하는 정의를 알 수 있다.
- 이는 turtlesim의 teleport_absolute 서비스의 정의 파일인 TeleportAbsolute.srv 파일의 구조이다.
- 실제 생긴 모습이 궁금하면 다음 주소를 방문하면 된다.
https://github.com/ros/ros_tutorials/tree/noetic-devel/turtlesim/srv
GitHub - ros/ros_tutorials: Code used in tutorials found on ROS wiki
Code used in tutorials found on ROS wiki. Contribute to ros/ros_tutorials development by creating an account on GitHub.
github.com
- srv라는 확장명을 가진 파일들은 ROS service에서 아주 중요한 파일들이다.
- 방금 우리가 service type 명령어를 통해 teleport_absolute서비스의 정의를 확인했듯이 TeleportAbsolute라고 정의되어 있다.
- 서비스의 정의는 srv 확장명을 가진 파일에 저장되고 통상 해당 패키지의 srv 폴더에 둔다.
- 위 사진에서 보듯이 srv 파일은 대시(-) 기호를 기준으로 위, 아래로 나눠 진다.
- 윗 부분은 서비스를 요청할 때의 데이터를 선언하고
- 아랫 부분은 서버스 서버가 응답(response)를 할 때의 데이터를 선언해 둔다.
- Response가 없다는 것은 그냥 return 값이 없는 함수로 생각해도 된다.
- 위 사진처럼 해당 서비스의 정의된 내용을 확인하는 명령은 다음과 같다.
ros2 interface show turtlesim/srv/TeleportAbsolute
5. 거북이 움직여보기
- 이제 거북이를 움직여 보자.
- teleport_absolute서비스의 정의를 보았을때 위 사진처럼 요청하는데 필요한 데이터가 x,y,theta로 이뤄져 있다.
- 이는 로봇의 좌표(x, y)와 로봇의 평면에서 볼 때 로봇의 자세(theta)인 것이다.
- Turtlesim은 처음 생성될 때 위 그림처럼 x축 방향을 보고 나타난다. 즉, 방향이 0도이다.
- ROS는 각도와 관련된 단위계는 라디안(radian) 단위를 사용한다.
- 그러므로 위를 보게 하고 싶으면 90도를 돌려야 하고 라디안으로는 1.57이다.
- 우리가 흔히 사용하는 각도를 radian 단위로 변환하려면 다음과 가은 수식을 사용하면 된다.
$$ rad = degree \frac{\pi}{180}$$
- 실행한 서비스를 호출하는 명령은 다음과 같다.
- 여기서 주의해야 할 점이 있는데, 콜론 왼쪽은 붙이고, 왼쪽은 띄워야 한다.
ros2 service call <service name> <service definition> "data"
- 그럼 이제 거북이를 (2,2) 좌표로 이동하고 위를 보게 하기 위해서 다음과 같이 입력하면 된다.
ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y:2, theta: 1.57}"
- 만약 충분히 실습한 후 다시 처음으로 돌리고 싶다면 reset 서비스를 요청하면 된다.
ros2 service call /reset std_srvs/srv/Empty {}
6. namespace
- service list를 다시 한번 보면 먼저 모든 결과에서 슬래시(/)가 있다.
- 이 슬래시는 현재 실행 중, 혹은 사용하다는 의미와 함께 슬래시 뒤에 서비스 이름이 있는 경우가 있다.
/clear
/kill
/reset
/spawn
- 그런데 어떤 서비스는
/turtle1/set_pen # turtle이 지나갈 때마다 경로를 표시하는데, 그 선의 색상이나 굵기를 지정
/turtle1/teleport_absolute # turtle어디로 한번 옮기는 서비스
/turtle1/teleport_relative # 현재 turtle의 위치에서 상대적인 기준으로 어디론가 옮기는 서비스
- 위와 같이 서비스 이름이 바로 오지 않고 /turtle1이라는 것이 붙어 있다.
- 이것이 namespace이다.
- namespace가 필요한 이유는 간단하다. 위 서비스 3개는 모두 하나의 turtle에 적용되는 서비스이다.
- 우리가 turtlesim 패키지를 ros2 run 명령을 이용하여 실행하면 turtlesim 패키지의 turtlesim_node라는 파일이 실행되고, 이때 거북이 한 마리가 화면에 나타난다.
- 이 거북이의 이름이 turtle1인 것이다.
- 또 다른 거북이를 만들 수 있는데, 구분을 위해 그 거북이의 이름을 지정하지 않을 경우 turtle2가 될 것이다.
결론적으로 namespacesms turtle 하나당 각각 적용되어야 하는 서비스의 경우 구분을 위해 사용된다.
7. spawn
- namespace를 확인해 볼 겸 새로운 서비스 하나를 더 사용해보자
- service type 명령을 통해 spawn이라는 서비스가 사용하는 서비스의 정의를 확인할 수 있다.
- interface show 명령을 통해 어떻게 입력값을 잡아야 하는지 알 수 있다.
- 이제 위에서 알아낸 정보로 다음과 같이 명령을 주면
- 다음과 같이 turtle2라는 네임스페이스르 가진 또 다른 turtle이 하나 생기게 되었다.
- 이후 ros2 service list를 확인해 보면 turtle1과 turtle2가 모두 보이는 것을 확인할 수 있다.
8.ROS Topic
8.1 ros2 topic list
- 서비스는 요청에 대한 응답으로 구성되어 있다고 한다면, 토픽은 발행(publish)과 구독(subscribe)으로 되어 있는 개념이다.
- 먼저 토픽은 서비스와 달리 요청한 것에 대해서만 응답하지 않는다.
- 한마디로 발행하기로 결정 난 메시지는 그저 구독만 하면 된다. 요청이라는 과정은 없는 것이다.
- 그러므로 토픽은 토픽의 이름과 메시지의 데이터 구조를 알고 있다면 누구나 구독할 수 있다.
- 이러한 장점은 여러 부분에서 개발할 때 큰 장점을 가진다.
ros2 topic list
- 위 명령어를 통해 현재 사용 가능한 topic을 조회해볼 수 있다.
8.2 ros2 topic type
- 서비스와 같이 토픽도 자신이 사용하는 메시지의 타입을 정의하고 있다.
- /turtle1/pose 토픽의 정의된 메시지 타입을 한번 확인해보자
ros2 topic type /turtle1/pose
- 그럼 다음과 같은 출력이 나온다.
turtlesim/msg/Pose
- 하나하나 확인하는 것이 귀찮다면 다음과 같이 명령을 입력하면 현재 사용가능한 모든 토픽의 메시지 타입이 정의된 경로를 알 수 있다.
ros2 topic list -t
8.3 ros2 topic info
- 토픽은 주는 쪽(publish)과 받는 쪽(subscribe)이 있다. 그렇기 때문에 그걸 구분해서 볼 수 있다면 편할 것이다.
- 그때 사용하는 명령어이다.
ros2 topic info /turtle1/pose
- 위 명령을 통해 /turtle1/pose라는 토픽이 발행되고 있는 건지 혹은 구독을 대기하고 있는 토픽인지를 알 수 있다.
- 만약 하나하나 확인하는 것이 귀찮으면 다음 명령어를 입력하면 된다.
ros2 topic list -v
- 그러면 위 그림처럼 각 토픽의 이름, 데이터형, 구독 발행 상황등을 한번에 알 수 있다.
8.4 토픽을 사용하기 위해 메시지 타입 확인하기
- turtle1이 발행하는 Pose 토픽을 사용하기 위해 turtlesim/msg/Pose가 어떻게 생겼는지 알아보기 위해서는 다음 명령어를 입력하면 된다.
ros2 interface show turtlesim/msg/Pose
- x,y,theta는 거북이의 위치와 자세를, linear_veloctiy는 거북이의 직선방향 속도, angular_velocity는 회전방향의 속도.
8.5 주행 명령 토픽 발행해보기
- 토픽을 발행하고 싶다면
ros2 topic pub --once (or rate <hz>) <topic_name> <msg_type> "<args>"
- 토픽을 한번만(--once) 발행할 것인지 혹은 일정주기(rate <hz>)를 가지고 연속적으로 발행(rate)할 것인지를 정하고, 토픽 이름과 메시지 타입을 나열하고 입력값("<args>")을 결정하면 된다.
- 예를 들어 geometry_msgs/msg/Twist 데이터 타입의 /turtle1/cmd_vel 토픽을 x축 직선 방향으로 2의 속도로 진행하도록 하고 싶다면 다음과 같이 하면 된다.
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
- 위 사진을 보면 cmd_vel 토픽이 발행된 이후 turtle이 x축 방향으로 조금 움직이는 것을 확인할 수 있다.
- 이렇게만 보면 토픽을 한번만 발행했기 때문에 단순히 속도 명령이 아니라, 위치 명령을 준 것으로 오해할 수 있다.
- 그렇다면 이번에는 angular 부분에 z축 성분에 1.8을 넣어서 토픽을 한번 발행해 보자.
- 그러면 위 사진처럼 화살표에서 보이는 것처럼 거북이가 곡선을 따라 움직이는 것이 보인다.
- 이번에는 토픽을 한번만 발행해 보는 것이 아니라 1Hz 주기로 발행해 보자.
- 그렇다면 --once가 아닌 --rate 1이라고 하면 된다.
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
- 그러면 위 사진처럼 ctrl+c 커맨드를 입력하기 전까지 계속 뱅글뱅글 돈다.
8.6 토픽의 흐름을 보여주는 rqt_graph
- rqt_graph는 토픽과 노드의 관계를 그림으로 나타낸 것이다.
- 여기서 동그라미는 노드(node)를 의미하고 사각형은 토픽(topic)을 의미한다.
- 즉, 터미널에서 cmd_vel 이라는 토픽을 발행했고, 그것을 구독하는 노드가 turtlesim이다 라는 것을 알 수 있다.
9. ROS Action
- ROS에서는 토픽 & 서비스와는 또 다른 기능으로 액션이 있다.
액션을 제공하는 액션 서버(server)를 구현하는 노등 클라이언트(client) 노드에서 먼저 목표를 요청한다.
그럼 응답을 서버가 한다. (여기까지는 service와 같음.)
하지만 액션의 경우에는 목표(Goal)에 도달할 때까지 그 중간을 확인할 수 있다. (중간을 토픽으로 피드백을 해준다.)
그리고 끝나면 결과(Result) 서비스를 사용하게 된다.
- 결론적으로 액션은 서비스와 많이 유사하다. 하지만 중간 중간 피드백을 날려준다는 점에서 차이점이 존재한다.
- 액션은 주로 간단한 태스크가 아닌, 장기간 작동하며 중간중간 결과를 알아야하는 태스크에 주로 사용된다. 실질적으로 많이 사용되지는 않는다.
- 액션은 나중에 더 자세히 정리하겠다.
- ROS에서는 주로 80퍼센트가 토픽을 사용하여 개발을 진행한다.