Saturday, 16 August 2014

LINE FOLLOWER CODE WITH ROS
        Hi guys, If you want to have some hands on experience in ROS(Robotic Operating System) then you may came to right place. In this blog we will get experienced with ROS by testing it on a line follower. 

        While doing this project so many people asked me "does we really required ROS to make a line follower?". If you have this type of question then you may in off track because here our aim is to learn ROS rather than building a line follower. If you just want to build line follower there were other websites which will help you to do.

        Before going to make a line follower we need to integrate ROS with Arduino. This is explained properly over here (ROS serial Arduino). After integrating you can start coding in Arduino for line follower.

The complete code for making a line follower bot using ROS and Arduino is given here. A 5 array IR sensor and IC L293d were used to make the line follower. Now let's break down the code

#include <ros.h>                      
#include <std_msgs/Int32.h>


ros::NodeHandle n;                  //initialising the node

std_msgs::Int32 lnfr;
ros::Publisher pub("bot", &lnfr);    //writing the publisher

#define rep 11        //right enable pin
#define lep 10        //left enable pin
#define lm1 7        //left motor 1
#define lm2 8        //left motor 2
#define rm1 5        //right motor 1
#define rm2 6        //right motor 2
#define sl2 2           //external left sensor
#define sl1 3           //internal left sensor
#define sm  12        //middle sensor
#define sr1 9           //internal right sensor
#define sr2 4           //external right sensor

void callback (const std_msgs::Int32 &lnfr){
 if (lnfr.data == 2){
    analogWrite(lep,70);
    analogWrite(rep,70);
    digitalWrite(rm1,HIGH);
    digitalWrite(lm1,HIGH);
    digitalWrite(lm2,LOW);
    digitalWrite(rm2,LOW);
  }
 if (lnfr.data == 3){
    analogWrite(rep,80);
    analogWrite(lep,60);
    digitalWrite(rm1,HIGH);
    digitalWrite(lm1,HIGH);
    digitalWrite(lm2,LOW);
    digitalWrite(rm2,LOW);
  }
 if (lnfr.data == 4){
    analogWrite(rep,60);
    analogWrite(lep,80);
    digitalWrite(rm1,HIGH);
    digitalWrite(lm1,HIGH);
    digitalWrite(lm2,LOW);
    digitalWrite(rm2,LOW);
  }
 if (lnfr.data == 5){
    analogWrite(lep,200);
    analogWrite(rep,200);
    digitalWrite(rm1,LOW);
    digitalWrite(lm1,HIGH);
    digitalWrite(lm2,LOW);
    digitalWrite(rm2,HIGH);
  }
 if (lnfr.data == 6){
    analogWrite(lep,200);
    analogWrite(rep,200);
    digitalWrite(rm1,HIGH);
    digitalWrite(lm1,LOW);
    digitalWrite(lm2,HIGH);
    digitalWrite(rm2,LOW);
  }
 if (lnfr.data == 7){
    analogWrite(lep,250);
    analogWrite(rep,250);
    digitalWrite(rm1,LOW);
    digitalWrite(lm1,HIGH);
    digitalWrite(lm2,LOW);
    digitalWrite(rm2,HIGH);
  }
  
}
/*writing subscriber node*/
ros::Subscriber <std_msgs::Int32> sub("bot", &callback);

void setup(){
  pinMode (lep, OUTPUT);
  pinMode (rep, OUTPUT);
  pinMode (lm1, OUTPUT);
  pinMode (lm2, OUTPUT);
  pinMode (rm1, OUTPUT);
  pinMode (rm2, OUTPUT);
  pinMode (sl2, INPUT);
  pinMode (sl1, INPUT);
  pinMode (sm, INPUT);
  pinMode (sr1, INPUT);
  pinMode (sr2, INPUT);

/*initialising node and publishing message*/ 
  n.initNode();       
  n.advertise(pub);
}

void loop(){
  if(digitalRead(sm)==LOW && digitalRead(sr1)==HIGH && digitalRead(sl1)==HIGH && digitalRead(sr2)==HIGH && digitalRead(sl2)==HIGH )
  {
    lnfr.data = 2;
  }
  else if(digitalRead(sl1)==LOW && digitalRead(sr1)==HIGH && digitalRead(sl2)==HIGH && digitalRead(sr2)==HIGH )
  {
    lnfr.data = 3;
  }
  else if( digitalRead(sl1)==HIGH && digitalRead(sr1)==LOW && digitalRead(sr2)==HIGH && digitalRead(sl2)==HIGH )
  {
    lnfr.data = 4;
  }
  +
  else if(digitalRead(sr2)==LOW && digitalRead(sl2)==HIGH )
  {
    lnfr.data = 5;
  }
  else if(digitalRead(sr2) == HIGH && digitalRead(sl2)==LOW)
  {
    lnfr.data = 6;
  }
  else if( digitalRead(sr1)==LOW && digitalRead(sr2)==LOW && digitalRead(sl1)==LOW && digitalRead(sl2)==LOW)
  {
    lnfr.data = 7;
  }
  
  pub.publish(&lnfr);
  n.spinOnce();
 
  delay(10);
}

No comments:

Post a Comment

All comments are welcome.