차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
activity:public:2021:ros:9 [2021/11/18 20:04:14] – [1.2. 아두이노 IDE 코딩] 99dohyungactivity:public:2021:ros:9 [2021/11/18 20:06:04] (현재) – [1.2. 아두이노 IDE 코딩] 99dohyung
줄 1: 줄 1:
 +======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 코딩====
 +<sxh c>
 +#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();
 +}
 +</sxh>
 +
 +=====2. 실행시키기 =====
 +====2.1. ROSCORE 실행====
 +<sxh bash>
 +roscore
 +</sxh>
 +====2.2. ROS SERIAL 실행====
 +<sxh bash>
 +rosrun rosserial_python serial_node.py __name:=arduino _port:=/dev/ttyACM0 _baud:=57600
 +//                                       보드이름        포트 번호             통신속도
 +</sxh>
 +====2.3. 토픽 퍼블리시====
 +<sxh bash>
 +rostopic pub cmd_vel  geometry_msgs/Twist "{linear: [100, 100, 0]}" --once
 +</sxh>
 +** 원래 cmd_vel linear 첫번째와 두번째 자리는 x, y축 직선속도(m/s)를 나타내는 자리이고, 회전을 주기 위해서는 별도로 cmd_vel.angular.z를 사용해야 하지만, 편의상 linear.x, linear.y에 왼쪽, 오른쪽 모터의 pwm 값을 넣어서 코딩 했습니다.