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