1. 패키지 만들기
- 패키지를 담을 directory로 이동
$ cd xycar_ws/src/

- 패키지 새로 만들기
- catkin_create_pkg (패키지이름) (패키지가 의존하고 있는 다른 패키지 나열)
$ catkin_create_pkg my_pkg1 std_msgs rospy

- 새로 만든 패키지 빌드
$ cd .. 또는 cd ~/xycar_ws
$ catkin_make
또는
$ cm
이렇게 한번에 실행할 수 있다(~/.bashrc 파일에서 alias 선언해놓았기 때문)

- 만들어진 패키지 확인
$ rospack list | grep my_pkg1
또는
$ rospack find my_pkg1

- my_pkg1이 어떤 패키지를 의존하고 있는지 확인
$ rospack depends1 my_pkg1

2. 코드 작성 (1) - pub.py
- ~/xycar_ws/src/my_pkg1/src 디렉토리로 이동
$ cd ~/xycar_ws/src/my_pkg1/src

- pub.py 파일 생성
$ gedit pub.py

- 생성한 pub.py 파일에 아래의 내용 작성 -> 저장 -> 나가기
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()

3. 프로그램 실행
- 파일 실행 권한 확인
$ ls -l

- 실행 권한 부여 후 확인
- x가 있고 파일 이름이 녹색(실행권한이 있음)임을 확인 가능
$ chmod +x pub.py
$ ls -l

- 프로그램 실행
$ roscore

- 터미널2 열고 turtle node 실행
$ rosrun turtlesim turtlesim_node

- 터미널 3 열고 내가 만든 my_pkg1 패키지의 pub.py 파일 실행
- 거북이가 빙글빙글 계속 돈다
- 만약 멈추고 싶다면 ctrl+c 누르면 된다
$ rosrun my_pkg1 pub.py

4. 프로그램 확인
- 터미널 하나 더 열어서 node 확인
- 노드 이름을 지정해주지 않으면 알아서 시리얼 번호가 부여된다.
$ rosnode list

- 시각화
$ rqt_graph

5. 코드 작성 (2) - sub.py
- turtle이 어떤 토픽에 어떤 메시지를 발행하고 있는지 확인
$ rostopic list
$ rostopic type /turtle1/pose
$ rosmsg show turtlesim/Pose

- pub.py가 실행되고 있을 때 pose 토픽에 담긴 메세지 확인
$ rostopic echo /turtle1/pose

- src 폴더로 이동
$ cd xycar_ws/src/my_pkg1/src/

- sub.py 파일 생성
$ gedit sub.py

- sub.py 파일에 아래의 내용 작성 -> 저장 -> 나가기
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()
- 실행권한 부여
$ chmod +x sub.py
또는
$ chmod +x *.py 이건 모든 .py 파일에 권한 부여

- sub.py 실행
$ rosrun my_pkg1 sub.py

- 그래프 확인
$ rqt_graph
