shell : PC 실행 이후 커널과 사용자 사이를 연결해주는 프로그램
(커널 : OS의 핵심 요소, HW와 SW 간의 상호 작용 관리 & 조정)
Ubuntu의 기본 shell은 bash shell이다.
‘sudo apt install’로 설치한 패키지들은 /opt/ros/humble 경로에 있는 setup.bash 파일을 읽어오면 되는데, bash 파일은 source 명령어로 읽으면 터미널에 환경이 세팅된다.
-> 따라서 source /opt/ros/humble/setup.bash 라는 명령어를 실행해야 ‘sudo apt install’ 명령어로 실행한 ROS 관련 명령 / 패키지를 실행할 수 있다.
ROS turtlesim의 실행 -> turtlesim도 하나의 노드이다.
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
Node : ROS에서 실행 가능한 최소 단위의 실행 가능한 프로세스, 즉 하나의 실행 가능한 프로그램

EX) 원본 영상을 출력하는 카메라 드라이버, 원본 영상에 필터링 하는 필터 노드, 필터링 된 영상에서 특징점을 추출하는 노드, 특징점을 이용해 물건을 검출하는 노드
Node 관련 명령어
ros2 node list : 사용 가능한 node의 목록을 보여준다.
ros2 node info /turtlesim : turtlesim이라는 노드의 정보를 알려준다.
rqt_graph : rqt_graph의 실행
메시지 : 노드와 노드 사이에 주고 받는 데이터이며, 주고받는 방식을 메시지 통신이라고 한다. 메시지는 integer, floating point, boolean, string.. 등등과 같은 변수 형태이다.

서비스의 요청을 하는 쪽 : service client
서비스의 응답을 하는 쪽 : service server

서비스는 동일 서비스에 대해 복수의 클라이언트를 가질 수 있도록 설계되었다. 단, 서비스 응답은 서비스 요청이 있었던 서비스 클라이언트에 대해서만 응답을 하는 형태로 구성된다.
서비스 관련 명령어
ros2 service list -t : 현재 실행 중인 노드들의 서비스 목록의 확인 가능 (+ -t 옵션을 붙이면 서비스의 타입도 확인 가능)
ros2 service type /turtle1/teleport_absolute : 해당하는 서비스의 타입을 알고 싶을 때 사용한다.
EX) ros2 service type /turtle1/teleport_absolute
-> turtlesim/srv/teleport_absolute
turtlesim : 노드 / 패키지의 이름
srv : service 인터페이스를 사용한다.
teleport_absolute : 서비스의 데이터 정의
ros2 interface show turtlesim/srv/TeleportAbsolute : 해당 서비스의 내용을 알 수 있다.
float32 x
float32 y
float32 theta
string name
---
string name
대시 세 개 구분자의 윗부분은 ‘서비스 요청(Request)’에 해당하고, 아랫 부분은 ‘서비스 응답(Response)’에 해당한다.
ros2 service call <service_name> <service_type> “arguments” : 해당 서비스를 호출한다.
EX) ros2 service call /clear std_srvs/srv/Empty
EX) ros2 service call /kill turtlesim/srv/kill “name : ‘turtle1’”
EX) ros2 service call /turtle1/teleport_absolute turtlesim/srv/TeleportAbsolute "{x: 2, y: 2, theta: 1.57}"
ROS는 각도와 관련된 단위계로 라디안 단위를 사용한다.
rad = degreeπ180
EX) 90° = π/2 = 1.57
namespace
/turtle1... 등등이 namespace 이다. turtle 하나 당 적용되어야 하는 서비스가 구분이 되어야 하기 때문이다.
[EX]
$ ros2 node info /turtlesim
/turtlesim
Subscribers:
/turtle1/cmd_vel: geometry_msgs/msg/Twist
(생략)
Publishers:
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
(생략)
Services:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
(생략)

토픽 관련 명령어
ros2 topic list –t : 사용 가능한 토픽의 종류를 보여준다. (-t 옵션을 붙이면 토픽의 타입도 확인 가능)
ros2 topic type : 해당하는 토픽의 타입을 알 수 있다.
ros2 topic info /turtle1/pose : /turtle1/pose라는 메시지를 사용하고 구독과 발행하는 노드의 개수를 확인할 수 있다.
ros2 interface show turtlesim/msg/Pose : 해당 토픽의 내용을 알 수 있다.
ros2 topic pub --once <topic_name> <msg_type> “args” : 해당하는 토픽을 한 번만 발행 (혹은 일정 주기를 가지고 연속적으로 발행) 할지를 정하고 발행한다;
EX) 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}}“
: 해당 토픽을 한 번만 발행한다.
EX) ros2 topic pub --rate 1 /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}}"
: 1Hz의 주기로 해당 토픽을 발행한다
ROS 인터페이스
메시지 인터페이스(message interface, msg)
[EX]
ros2 topic type /turtle1/cmd_vel -> geometry_msgs/msgs/Twist의 형태인데, 이는 geometry_msgs 패키지의 msgs 분류의 Twist 데이터 형태를 의미한다.
Twist 데이터 형태는 Vector3 linear, Vector3 angular 이라고 되어 있는데, 이는 메시지 안에 메시지를 품고 있는 것을 의미한다. Vector3 형태에 linear 이라는 이름의 메시지와 Vector3 형태에 angular 이라는 이름의 메시지, 즉 2개의 메시지가 있다는 것이며 Vector3는 다시 float64 형태에 x, y, z 값이 존재한다.
$ ros2 interface show geometry_msgs/msg/Twist
Vector3 linear
Vector3 angular
$ ros2 interface show geometry_msgs/msg/Vector3
float64 x
float64 y
float64 z
3. ROS Action

참고 : 동기식 통신 & 비동기식 통신
동기식 통신 : Request를 보내면 그 자리에서 바로 Response를 받는 통신
비동기식 통신 : Request를 보내더라도 언제 받아도 상관이 없는 통신
- ROS1 에서 액션은 목표, 피드백, 결과 값을 토픽으로만 주고 받는 반면, ROS2에서는 토픽과 서비스 방식을 혼합하여 사용한다.
ROS2에서는 목표 전달, 목표 취소, 결과 받기라는 동기식 서비스를 사용한다.
액션 관련 명령어
ros2 action list –t : 사용 가능한 액션의 종류를 보여준다. (-t 옵션을 붙이면 액션의 타입도 확인 가능)
ros2 interface show turtlesim/action/RotateAbsolute : 해당 액션의 내용을 알 수 있다.
ros2 action send_goal <action_name> <action_type> ”values“ : 해당 액션의 목표를 전달한다.
[EX] ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.5708}“
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.5708}" --feedback
: --feedback 옵션을 붙이면 피드백을 계속 표시해준다.