Engineering/ROS

ROS2 Node 스케줄링, 구조, 인터페이스 파라미터

luckydipper 2025. 1. 14. 21:05
반응형

지난 포스팅에서 Package와 Node에 관해 정리했다.요약하면, Package는 Node들의 집합과 이를 실행하는 launch file이다.

 

Node는 ROS가 프로그램을 스케쥴링 하는 기준이다. 노드 안에 있는 기능들, ROS 2 Entities[Service, Publish, Subscribe, Action]들은 callback 함수[각주:1]이다. Node는 ROS 2 Entities, 자원, 상태를 들고 있는 논리적 컨테이너이다. 엔티티들은 스케쥴링의 대상이 아니라, 일감(Event)

1. Node Scheduling

ROS1에서의 Node는 우리가 RCL(ROS Client Library)를 활용하여 만드는 Process이다. 하나의 Node안에서 publisher subscriber가 스케쥴링 돼서 돌아가며, Node간에 스케쥴링이 이뤄졌다. ROS2에서는 Executer를 도입했다. 하나의 프로세스 안에 여러 노드(Components)를 로딩 하는 방식으로 발전했다. 하나의 프로세스에서 파생된 thread들은 heap공간을 공유해서, 메모리 주소만 있다면 Zero Copy가 가능하다. Scheduling, Executer, Interface, Parameter, Namespace

.

Executor (작업 반장):

  • SingleThreadedExecutor
  • MultiThreadedExecutor

Callback Group (교통 정리):

  • Mutually Exclusive (상호 배제): "이 그룹에 속한 콜백은 동시에 실행하지 마."
  • Reentrant (재진입 가능): "동시에 여러 스레드가 실행해도 됨."

Node 간의 통신 방식은 3가지이다. Topic, Service, Action 관계는 아래 그림과 같다.

https://cafe.naver.com/openrt/24086

Node Interface

Node 간 데이터를 주고받는 형식이다. Interface에는 IDS(Interface Definition Language)와 msg, srv, action이 있다. msg는 Topic에서 주고받는 데이터, srv는 service에서 주고받는 데이터, action은 action에서 주고받는 데이터이다. 이 데이터들은 Interface file에 저장돼 있다. 아래 파일은 그 예시이다.

//filename.msg || filename.srv || filename.action
field_type1 field_name1
field_type2 field_name2
field_type3 field_name3
--- // 서비스와 action은 아래 bar로 feedback 과 response에 관한 interface도 정의해야 한다. 

Node Parameter

Parameter는 Node안에 있는 Parameter Server이다. 전역변수로 해당 노드의 필요한 정보를 Get 하고 Set 할 수 있다. 따로 컴파일하지 않고 고칠 수 있는 부분이다.

//example
ros2 param list
ros2 param describe <>

node를 실행할 때 3가지 방식으로 parameter를 줄 수 있다. 대체하거나, 세팅하거나, 파일로 줄 수 있다.

// remapped using the syntax -r <old name>:=<new name>.
// --ros-args -p param_name:=param_value //setting
// --ros-args --params-file demo_params.yaml // from file => 
ros2 param dump /turtlesim // turtlesim noded안의 parameter setting을 다운 받음

Namespace vs ROS_DOMAIN_ID

Parameter는 Node안에 있는 Parameter Server이다. 전역변수로 해당 노드의 필요한 정보를 Get 하고 Set 할 수 있다. 따로 컴파일하지 않고 고칠 수 있는 부분이다. 같은 네트워크를 공유할 경우 namespace는 다른 rqt에서도 보인다. 그러나 DOMAIN ID를 나누면, 다른 default domain id에선 안 보인다. 

// Domain ID
export ROS_DOMAIN_ID=11 //0~101
// Namespace
ros2 run turtlesim turtlesim_node --ros-arg -r __ns:=/namespace1

ps.

  • rosout이라는 topic에 의해 Node의 log를 볼 수 있다. DEBUG, INFO, WARN, ERROR, FATAL

ref.

  1. 함수 포인터로 매개변수로 넘겨져서 다른 곳에서 실행할 수 있게 하는 구조이다. 자세한 것은  https://luckydipper.tistory.com/33 함수형 프로그래밍 포스팅에 남긴다. [본문으로]
반응형

'Engineering > ROS' 카테고리의 다른 글

Ros Serial로 IMU 데이터를 얻는 방법  (0) 2025.10.15
ROS2 표준 시간, 좌표계  (1) 2025.01.12
ROS2 참고 사이트  (2) 2025.01.10
ROS2 빌드, 파일 시스템  (4) 2025.01.08
Docker로 ROS를 사용하면 안 되는 이유  (3) 2025.01.06