본문 바로가기
Robotics Engineer/ROS2

[ROS2] ROS2와 ROS1 비교하기 , ROS2 시작

by 담백로봇 2022. 12. 26.

Goal : ROS2에서 ROS1과 달라진점 알아보기 

Reference: 

1.  https://medium.com/@oelmofty/ros2-how-is-it-better-than-ros1-881632e1979a

2. https://roboticsbackend.com/ros1-vs-ros2-practical-overview/

3. Robot Operating System 2: Design, Architecture, and Uses In The Wild(2022) - Steve Macenski, etc

 


[INTRO]

2019년도에 학교 인턴을하면서 접한 ROS가 밥줄이될 줄은 꿈에도몰랐다. 처음 ROS를 접하였을땐 너무 복잡하고 어려워 취업할때는 이쪽관련이 아닌곳에 가리라 생각했지만 막상 취업한 회사가 ROS BASE였을줄은. 허나 많이 접하고 많이 깨지고 살을 맞붙이며 살다보니 ROS가 로봇 개발하기 좋은 Tool이라고 생각이든다. 다른 시스템은 접해보지못했지만 지금은 거부감없이 쉬운 툴이되었다.  연차가 쌓이면 자신감이 쌓이게되고 여러 현장에 파견을 가며 ROS를 잘 모르는 사람들이 신기한 유니콘을 보듯하지만 살을 붙여보고 산사람들은 ROS1이 꾀나 불안정한 형태의 통신을 가지고있다는것을 잘알것이다. 로봇을 많이 붙여 통신을 시작하면 망이 작살이나 먹통이되고 로봇이 통쨰로 바보가 되버리고 간혹 원인미상의 노드 죽음으로 로봇을 수없이 껐다 켰다 반복한다. 작업자분들에게 처치 원리 1번으로써 " 로봇이상있으면 껐다가 다시 켜주세요..."  처음에 말할때는 기술수준이 미약해 부끄러웠지만 나중에 말할때는 당당하게 말하는 엔지니어가 되어버렸...

 

이런 ROS의 단점을 극복하는 버전으로 어느새 ROS2라는 버전이 나오게되고 회사에서는 ROS2에 점점 관심을 가졌지만 난 지금 시스템도 불안한데 ROS2로 집중력을 분산시키는것은 말이 되지않는다고 생각했다. 고집이 쌓이게되고 ROS2는 언제가 금방 배울수있겠지 생각하고 내버려뒀었다. 근데 이제 일도안하고 학생신분이되어 좀 살펴보았는데 꾀나 달라진점이 많았다. 로봇은 정말 문제 생길 부분이 많아 시스템만이라도 강건하고 문제를 일으킬 부분이 없어야하는데 ROS2는 과연 어떨지 궁금하다. 이번 기회에 서로의 달라진점을 알아보며 ROS2에 익숙해져봐야겠다. 


[Overview]

 ROS2 는 우선 ROS1의 단점을 극복하기 위해 5가지 특성을 집중했다. 1.Security 2.Embedded Systems 3.Diverse networks 4. Real-time computing 5.Product Readiness.

 

1번 보안은 정말 ROS1에서 취약하디 취약해서 누구든 마음만 먹으면 로봇에 들어가서 소스 강탈할수있다.. 이를 신경썼군. 2번은 ROS2가 엠배디드 시스템(작은 컴퓨터 보드-ei. JETSON board) 에서 작동할수있도록 만들었고. 3번은 좀더 네트워크 통신에 신경썼다는것. 4번은 실제 시간으로 프로그램이 작동하수있다고하는데 이는 좀더 이해해보도록 하자. 5번은 산업현장에서 적합하게 사용되도록 안정성과 산업기준을 맞추도록 노력했다는것이다. 통신은 정말 개선이 필요했다!  통신을 좀더 설명하자면 ROS2에는 DDS( Data Distribution Service protocal) 을 사용하였고 ROS1은 TCP/UDP통신을 사용되었다. DDS는 정말 중요한 시설에 사용되며 보안은 보증하며 더 넓은 영역에 확실한 통신을 가능하게 해준다. 이와 반대로 TCP/UDP통신은 산업기술측면에서는 부족.

 

출처:https://medium.com/@oelmofty/ros2-how-is-it-better-than-ros1-881632e1979a

위 그림처럼 TCP/UDP통신을하시 중간에 로봇의 topic/service 내용들을 중간에서 쉽게 가져올수있어 보안 문제가 생길수있다.( 이제 토픽 보내달라고하지마). 하지만 DDS를 사용시 이러한 문제를 해결할수있다고한다!

 

ROS2  Architecture (출처: [3])

위 두장은 ros2를 한눈에 볼수있는데 ros에 익숙한 사람이라면 이해하는데 어렵지않을것이고 오른쪽 짤렷네(ros2 client library API stack) 구조에서보듯이 이번 ros2는 통신에 신경쓰며 정말 현장에서 안정적으로 쓰일수있게 노력한것이 보인다. 자세한 설명은 이제 아래부터 시작.


[ROS1 VS ROS2 노드작성]

rclcpp, rclpy 로 변경. ROS1에서는 c++로짜던지 python으로 짜던지 상관이없이 같이 사용가능한것이 좋은데 roscpp,rospy였던것들이 이제 C 로 실행이 되면서 rcl 이란 단어가 붙게되었다. 그리하여 자바까지 사용가능! 어떤 포맷인지는 나중 포스트에.

출처: https://medium.com/@oelmofty/ros2-how-is-it-better-than-ros1-881632e1979a


노드에 정해진 포맷.  ROS1에서는 노드 작성시 정해진 포맷이없어 유저마다 다른 표현이 가능했으나 이제  정해진 포맷이 생겨 쉽게 읽을수있다.  (rclcpp::Node in Cpp, rclpy.node.Node in Python) (에구.. 이것도 익혀야겠네)


노드의 작동 구조 변화. ROS1은 처음에 싱글 프로세스로 계발됬지만 나중에 Nodelet이 도입되면서 멀티 노드들이 하나의 프로세스에서 돌수있게되었는데 ROS2에서는 이 기능이 내재되어있다. 다양한 노드들이 하나의 프로세스에서 돌게되면 장점으로 메모리를 공유할수있어 큰 데이터 경우 메모리 접근으로 빠르게 공유할 수 있다.  정리하면 ros1과 딱히 아웃풋은 차이가 없고 내부적 구조만 바뀌었다.


Lifecycled node 추가. ros2에 새롭게 추가된 기능인데 정확히는 써봐야알겠지만 이제 status를 정할수있어 각 status마다 실행시킬것인지 말것인지 정할수있다. 예를들어 처음 퍼블리셔에 메모리를 할당하고 그후 센서를 이니셜라이징하고 루프를 돌리는것에 조건을 달수있는것.


런치 포맷 변경. 에라이 다바뀌는구만.. 기존 런치는 xml 형식이였다면 이제 python으로 런치가 변경되면서 이또한 새로 배워야함.

 

[Communication]

 

Master 의 부재. ROS1에서는 ROS MASTER라는 녀석이 있는데 이녀석은 노드들간 중개인 역할을 하며 만약 어떠한 잘못으로 죽게된다면 로봇을 다시 켜야하는 불상사가 발생한다. 허나 ROS2에서는 ROS MASTER가 없어지며 노드들끼리 통신을 가능하게한다. 그리하여 하나의 노드가 죽더라도 로봇 전체가 뻑나는 상황은 방지할 수 있다.

출처:https://medium.com/@oelmofty/ros2-how-is-it-better-than-ros1-881632e1979a


글로벌 파라미터 서버삭제. ROS1에서 존재하는 파라미터 관리기인 글로벌 파라미터 서버가 삭제되고 ROS2에서는 개별 노드로 파라미터 서버가 작동하게된다.  글로벌 파라미터로 노드 이름의 Namespace로 구분되었는데 이제 다른 노드에서 침범하지 못하게 바뀌었다. (좋은건가? 관리가 더 편해졌다는데 써봐야 알듯하다)


서비스(service) 변화.  ros1에서 서비스 synchronous 방식으로 (동시에 일어나는 트리거)로 기존의 문제점으로 발신된 서비스가 응답을 받지못하면 발신된 노드가 멈춰버리는 상황이 생길수있었는데 ROS2에서는 Asynchronous 방식으로 수정하면서 멈추는 일을 제거하였다! (이건 좋다!)  **서비스란 한번 발생시킬수있는 기능으로 특정 트리거를 발동시키고 싶을때 유용하며 send 및 response 을 받는다**


액션(Action) 변화. ros1에서는 액션은 부수적인 기능으로 딱히 메인이 아니였으나 ros2에서부터는 코어기능으로 추가되었다. CPP & PYTHON API구조는 ROS1과 비슷하며 Asyncronous방식으로 topic을사용하여 정보를 공유한다. (status feedback etc..).  추가된것은 이제 액션도 커맨드 라인으로 명령을 입력할 수 있다고한다(서비스처럼 편해졌네)

리마인드 할겸 (출처:https://www.mathworks.com/help/ros/ug/ros-actions.html )


Msg, service name 변화. ros2에서는 package name과 msg/srv 라는 것이 앞에붙게됬다. 기존에는 앞에 노드 이름이 붙었는데.. 

my_robot_msgs/msg/Temperature.
my_robot_msgs/srv/ActivateButton.

QoS (Quality of Service) 추가.  ROS2에서는 통신 관련된 기능으로 QoS라는 것이 추가됬는데 이는 보낸 메세지가 망이 불안정하여 메세지가 누락될수있는데 이를 확실하게 메세지를 받았는지 그냥 누락되도 괜찮은지 설정하는 기능으로 보인다. 자세한것은 더 공부가 필요.

 


[Conclusion]

지금까지 내가 작성한 포스트 중에 가장 길며 미루어오다 한번에 정리하니 마음이 후련하다.  자 이제 누군가가 " ROS2와 ROS1의 차이는 뭐야? 뭐가 좋아?" 라고 물어보면  가장 큰 변화는 ROS2의 외부통신이 더 안정적이고 안전하게 바뀌어 산업 현장에서 더 강건하게 사용할 수 있다고 말해주면된다.  아니 그러면 당장 ROS2로 바꿔야하지!! 할수있는데 그건 각 입장에 따라 다르다. ROS1 오래된 구력만큼 안정화된 플러그인이 제공되고있으며 이 플러그인이 ROS2에는 없을수도있고 거대한 legacy 를 ros1으로 짜놓은상태라면 migration은 당장은 힘들수있겠다.

첫 로봇회사에 들어갔을때부터 단순하지만 강건하여 걱정하지않고 사용할수있는 시스템을 가져야한다고 생각했고 ROS1을 이용해 빠르게 개발 및 적용시킬수있지만 한계점이 있음을 깨달았다. 선구자들이 지금까지 쌓여왔던 경험들로 ROS2를 탄생시켰고 부디 안정적인 로봇 오퍼레이팅 툴로 사용됬으면 좋겠다. 직접 살을 맞붙이고 살아봐야 알겠지만 강건한 툴로 로봇 산업이 좀 더 커지고 탄탄해졌으면 좋겠다.

댓글