저번 글과 연결됩니다. >> 거북이 조종 실습

패키지란?

  • ROS에서 개발되는 SW를 논리적 묶음으로 만든 것

패키지 관련 ROS 명령어

rospack list # 패키지 나열
rospack find [pkg name] # 패키지 이름으로 검색
roscd [location_name/subdir] # ROS 패키지 디렉토리로 이동
rosls [location_name/subdir] # ls 명령어와 비슷
rosed [file_name] # 에디터로 파일 편집

패키지 만들기

cd ~/xycar_ws/src # 패키지를 담을 디렉토리로 이동
catkin_create_pkg my_pkg1 std_msgs rospy
# catkin_create_pkg : 패키지 새로 만들기
# my_pkg1 : 패키지 이름
# std_msgs, rospy : 이 패키지가 의존하는 다른 패키지를 나열

패키지 빌드

cd ~/xycar_ws # 항상 여기서 빌드하자.
catkin_make # 빌드 명령어

cm # 이전에 bashrc파일 설정을 했다면, cm으로 한 번에 빌드할 수 있다.

패키지 확인

rospack find my_pkg1 # my_pkg1를 찾고 위치를 출력
rospack depends1 my_pkg1 # my_pkg1가 의존하는 패키지 출력
roscd my_pkg1 # my_pkg1 위치로 이동

코드 작성

  • 소스 파일 생성
cd ~/xycar_ws/src/my_pkg1/src
vim pub.py # vim은 파일 편집기로, vscode나 다른 편집기를 사용해도 무방하다.
  • 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()
  • 실행 권한 부여
.../my_pkg1/src$ ls -l
# 실행 권한이 없는 것을 볼 수 있다.

chmod +x pub.py # 실행권한 주기

프로그램 실행

  • 터미널 4개를 띄우자
# 터미널 1
roscore

# 터미널 2
rosrun turtlesim turtlesim_node

# 터미널 3
chmod +x pub.py
rosrun my_pkg1 pub.py

빙글빙글 도는 거북이를 볼 수 있다.

토픽 살펴보기

  • turtle이 어떤 토픽에 어떤 메시지를 발생하는지 알아보자
rostopic list
rostopic type /turtle1/pose
rosmsg show turtlesim/Pose
rostopic echo /turtle1/pose

토픽을 출력해 보자

  • 아까와 같은 위치에
cd ~/xycar_ws/src/my_pkg1/src
vim pub.py # vim은 파일 편집기로, vscode나 다른 편집기를 사용해도 무방하다.
  • 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)
rospy.spin()
  • 권한 설정 및 실행
# 터미널 1
roscore

# 터미널 2
rosrun turtlesim turtlesim_node

# 터미널 3
rosrun my_pkg1 pub.py

# 터미널 4
chmod +x sub.py
rosrun my_pkg1 sub.py

roslaunch

  • 패키지의 여러 파일을 동시에 실행할 수 있음
    • 위에서 sub.py, pub.py를 따로 실행한 것을 한 번에 실행할 수 있음

.launch 태그

  • node : 실행할 노드 정보를 입력할 때 사용되는 태그
# example...
<node pkg="패키지 명" type="소스파일 명" name="노드 이름"/>
  • include : 다른 lanch 파일을 불러올 때
<include file="같이 실행할 .lanch파일 경로"/>

launch 파일 생성

  • launch 폴더, 파일은 따로 생성해 줘야 한다.
cd ~/xycar_ws/src/my_pkg1
mkdir launch
cd launch

gedit pub-sub.launch
  • 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>
  • launch 파일 실행
roslaunch my_pkg1 pub-sub.launch

launch파일로 param을 통해 파라미터를 전달하기

  • 기존 pub.py를 수정한 pub_param.py를 새로 만들자.
cp pub.py pub_param.py
gedit pub_param.py
  • pub_param.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
linear_X=rospy.get_param('~circle_size)
msg.linear.x = linear_X

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()
  • launch 파일 생성
gedit pub-sub-param.launch
  • pub-sub-param.launch
<launch>
	<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"/>
	<node pkg="my_pkg1" type="pub_param.py" name="node_param"/>
		<param name="circle_size" value="2"/>
	</node>
	<node pkg="my_pkg1" type="sub.py" name="sub_node" output="screen"/>
</launch>
  • 실행
roslaunch my_pkg1 pub-sub-param.launch
  • pub-sub-param.launch파일의 파라미터 circle_sizevalue를 변경하면서 실행해 보자
profile
올해로 26세

0개의 댓글