목차

ROS STUDY #9 : ROS SERIAL RC카

1. Arduino

1.1. 환경설정

혹시 아두이노 ROS_lib가 깔리지 않은 분들은, 8강 “5.ROS SERIAL 설치”를 참고하세요 https://kasimov.korea.ac.kr/dokuwiki/doku.php/activity/public/2021/ros/8

1.2. 아두이노 IDE 코딩

#include <ros.h>
#include <geometry_msgs/Twist.h>
ros::NodeHandle  nh;  //Node Handle 정의

#define MOTOR_A_a 3     
#define MOTOR_A_b 11   
#define MOTOR_B_a 5    
#define MOTOR_B_b 6     

unsigned char m_a_spd = 0, m_b_spd = 0;  //변수 초기화

void velocityCB(const geometry_msgs::Twist& velocity) {

 //velocity m/s 
  m_a_spd = velocity.linear.x;  //m_a_spd라는 변수에 rosserial로 받은 토픽 값 저장
  m_b_spd = velocity.linear.y;  //m_b_spd라는 변수에 rosserial로 받은 토픽 값 저장
}

ros::Subscriber<geometry_msgs::Twist> sub1("cmd_vel", velocityCB);  //subscriber 정의

void setup() {

  pinMode(MOTOR_A_a, OUTPUT);
  pinMode(MOTOR_A_b, OUTPUT);
  pinMode(MOTOR_B_a, OUTPUT);
  pinMode(MOTOR_B_b, OUTPUT);

  //init rosserial node
  nh.initNode();       
  //init subscribe node
  nh.subscribe(sub1);  
}

void loop() {

  digitalWrite(MOTOR_A_a, LOW);    //모터 동작시키는 함수(정방향)
  analogWrite(MOTOR_A_b, m_a_spd); //모터 동작시키는 함수(m_a_spd의 속도로 회전)
  digitalWrite(MOTOR_B_a, LOW);    //모터 동작시키는 함수(정방향)
  analogWrite(MOTOR_B_b, m_b_spd); //모터 동작시키는 함수(m_b_spd의 속도로 회전)
  
  nh.spinOnce();
}

2. 실행시키기

2.1. ROSCORE 실행

roscore

2.2. ROS SERIAL 실행

rosrun rosserial_python serial_node.py __name:=arduino _port:=/dev/ttyACM0 _baud:=57600
//                                       보드이름        포트 번호             통신속도

2.3. 토픽 퍼블리시

rostopic pub cmd_vel  geometry_msgs/Twist "{linear: [100, 100, 0]}" --once
** 원래 cmd_vel linear 첫번째와 두번째 자리는 x, y축 직선속도(m/s)를 나타내는 자리이고, 회전을 주기 위해서는 별도로 cmd_vel.angular.z를 사용해야 하지만, 편의상 linear.x, linear.y에 왼쪽, 오른쪽 모터의 pwm 값을 넣어서 코딩 했습니다.