turtlesim (2)

정승균·2020년 12월 21일
0

ROS

목록 보기
3/14
post-thumbnail

Ⅰ. Work Space 생성


1. 디렉토리 생성

  • $ mkdir -p ~/xycar_ws/src
    => xycar_ws라는 workspace 생성

2. catkin_make 으로 정리

  • cd ~/xycar_ws && catkin_make

3. ~/.bashrc에 다음과 같이 추가

# ROS configs
source /opt/ros/kinetic/setup.bash
source ~/xycar_ws/devel/setup.bash
export ROS_MASTER_URI=http://localhost:11311
export ROS_HOSTNAME=localhost
alias h='history'
alias cw='cd ~/xycar_ws'
alias cs='cd ~/xycar_ws/src'
alias cm='cd ~/xycar_ws && catkin_make'

Ⅱ. Package 생성



1. Workspace의 src 디렉토리로 이동

  • $ cd ~/xycar_ws/src # alias로 잡아논 $ cs 로도 가능

2. catkin_create_pkg 로 패키지 생성

  • $ catkin_create_pkg pkg_name dependency1 dependency2 ...
jsg@jsg-ubuntu:~/xycar_ws/src$ catkin_create_pkg my_pkg1 std_msgs rospy
Created file my_pkg1/package.xml
Created file my_pkg1/CMakeLists.txt
Created folder my_pkg1/src
Successfully created files in /home/jsg/xycar_ws/src/my_pkg1. Please adjust the values in package.xml.

3. catkin_make 으로 정리

  • cd ~/xycar_ws && catkin_make # alias로 잡아논 $ cm 도 가능

4. 최종적인 모습


Ⅲ. Package 관련 명령어


  • $ rospack list : 모든 패키지 리스트와 경로 출력

  • $ rospack find package_name : 패키지 경로 찾기

jsg@jsg-ubuntu:~/xycar_ws$ rospack find my_pkg1
/home/jsg/xycar_ws/src/my_pkg1
  • $ rospack depends1 package_name : 의존 패키지 검색
jsg@jsg-ubuntu:~/xycar_ws$ rospack depends1 my_pkg1
rospy
std_msgs
  • $ roscd package_name[/sub_dir] : 패키지 경로로 이동
jsg@jsg-ubuntu:~/xycar_ws$ roscd my_pkg1
jsg@jsg-ubuntu:~/xycar_ws/src/my_pkg1$ 
  • $ rosls package_name[/sub_dir] : 패키지 경로의 파일 목록
jsg@jsg-ubuntu:~/xycar_ws$ roscd my_pkg1
jsg@jsg-ubuntu:~/xycar_ws/src/my_pkg1$ 
  • $ rosed package_name file : $EDITOR에 설정한 에디터로 package의 file 편집
jsg@jsg-ubuntu:~/xycar_ws$ rosed my_pkg1 package.xml 

Ⅳ. Python script로 Publisher 생성


  • ~/xycar_ws/src/my_pkg1/src 에 다음과 같이 pub.py 작성
#! /usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
from geometry_msgs.msg import Twist

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

# msg 생성
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)

# 1Hz 주기로 메시지 발행
while not rospy.is_shutdown():
    pub.publish(msg)
    rate.sleep()
  • $ chmod +x pub.py 로 pub.py 에 실행 권한 부여
jsg@jsg-ubuntu:~/xycar_ws/src/my_pkg1/src$ chmod +x pub.py
jsg@jsg-ubuntu:~/xycar_ws/src/my_pkg1/src$ ls -l pub.py
-rwxrwxr-x 1 jsg jsg 484 12월 21 23:51 pub.py
  • 4개의 터미널에서 각각 실행
    • $ roscore
    • $ rosrun turtlesim turtlesim_node
    • $ rosrun my_pkg1 pub.py
    • $ rqt_graph


Ⅴ. Python script로 Subscriber 생성


  • ~/xycar_ws/src/my_pkg1/src 에 다음과 같이 sub.py 작성
#! /usr/bin/env python
# -*- coding: utf-8 -*-

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)

# Node 생성
rospy.init_node("my_listener", anonymous=True)
# Subsciber 생성, 메세지를 수신하면 callback 함수 호출
rospy.Subscriber("/turtle1/pose", Pose, callback)
# 무한루프
rospy.spin()
  • $ chmod +x sub.py 로 sub.py 에 실행 권한 부여

  • 새 터미널에서 $ rosrun my_pkg1 sub.py 로 노드 추가

0개의 댓글