📔 오늘 공부한 내용

이번 주 3일은 ROS에 대한 기초적인 학습을 진행하고 있다. C++ 가이드라인에 대한 Zoom 실시간 수업과 더불어 LMS로 수강중에 있는데 양이 너무 많아서 ROS에 대한 내용은 따로 정리하고 있다.

ROS

ROS는 Robot Operation System의 약자로 로봇을 제어하고 개발하기 위한 일종의 플랫폼이다. Operation System이지만, 윈도우나 우분투처럼 PC의 하드웨어에 직접 붙어서 동작하는 운영체제는 아닌, Middleware와 같은 개념의 운영체제이다.

ROS의 장점

로봇을 개발하기 위해서는 다양한 기반 시스템들이 구축되어야 할 것이다. 센서에서 데이터를 불러오는 모듈, 하드웨어를 각각 제어하는 모듈 등 기초적인 것들이 완성되어 있는 상태이어야만 로봇에 대한 개발이 가능할 것이다. 하지만, ROS는 이러한 기반 환경을 미리 만들어주는 도우미 같은 역할을 해준다.

ROS의 단점

ROS는 앞서 말한 요소들이 다 포함되어 쉽게 개발할 수 있지만, 사용하지 않는다면 불필요한 요소들이 될 수 있다. 실제로 ROS를 이용해 로봇을 개발하면, 실제 제품을 만드는 과정에서 불필요한 요소들을 제거하는 최적화 과정이 필요하다. 따라서, 일반적인 상용차량 업체에서는 ROS를 사용하지 않는다.

ROS의 특징

  1. ROS는 로봇 코드의 재사용이 용이한 환경 제공을 목표로 한다.
  2. Rviz, RQT, Gazebo와 같은 다양한 도구를 함께 사용할 수 있게 해준다.
    • Rviz: 센서 데이터를 시각화해 제공하는 도구
    • RQT: Qt 기반의 GUI 개발도구로, 노드 모니터링과 노드 간 그래프 시각화 기능을 제공
    • Gazebo: Simulation 도구
  3. 다양한 OS에서 통일된 방법으로 상호 작용을 구현하는 것이 가능하다.

ROS 통신

ROS에서는 노드간 통신을 기반으로 전체 시스템이 구동된다. 노드는 Topic을 생성할 수 있으며, Topic을 만드는 Publish과정과 Topic의 데이터를 가져오는 Subscribe 과정을 통해 통신을 수행한다.
ROS1에서는 단일 로봇 머신을 기반으로, ROS2는 다중 로봇 머신을 기반으로 제작되었다. ROS1에서는 ROS Master가 존재해서 Master의 도움을 받아 서로 메시지를 주고 받는다. 노드는 OS의 도움을 받아 하드웨어를 제어할 수 있다.

  • Node: 프로그램 하나의 단의
  • Topic: Node에서 발행하는 데이터(통신을 위한 데이터)
  • Publisher: Topic을 발행하는 노드
  • Subscriber: Topic을 수신하는 노드
  • Packages: 여러개의 Node를 묶어놓은 단위

ROS에서는 통신을 수행할 때, 1:1, 1:N, N;N 모든 방식으로 통신이 가능하다. ROS에는 두 가지 방식의 통신 방식을 지원한다.

ROS 주요 명령어

  • roscore: ROS 기본 시스템이 구동되기 위해 필요한 프로그램들을 실행
  • rosrun [package_name][node_name]: 패키지에 있는 노드를 선택해 실행
  • rosnode [info...]: 노드의 정보를 표시(발행, 구독 정보)
  • rostopic [option]: 토픽의 정보를 표시
  • roslaunch [package_name][file.launch]: 파라미터 값과 함꼐 노드를 실행
  • rqt_graph: 노드와 토픽의 관계 정보를 그래프로 출력

ROS Package

ROS에서 Package는 개발되는 소프트웨어를 논리적으로 묶은 것을 말한다. 다음의 명령어를 통해 패키지를 생성할 수 있다. 이때 패키지 생성은 단순한 폴더를 만드는 것이라고 볼 수 있고, 패키지는 src 폴더 내부에서 생성해야한다.

# 패키지 생성
catkin_create_pkg [package 이름] [dependency packages...]

# 패키지 빌드
catkin_make

catkin_make 과정은 워크 스페이스의 최상위 폴더에서 진행해야 정상적으로 빌드가 가능하다. 또한, 다양한 패키지 관련 명령어를 통해, 패키지에 대한 정보를 확인할 수 있다.

# 패키지 목록 보기
rospack list

# 패키지 찾기
rospack find [package 이름]

# 패키지에 대한 의존 패키지 정보 보기
rospack depends1 [package 이름]

Node

ROS에서 프로그램의 하나 단위를 Node라고 하는데, 다음과 같은 형태로 코드를 작성할 수 있다.

Python 기반 Publisher

#!/usr/bin/env python

# ROS에서 필요한 메시지 타입, Core를 import
import rospy
from geometry_msgs.msg import Twist

# 노드 정보(이름) 선언
rospy.init_node('my_node', annoymous=True)

# Publisher 생성(turtle/cmd_vel이라는 이름의 Twist 메시지)
pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

# 메시지 내용 생성
msg = Twist()
msg.linear.x = 2.0
...

# 메시지 발행 주기 설정(1Hz)
rate = rospy.Rate(1)

# 발행 주기에 따른 메시지 발행
while not rospy.is_shutdown():
	pub.publish(msg)
    rate.sleep()

이렇게 작성한 파이썬 코드를 실행하기 위해서는 실행 권한을 부여해야 하며, 다음과 같은 명령어로 부여할 수 있다.

# pub.py에 x(실행) 권한 부여
chmod +x pub.py

Python 기반 Subscriber

#!/usr/bin/env python

# 필요한 파이썬 패키지 및 메시지 import
import rospy
from turtlesim.msg import Pose

# 메시지를 수신했을 때의 Callback 함수
def callback(data):
	s = "Location: %.2f, %.2f" % (data.x data.y)
    rospy.loginfo(rospy.get_caller_id() + s)
    
# Node 정보 설정
rospy.init_node("my_listener", annoymous = True)

# 구독할 노드 정보와 callback 연결
rospy.Subscriber("/turtle1/pose", Pose, callback)

# Rate에 따른 Node 순회
rospy.spin()

Launch 파일

앞서 만든 노드들을 실행할 때에는 rosrun을 통해 사용하고 있다. 실행해야 할 노드들이 많고, 상황에 따라 설정 데이터를 변경하려면 굉장히 번거로운 환경이다. 따라서, ROS에서는 launch 파일을 생성해서 노드를 실행할 수 있는 기능을 제공한다.
launch 파일은 패키지 내부에 만들어져 있어야 한다. 패키지 내부의 launch 폴더 하위에 만들어 저장하면 된다. launch 파일은 실행될 노드에 대한 정보가 XML 형태로 기록되어 있다.

<launch>
	/* 노드를 실행하기 위한 태그 */
	<node pkg="패키지 명" type="노드가 포함된 소스파일 명" node="노드 이름"/>
    /* 다른 launch 파일을 포함하기 위한 태그 */
    <include file="launch 파일 경로"/>
    
    /* 노드에 파라미터를 전달해 실행 */
    <node name="usb_cam" pkg="usb_cam" type="cam_node" output="screen">
    	<param name="autoexposure" value="false"/>
        <param name="exposure" value="150"/>
        ...
        <param name="변수명" type="변수 타입" value="변수 값"/>
    </node>
</launch>

launch 파일에서 지정한 파라미터는 대부분 타입을 알아서 cast해준다. 지정한 파라미터를 python 코드에서 사용할 때에는 다음과 같이 사용하면 된다.

linear.x = rospy.get_param("~circle_size")

launch 파일을 실행하면 roscore가 자동으로 실행되기에 더 편리함이 있다.

📝 TIL을 정리하며

🤕 어려웠던 점

아직은 기초적인 내용이라 어려운 점은 없다. 학부 때 공부했던 내용이기에 복기하듯이 공부했다.

🤔 궁금한 점

아직은 궁금한 점은 없었다.

😁 느낀 점

학부때 ROS1과 ROS2에 대해 모두 공부해봤기에 이해하는 데 어렵지 않았다. M1 Mac을 쓰기에 Docker로 환경을 구성해야 하는데, 아직 환경 구성이 이뤄지지 못했다. 별도의 PC에 우분투를 깔아 공부하고 있다. 실습 때에는 맥에서는 ROS 프로그래밍을 진행할 때, Cuda와 같은 다양한 제약들이 존재하기에 별도 환경을 구축할까 고민중이다.
강의의 양이 많아서 따라가는데 어려움이 있다. 아무래도 이번 추석에는 조금 강의를 들어야겠다.


📌 프로그래머스 데브코스 6기 자율주행 인지과정(Perception) 수강 내용을 바탕으로 정리한 TIL 입니다.
📅 Today: 2023. 9.26.

profile
그냥 끄적여보는 블로그

1개의 댓글

comment-user-thumbnail
2024년 1월 5일

안녕하십니까
ros글을보고 이렇게 문자 적어 봅니다.
제가 로봇을 만들고 있는데 이제 sw를 올려 볼까 하는데(sw를 잘 모름..ㅜㅜ)
ros를 이용하여 지도 제작/자율주행 및 회피를 할 수 있게 도움을 주실수 있는지요?
생각해 보시고 서로 코웍 할 수 있다면 회신이나 연락 부탁 드립니다
감사합니다.
010 8857 9788

답글 달기