rclcpp 비교

같은 talker를 C++로 쓰면 무엇이 달라질까?

같은 바탕

rclcpp도 같은 rcl 위에 섭니다

C++ 노드는 rclcpp(ROS Client Library for C++)로 짭니다. rclpy와 rclcpp는 같은 rcl 위에 서 있습니다. 그래서 파이썬 talker와 C++ listener도 같은 토픽으로 그대로 이야기합니다.

공식 튜토리얼의 C++ talker를 기준으로 비교합니다. 클래스와 파일 이름은 줄였습니다.

main

init, spin, shutdown은 그대로

순서는 같고 이름만 rclcpp::로 바뀝니다. C++에서는 노드를 std::make_shared로 만들어 공유 포인터로 spin에 넘깁니다. 문장 끝마다 세미콜론이 붙습니다.

퍼블리셔

타입은 꺾쇠 안에 적습니다

파이썬은 메시지 타입을 인자로 넘기지만, C++은 꺾쇠 <> 안에 템플릿 인자로 적습니다. 타입 이름도 std_msgs::msg::String처럼 다 씁니다. self 대신 this->를 씁니다.

C++에서는 publisher_를 클래스 안에 타입과 함께 미리 선언해 둡니다.

타이머와 로그

콜백은 흔히 람다로 씁니다

C++ 튜토리얼은 콜백을 람다(lambda), 곧 그 자리에서 짓는 이름 없는 함수로 씁니다. 타이머는 create_wall_timer에 500ms처럼 단위를 붙여 넘기고, 로그는 RCLCPP_INFO 매크로로 남깁니다.

500ms라고 쓸 수 있는 것은 파일 위의 using namespace std::chrono_literals; 덕분입니다.

빌드

C++는 컴파일을 거칩니다

C++ 노드는 ament_cmake 패키지에 넣고(5강 9편), CMakeLists.txt에 실행 파일과 의존성을 적은 뒤 install(TARGETS ...)로 설치합니다. 코드를 고칠 때마다 다시 컴파일해야 하며, --symlink-install로도 건너뛸 수 없습니다.

package.xml에는 <depend>rclcpp</depend>와 <depend>std_msgs</depend>를 적습니다.

언제 무엇을

빨리 짜려면 파이썬, 빨리 돌려면 C++

둘은 같은 토픽으로 이야기하니 한 시스템 안에 섞어 써도 됩니다. 빠른 주기로 도는 제어나 센서 드라이버는 C++로, 빠르게 시험하고 고칠 노드는 파이썬으로 짜는 경우가 많습니다. 이 강의는 계속 파이썬으로 갑니다.

다음 강

보내고 끝이 아니라 답이 필요하다면?

7강 1편묻고 답하기가 필요할 때 6강 목록