[2023-03-27] 4. ROS 패키지 및 프로그램 실행
ROS 프로그래밍 기초
ROS 패키지
ROS 패키지란?
- ROS에서 개발되는 소프트웨어를 논리적으로 묶음으로 만든 것
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
- 패키지를 담을 디렉터리로 이동 후 패키지 새로 만들기
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 노드에서 거북이가 파이썬 코드대로 움직이는 것을 확인 할 수 있음
- ROS 시스템에서 자동으로 my_node 뒤에 Serial No.를 붙여줌(노드를 만들 때 코드에서 annoynmous true로 설정함)
- rosnode list를 입력해도 정상적으로 동작하는 것을 확인할 수 있음
토픽과 메시지 유형 확인
$ rostopic list
를 입력해 지금 날라다니는 topic의 리스트를 확인$ rostopic type /turtle1/pose
를 입력해 토픽의 메세지 유형을 확인$ rosmsg show turtlesim/Pose
를 입력해 방금 찾아낸 turtlsim/Pose 메시지 유형의 구조를 확인
$ rostopic echo /turtle1/pose
를 입력해 현재 토픽에서 발행되는 메시지를 실시간으로 출력하여 확인
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에게 보내주는 것을 확인할 수 있음