ROS 프로그래밍 기초

전종원·2022년 11월 4일
0

1. ROS Package 기초

1.1. 패키지란?

  • ROS에서 개발되는 소프트웨어를 논리적 묶음으로 만든 것.

1.2. 패키지 관련 명령어들

rospack list #패키지 리스트 나열
rospack find [package_name] #패키지 검색
roscd [package_path] # 패키지 디렉토리로 이동
rosls # ls와 같은 기능
catkin_create_pkg [package_name] # 패키지 생성
rospack depends1 [package_name] #해당 패키지가 의존하고 있는 다른 패키지들 나열

2. ROS 패키지 만들기

2.1. 패키지 생성

  • ros_workspace/src에서 catkin_create_pkg [package_name] 명령어로 패키지 생성
  • cm 명령어로 새로만든 패키지 빌드

3. ROS 프로그램의 실행과 검증 확인

3.1. pub.py 작성

  • 생성한 패키지 밑에 src 폴더를 생성 후 src/에 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()                            
  • chmod +x pub.py로 실행 권한 부여

3.2. 프로그램 실행과 확인

  • 1번 터미널: roscore 실행
  • 2번 터미널: rosrun turtlesim turtlesim_node 실행
  • 3번 터미널: rosrun sample_pkg src/pub.py 실행
  • 4번 터미널: rqt_graph 실행

turtle이 발행하는 토픽 확인

rostopic list # 발행되는 토픽 리스트 나열
rostopic type /turtle1/pose # /turtle1/pose 토픽의 타입 나열
rosmsg show turtlesim/Pose # turtlesim/Pose 타입의 구성요소 나열
rostopic echo /turtle1/pose # 노드 실행 시 /turtle1/pose 메세지 값 확인

3.3. sub.py 작성

  • ~/ros_ws/src/sample_pkg/src/ 에 작성
#!/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()

3.4. 결과영상


4. Launch 파일 기초

4.1. .launch 파일이란?

  • 여러 노드들을 한꺼번에 실행시킬 수 있도록 XML 형식으로 기록한 파일
  • 파라미터 값을 노드에 전달 가능
  • <node pkg='패키지명' type='노드가 포함된 소스파일명' name='노드이름'/> 형식으로 실행할 노드 추가

4.2. 런치파일 실행법

  • 패키지 경로에 /launch 디렉토리 생성
  • /launch 에 런치파일 생성
  • 런치파일 작성
  • 'chmod +x ___.launch' 로 실행권한 부여.
  • cm 명령어로 빌드
  • roslaunch [package_name] [launchfile_name] 명령어로 실행

4.3. pub_sub.launch 작성

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"/>
    <node pkg="sample_pkg" type="pub.py" name="pub_node"/>
    <node pkg="sample_pkg" type="sub.py" name="sub_node" output="screen"/>
</launch>
  • 실행
roslaunch sample_pkg pub_sub.launch
  • 실행영상

5. Launch 파일의 tag 활용

5.1. include 태그

  • 다른 launch 파일을 불러오고 싶을 때 사용하는 태그
    <include file="같이 실행할 *.launch 파일 경로"/>

5.2. param 태그

<param name="변수이름" type="변수타입" value="변수값"/>
  • name: 등록할 변수의 이름
  • type: 등록할 변수의 타입 ex) str, int, double, bool, yaml
  • value: 등록할 변수의 값
  • 등록한 변수들은 노드 코드에서 불러와 사용가능
    get_param(param_name)
  • USB_cam 패키지에서 파라미터 전달예시

5.3. pub_sub_param.launch

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node"/>
    <node pkg="sample_pkg" type="pub_param.py" name="node_param">
        <param name="circle_size" value="2"/>
    </node>
    <node pkg="sample_pkg" type="sub.py" name="sub_node" output="screen"/>
</launch>

5.4. 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()
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()

5.5. 실행영상

0개의 댓글