======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
#include
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 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 값을 넣어서 코딩 했습니다.