ROS 프로그래밍1

Jaewon·2021년 6월 4일
0

ROS

목록 보기
7/9
post-custom-banner

ROS를 이제 조금 알게 되어 처음부터 다시 실습 실행

거북이 원으로 돌기

xycar_ws/src 밑에 my_pkg1을 만든다.
xycar_ws/src/my_pkg1 밑에 launch 폴더를 만든다.

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)

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)

while not rospy.is_shutdown():
    pub.publish(msg)
    rate.sleep()

코드 설명

#!/usr/bin/env python

파이썬을 사용할 것을 알린다.

import rospy
from geometry_msgs.msg import Twist

필요한 것들 import
geometry_msgs/Twist

rospy.init_node('my_node', anonymous=True)
pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

my_node라는 노드를 만들고 ,
Publisher객체 생성 (Twist 타입의 /turtle1/cmd_vel 이름으로 토픽을 만들며 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

Twist객체에 6개의 숫자들 넣는다.

rate = rospy.Rate(1)

1초에 한 번 발행을 위함

while not rospy.is_shutdown():
    pub.publish(msg)
    rate.sleep()

위에 6개의 숫자들 토픽을 publish하고,
1초에 한 번 발행을 위해 그 시간에 맞추어 쉬어간다.

실행

실행권한을 준다.

chmod +x pub.py

터미널 1

roscore

터미널 2

rosrun turtlesim turtlesim_node

터미널 3

rosrun my_pkg1 pub.py

터미널 4

rqt_graph


-> 이때, my_node 뒤에 숫자는

rospy.init_node('my_node', anonymous=True)

에서 anonymous=True 옵션때문이다.

거북이 원으로 돌기 출력

sub.py

#!/usr/bin/env python

import rospy
from geometry_msgs.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)
rospy.spin()

코드 설명

#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Pose

파이썬 사용하고 관련 된 것 import

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

data.x, data.y와 id를 loginfo해서 출력

rospy.init_node('my_listener', anonymous=True)
rospy.Subscriber('/turtle1/pose', Pose, callback)
rospy.spin()

my_listener이름으로 노드 생성
Pose 타입 /turtle1/pose 이라는 토픽이름으로 Subscriber임을 알린다.

이때, 메시지를 수신하면 callback 함수 호출
이것을 반복한다.

실행

실행권한을 준다.

chmod +x sub.py

터미널 1

roscore

터미널 2

rosrun turtlesim turtlesim_node

터미널 3

rosrun my_pkg1 pub.py

터미널 4

rosrun my_pkg1 sub.py

터미널 5

rqt_graph

launch 이용

실행

<node pkg="패키지 명" type="노드 포함 소스파일 명" name="노드 이름" /> 

launch 같이 실행

<include file="같이 실행할 *.launch 파일 경로" />
ex 1 ) <include file="../이름.launch" />
ex 2 ) <include file="$(find pkg)/src/launch/이름.launch" />

ros 파라미터 서버에 변수 등록, 변수 값 설정

<param name="변수 이름" type="변수 타입" value="변수 값" />

pub-sub.launch

<launch>
	<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" /> 
	<node pkg="my_pkg1" type="pub.py" name="pub_node" /> 
	<node pkg="my_pkg1" type="sub.py" name="sub_node" output="screen" /> 
</launch>

실행

roslaunch my_pkg1 pub-sub.launch 

post-custom-banner

0개의 댓글