ROS 프로그래밍 기초

ROS 패키지

ROS 패키지란?
  • ​ ROS에서 개발되는 소프트웨어를 논리적으로 묶음으로 만든 것

image

ROS가 제공하는 편리한 명령들
  • $ rospack list : 어떤 패키지들이 있는지 나열

  • $ rospack find [package_name] : 이름을 이용해서 패키지 검색

  • $ roscd [location_name[/subdir]] : ROS 패키지 디렉터리로 이동

  • $ rosls [location_name[/subdir]] : 리눅스의 ls와 유사 (경로를 몰라도 이름 적용 가능)

  • $ rosed [file_name] : 에디터로 파일 편집

ROS 패키지 만들기

 $ cd ~/xycar_ws/src  
 $ catkin_create_pkg [패키지 이름] [패키지가 의존하고 있는 다른 패키지들]
 e.g. $ catkin_create_pkg my_pkg1 std_msgs rospy
  • 패키지를 담을 디렉터리로 이동 후 패키지 새로 만들기

image

ROS 패키지 빌드

 $ cd ~/xycar_ws
 $ catkin_make
 
 $ cm # alias로 설정해놨기 때문에 cm으로 빌드 가능
  • 패키지를 담을 디렉터리로 이동 후 패키지 새로 만들기

ROS 패키지 확인

 $ rospack find my_pkg1 # my_pkg1을 찾음
 $ rospack depends1 my_pkg1 # my_pkg1이 의존하는 다른 패키지들을 알려줌
 $ roscd my_pkg1 # my_pkg1으로 이동

ROS 프로그램의 실행 및 검증 확인

Publisher
  • my_pkg1 디렉터리의 src 디렉터리에 pub.py 생성
#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

rospy.init_node('my_node', anonymous=True) # 노드를 만듬
pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) # Publisher 객체 생성

msg = Twist()
msg.linear.x = 2.0
msg.linear.y = 0.0
msg.linear.z = 0.0
msg.angular.x = 0.0
msg.angular.y = 0.0
msg.angular.z = 1.8

rate = rospy.Rate(1) # 1초에 1번 1Hz 주기로 메시지 발행

while not rospy.is_shutdown():
    pub.publish(msg)
    rate.sleep()
프로그램 실행 권한
  • 작성한 파이썬 코드를 실행시키려면 실행권한 필요
  • $ chomod +x pub.py 로 실행권한 부여
실행순서
  • 터미널 #1 에서 $ roscore

  • 터미널 #2 에서 $ rosrun turtlesim turtlesim_node

  • 터미널 #3 에서 $ chmod + x pub.py

  • 터미널 #3 에서 $ rosrun my_pkg1 pub.py

  • 터미널 #4 에서 $ rqt_graph

실행결과
  • Turtlesim 노드에서 거북이가 파이썬 코드대로 움직이는 것을 확인 할 수 있음

image

image

  • ROS 시스템에서 자동으로 my_node 뒤에 Serial No.를 붙여줌(노드를 만들 때 코드에서 annoynmous true로 설정함)
  • rosnode list를 입력해도 정상적으로 동작하는 것을 확인할 수 있음
토픽과 메시지 유형 확인
  • $ rostopic list 를 입력해 지금 날라다니는 topic의 리스트를 확인
  • $ rostopic type /turtle1/pose 를 입력해 토픽의 메세지 유형을 확인
  • $ rosmsg show turtlesim/Pose 를 입력해 방금 찾아낸 turtlsim/Pose 메시지 유형의 구조를 확인

image

  • $ rostopic echo /turtle1/pose 를 입력해 현재 토픽에서 발행되는 메시지를 실시간으로 출력하여 확인

image

Subsriber
  • my_pkg1 디렉터리의 src 디렉터리에 sub.py 생성
#!/usr/bin/env python

import rospy
from turtlesim.msg import Pose

def callback(data):
    s = "Location: %.2f, %.2f" % (data.x, data.y)
    rospy.loginfo(rospy.get_caller_id() + s)

rospy.init_node("my_listener", anonymous=True) # 노드를 만들고
rospy.Subscriber("/turtle1/pose", Pose, callback) # Subsriber객체 생성 및 메시지 수신시 함수 호출
rospy.spin()
프로그램 실행 권한
  • 작성한 파이썬 코드를 실행시키려면 실행권한 필요
  • $ chomod +x sub.py 로 실행권한 부여.
실행순서
  • pub.py 가 실행되고 있는 상태에서 터미널을 새로열기
  • 터미널 #5 에서 $ chmod + x sub.py
  • 터미널 #5 에서 $ rosrun my_pkg1 sub.py

실행결과

  • 거북이가 움직이는대로 좌표가 바뀌는 것을 확인 할 수 있음
  • rqt_graph에서 /turtlesim이 turtle1/pose 값을 /my_listener에게 보내주는 것을 확인할 수 있음

image

image