The Robot Operating System (ROS) is a set of software libraries and tools that help you build robot applications. From drivers to state-of-the-art algorithms, and with powerful developer tools, ROS has what you need for your next robotics project. And it's all open source.
위에 있는 내용은 ROS 공식 홈페이지에 있는 ROS에 대한 설명이다.
해석하자면 로봇 프로그래밍을 위한 라이브러리와 도구들의 모음이라는 뜻인데 로봇 프로그래밍 자체가 처음이라면 의미가 바로 이해될리가 없다.
로봇 운영체제(ROS,Robot Operating System)는 로봇 응용 프로그램을 개발할 때 필요한 하드웨어 추상화, 하위 디바이스 제어, 일반적으로 사용되는 기능의 구현, 프로세스간의 메시지 패싱, 패키지 관리, 개발환경에 필요한 라이브러리와 다양한 개발 및 디버깅 도구를 제공한다. ROS는 로봇 응용 프로그램 개발을 위한 운영체제와 같은 로봇 플랫폼이다.
이 설명은 위키피디아에서 말하는 ROS의 정의이다
즉, Robot Operation System이라는 말과는 다르게, ROS는 운영체제가 아니라 로봇 개발을 위한 라이브러리(혹은 프레임워크)이다
그러면 이제 ROS는 로봇 프로그래밍을 위한 많은 라이브러리를 제공해주는 플렛폼이라는 것을 알게 되었다. 하지만 중요한것은 그게 아니다. 무엇보다 중요한 것은 구체적으로 ROS는 우리에게 어떤것을 제공해주고, 왜 ROS를 사용해야 할까?
나는 개인적으로 다음과 같은 생각을 가지고 프로그래밍을 하는 편이다.
새로운 기술은 기존 기술이 가지고 있는 불편함을 해소하기 위해 만들어진다
어디까지나 개인적인 의견이지만, 적어도 내 철학대로라면 ROS를 사용해서 로봇 프로그래밍을 진행할 경우, ROS를 사용하지 않는 로봇 프로그래밍보다 훨씬 편한 부분이 존재한다는 것이다.
이를 정확하게 이해하기 위해서는 ROS 프로그래밍의 구조를 확인해야한다.
위의 사진은 ROS의 노드(Node)를 가시적으로 표현한 그림이다.
노드란, 컴퓨터 과학에서 말하는 네트워크 상에 존재하는 데이터 지점들을 의미한다.
구체적으로, TCP/IP 통신 등을 이용한 노드간의 통신... 같은 어려운 내용이 존재하는데, 이런 내용은 ROS Wiki를 비롯하여 많은 사람들이 설명해두었으니 자세한 내용이 알고싶다면 이쪽을 참고하자.
내가 강조하고 싶은 내용은, ROS는 노드(Node)라고 하는 작은 프로그램의 집합이며, 각각의 노드끼리 서로 Message를 주고 받고 할 수 있다는 점이다.
조금 구체적인 예시를 들어주면, 자율주행 프로그램은 보통 아래와 같은 로직으로 운영이 된다.
① 여러개의 센서로부터 데이터를 수신받는다
② 받은 데이터를 가공해서 주변 환경과 자차상태을 인지한다
③ 주변 환경과 자차상태로부터 어떤 행동을 취해야 할지 판단한다
④ 판단한 내용을 실행(주행)한다
그렇다면 위와 같은 내용을 ROS 없이 제로빌드를 한다면 아마도 다음과 같은 식으로 구성되지 않을까 싶다.
def listenSensor(port):
# Code for listening sensor
return sensorData
def hanleSensorData(sensorData):
# Code for handle sensor data
return envData
def makeDrivingAlgorithm(carState, envData):
# Code for determine action
return controlCmd
def controlCar(controlCmd):
# Code for control car
return carState
if __name__ == "__main__":
th = thread.Threading(target=listenSensor)
th.start()
while True:
logic = makeDrivingAlgorithm(carState, envData)
carState = controlCar(logic)
아마도, 하나의 프로그램 안에 ①부터 ④까지의 모든 행동 로직을 집어넣고, 센서 수신 등의 일부 부분은 멀티 쓰레드를 활용하여 반복하도록 프로그램을 작성해야 할 것이다.
하지만, 만약에 이런 방법으로 프로그램을 짠다면 많은 문제점들과 마주하게 될 것이 분명하다.
하나의 프로그램으로 구성된 이상, 예외 처리를 매우 신중하게 하지 않는다면 매우 사소한 예외로 프로그램 전체가 멈출 가능성도 있고, 기본적으로 이런 프로그램 방식은 싱글 코어를 이용한 연산을 하기 때문에 스케쥴링에도 문제가 발생한다.
또한, 로직들이 서로 의존적으로 작성되어있기 때문에, 하나의 파트를 수정하다가 다른 부분이 연쇄적으로 문제를 만들어 낼 수 있다.
물론 이 모든 문제점을 염두해서 프로그램을 작성하는 것은 충분히 가능하다. 하지만 뭐라고 했는가?
새로운 기술은 기존 기술이 가지고 있는 불편함을 해소하기 위해 만들어진다
그렇다. 불편하다.
따라서 ROS를 사용한다면 위에 언급한 다양한 문제점을 간편하게 해결할 수 있다.
위와 같은 식으로 프로그램을 작성한다면, 하나의 노드가 멈춰도 전체적인 프로그램은 작동하며(물론 멈춘 노드에서는 데이터가 더이상 나오지 않을 것이니, 처리는 해줘야 한다), ROS가 자체적으로 프로그램 스케쥴링을 진행해주니, 자원 관리 측면에서 매우 편리해진다. 또한, 프로그램을 수정할 필요가 생겼을 때는, 각각의 노드를 수정하면 그만이고, 만약 노드 하나를 수정하다가 문제가 생겼다 하더라고, 메세지를 주고 보내는 부분만 잘 처리 한다면 정상적으로 작동할 것이다.
그리고, 다른 노드에서 발행하는 정보가 추가적으로 필요해질 경우, 해당 노드에서 발행(Publish)하는 메세지를 수신(Subscribe)하는 부분만 추가하면 끝나기 때문에, 확장성 면에서도 매우 우수해진다.
결론적으로, ROS를 이용한 프로그래밍을 진행할 경우, 그렇지 않은 경우에 비하여 프로그램 안정성, 스케쥴링, 확장성 등 많은 분야에서 훨씬 편해지는 것이다.
또한, ROS는 로봇 프로그래밍에 있어서 많은 도구들을 제공해준다. 그 중에서도 가장 많이 사용하게 될 도구들은 바로 시각화 도구이다.
강력한 시각화 도구 RVIZ
RVIZ를 이용한 시각화
ROS 프로그래밍에서 가장 많이 사용하게 될 시각화 도구는 바로 RVIZ이다. RVIZ는 ROS에서 노드들이 발행하는 메세지를 별도의 작업 없이 바로 시각화 할 수 있는 매우 강력한 도구이다.
한번 실제 코드를 보면 이해하기 훨씬 쉬울 것이다.
예를 들어, 차량의 현재 위치에 대한 메세지를 발행한다고 해보자.
ROS에서는 이에 대한 메세지 타입으로 nav_msg.msg.Odometry 라는 클래스를 제공해준다.
#!/usr/bin/env python
import rospy
from nav_msgs.msg import Odometry
import math
from tf.transformations import quaternion_from_euler
if __name__ == '__main__':
rospy.init_node("odometry") # define node name
publisher = rospy.Publisher("odom", Odometry, queue_size=5)
# publisher name: odom, msg type: Odometry
r = rospy.Rate(10) # node speed : 10hz
while not rospy.is_shutdown():
msg = Odometry() # define msg
msg.header.frame_id = "odom"
msg.header.stamp = rospy.Time.now()
msg.child_frame_id = "base_link"
msg.pose.pose.position.x = 4
msg.pose.pose.position.y = 3
msg.pose.pose.position.z = 0
quat = quaternion_from_euler(0, 0, math.radians(30))
msg.pose.pose.orientation.x = quat[0]
msg.pose.pose.orientation.y = quat[1]
msg.pose.pose.orientation.z = quat[2]
msg.pose.pose.orientation.w = quat[3]
publisher.publish(msg) # publish msg
r.sleep()
이번에는 실제로 동작하는 코드로, 10hz의 주기로, (x, y, z) = (4, 3, 0), 그리고 z축 방향(yaw)으로 30'만큼 회전해 있는 Odometry 클래스의 메세지를 발행하는 매우 단순한 코드이다.
이 코드를 실행한 상태로 RVIZ를 실행하면 아래와 같이 보인다.
놀랍게도, 파이썬 코드 그 어디에도 시각화 관련 코드는 존재하지 않지만, RVIZ가 알아서 메세지를 수신받아서 시각화 해주었다! (빨, 초, 파 순으로 x, y, z축이다)
그렇다면 이번에는 시간이 지남에 따라 점점 앞으로 전진하는 코드로 바꾸어보자.
#!/usr/bin/env python
import rospy
from nav_msgs.msg import Odometry
import math
from tf.transformations import quaternion_from_euler
if __name__ == '__main__':
rospy.init_node("odometry") # define node name
publisher = rospy.Publisher("odom", Odometry, queue_size=5)
# publisher name: odom, msg type: Odometry
x_position = 0.0
r = rospy.Rate(1) # node speed : 1hz
while not rospy.is_shutdown():
msg = Odometry() # define msg
msg.header.frame_id = "odom"
msg.header.stamp = rospy.Time.now()
msg.child_frame_id = "base_link"
msg.pose.pose.position.x = x_position
msg.pose.pose.position.y = 0
msg.pose.pose.position.z = 0
quat = quaternion_from_euler(0, 0, math.radians(0))
msg.pose.pose.orientation.x = quat[0]
msg.pose.pose.orientation.y = quat[1]
msg.pose.pose.orientation.z = quat[2]
msg.pose.pose.orientation.w = quat[3]
x_position += 0.2
publisher.publish(msg) # publish msg
r.sleep()
위 코드는 아까 전의 코드에서 약간 수정하여, 1hz 주기로 작동하며, 1초마다 x로 0.2씩 이동하는 Odometry 메세지를 발행한다.
GIF로 바꾸면서 화질이 나빠지긴 했지만... 빨간 화살표 모양의 Odometry가 앞으로 전진하는 것을 확인할 수 있다.
중요한 것은, 이런식으로 ROS가 제공해주는 메세지들은 전부 RVIZ 상에서 별도의 과정 없이 직접 시각화가 가능하다는 점이다!
ROS는 로봇 프로그래밍을 위한 라이브러리로, 사용할 경우 그렇지 않을 때에 비하여 많은 장점을 가진다. 또한, 시각화 도구를 비롯하여 많은 개발상 편의 도구를 제공해준다.
ROS 설계의 철학을 이해하고, 이를 잘 활용한다면, 앞으로 로봇 프로그래밍에 있어서 마주할 다양한 문제들을 ROS를 이용하여 쉽게 해결할 수 있을 것이다.
https://zybuluo.com/bothbest/note/2626192
https://www.legendary11.com/blogs/view/24071
https://bamboochopsticks.storeinfo.jp/posts/57478356
https://bambooflooring.shopinfo.jp/posts/57478433
https://squidwardcc.org/forum/viewtopic.php?t=19852
https://www.xcspa.com/does-bamboo-flooring-scratch-easily-the-truth-uncovered/
https://bambooflooring.alboompro.com/post/322982-is-bamboo-flooring-safe-for-kids-and-pets
https://connect.usama.dev/blogs/38082/Why-Low-VOC-Bamboo-Flooring-Matters-for-Your-Home
https://paidforarticles.in/carb-phase-2-e1-certifications-what-they-really-mean-for-bamboo-flooring-872877
https://bothbest.weebly.com/blog/how-to-check-formaldehyde-emission-levels-in-bamboo-flooring
너무 잘 보고 갑니다! 감사합니다!