ROS

ROS - turtlesim, publisher, subscriber

스테디음 2022. 3. 1. 20:25

<ROS 패키지 만들기>

패키지를 담을 디렉토리로 이동

$ cd ~/xycar_ws/src

 

패키지 새로 만들기

$ catkin_create_pkg my_pkg1 std_msgs rospy  //패키지를_새로_만들_때_사용하는_명령어  패키지_이름   이_패키지가_의존하고_있는_다른_패키지들을_나열

 

<ROS 패키지 빌드>

새로 만든 패키지를 빌드

$ cd ~/xycar_ws
$ catkin_make

 

<만들어진 패키지 확인>

$ rospack find my_pkg1
$ rospack depends1 my_pkg1
$ roscd my_pkg1

이렇게 나오면 제대로 설치된 것이다.

 

<Publisher 코드 작성>

~/xycar_ws/src/my_pkg1/src 위치에 pub.py라는 이름으로 작성

#!/usr/bin/env python  #파이썬이라는 것을 알려주는 코드

import rospy
from geometry_msgs.msg import Twist

rospy.init_node('my_node', anonymous=True) #노드 생성-노드 이름은 my_node, anoymous 이름같은 거 바꾸고 싶으면 바꿔 상관없어
pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10) #Publisher 객체 생성-지금 만든 노드는 PUblisher라는 것을 알림, 토픽 이름은 /turtle1/cmd_vel, 그 토픽은 데이터가 twist이다.

msg = Twist() #twist가지고 객체를 하나 만들어서
msg.linear.x = 2.0 #twist라는 데이터 타입의 객체에 데이터를 다 채워넣는다.
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

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

while not rospy.is_shutdown(): #파이썬 파일이 죽기 전까지
	pub.publish(msg)  #메세지 쏘기
	rate.sleep()

 

<프로그램 실행 권한>

작성한 코드를 실행시키려면 실행 권한이 있어야 한다.

이렇게 나온다면 실행권한이 없다는 뜻

실행권한 부여

$ chmod +x pub.py

이렇게 파일명이 초록색으로 변한다면 실행권한이 생긴 것이다.

 

<프로그램 실행>

터미널 #1

$ roscore

터미널 #2

$ rosrun turtlesim turtlesim_node

터미널 #3

$ rosrun my_pkg1 pub.py

거북이가 빙글빙글 돌고 있는 것을 볼 수 있다.

<Subscriber 코드 작성>

#!/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) #노드 이름은 my_listener, anonymous:여러 개 실행할 때 너가 숫자 붙여서 구분해
rospy.Subscriber("/turtle1/pose", Pose, callback) #/turtle1/pose이라는 토픽을 받을거고 토픽 안에 있는 메시지 타입은 Pose, 메시지를 수신하면 callback함수가 자동으로 실행된다.
rospy.spin() #while true

<프로그램 실행>

터미널 #1

$ roscore

터미널 #2

$ rosrun turtlesim turtlesim_node

터미널 #3

$ rosrun my_pkg1 pub.py

터미널 #4 (sub.py도 pub.py처럼 실행권한을 부여해주어야 한다.)

$ rosrun my_pkg1 sub.py

 

노드가 잘 동작하고 있는지 확인하고 싶다면,,

$ rqt_graph

'ROS' 카테고리의 다른 글

ROS - 노드 통신을 위한 패키지 만들기  (0) 2022.03.01
ROS - roslaunch  (0) 2022.03.01
ROS 설치 및 환경설정  (0) 2022.02.28
ROS 명령어  (0) 2022.02.28
ROS 구조 및 기능  (0) 2022.02.28