모터제어기 ROS 프로그래밍

  • /xycar_motor 토픽을 발행하면 모터가 움직임
  • 0.7초 동안 토픽 발행이 없으면 속도는 0, 조향각은 0으로 세팅됨
    • 타입 : xycar_msgs/xycar_motor
    • 구성
      • std_msgs/Header Header
        • uint32 seq #시퀀스 번호
        • time stamp # 시간
        • string frame_id # 아이디 정보
      • int32 angle # 조향각도(좌/우 회전)
      • int32 speed # 주행속도(전/후 진)
  • 조향각

    • Angle : left MAX(-50) <- 초기 중앙(0) -> right MAX(50)
      • -50 : 좌회전 최대 꺾음
      • -10 : 좌회전 조금 꺾음
      • 0 : 직진
      • +30 : 우회전 많이 꺾음
      • +50 : 우회전 최대 꺾음
  • 속도

    • Speed : 후진 MAX(-50) ~ 정지(0) ~ 전진 MAX(50)

      • -50 : 후진 최고 속도

      • 0 : 정지

      • +20 : 전진

      • +50 : 최고 속도

자이카 8자 주행시키기

  • 다음과 같이 자이카를 8자 모양으로 주행시켜보자
  • 차량 속도는 고정, 핸들만 조종

image

패키지 생성

  • $ catkin_create_pkg my_motor std_msgs rospy 를 입력해 my_motor 패키지 만들기
  • /launch 디렉터리 만들기
  • launch 디렉터리 안에 8_drive.launch 만들기
<launch>
    <!--motor node-->
    <include file="$(find xycar_motor)/launch/xycar_motor.launch"/>
    
    <!--8 driver -->
    <node name ="auto_driver" pkg="my_motor" type = "8_drive.py" output="screen"/>
</launch>
  • src 폴더에 8_drive.py 만들기
#!/usr/bin/env python

import rospy
import time
from xycar_msgs.msg import xycar_motor # 모터 제어를 위한 토픽 메시지 타입 임포트

motor_control = xycar_motor()

rospy.init_node('auto_driver') # 'auto_driver'이름으로 노드 초기화

pub = rospy.Publisher('xycar_motor', xycar_motor, queue_size=1) # xycar_motor 토픽의 발행 준비

def motor_pub(angle,speed):
	global pub
	global motor_control
	
	motor_control.angle = angle
	motor_control.speed = speed
	
	pub.publish(motor_control)
	
speed = 3

while not rospy.is_shutdown() :
	angle = -50 # 좌회전
	for i in range(40) :
		motor_pub(angle, speed)
		time.sleep(0.1)
		
	angle = 0 # 직진
	for i in range(30) : 
		motor_pub(angle, speed)
		time.sleep(0.1)
		
	angle = 50 # 우회전
	for i in range(40) : 
		motor_pub(angle, speed)
		time.sleep(0.1)
		
	angle = 0 # 직진
	for i in range(30) : 
		motor_pub(angle, speed)
		time.sleep(0.1)
  • $ roslaunch my_motor 8_drive.launch