Unable to properly set up Odometer [closed]
Hello, I am using ROS NOETIC on Ubuntu mate 20.04. I am using an arduino mega, rover 5 platform (link text ) that has 2 encoders and motors that i am using. I am trying to send the data collected by the encoders to ros via Rosserial_arduino. I was able to get the data collected but when ran on RVIZ to see how the distance traveled from its starting position, it is going in a circle. It should be going straight because both motors are moving in the same direction at the same speed. Is there something I'm missing? Should i use the nav_msg/Odometry instead? Also for anybody using slam toolbox, do i only need the odometry data to finally start using it properly?
#include <Encoder.h>
#include <ros.h>
#include <ros/time.h>
#include <tf/tf.h>
#include <tf/transform_broadcaster.h>
#include <math.h>
//DC Motor inputs
const int left_dir=12;
const int left_brake=9;
const int right_dir=13;
const int right_brake=8;
//Setting up Ros
ros::NodeHandle nh;
geometry_msgs::TransformStamped t;
tf::TransformBroadcaster broadcaster;
char base_link[] = "/base_link";
char odom[] = "/odom";
//Using Encoder library to specify which pins are being used
Encoder L_Enc(19, 18);
Encoder R_Enc(20,21);
// paramters of robot in mm
float Pi=3.14;
float dia=60; //diameter
float ER= 333; // Number of ticks per one full revolution
float b= 183;
float Dl, Dr, Dc, Ori_ch,Dl_old,Dr_old,x_cor,y_cor;
float Ori = 0; //orientation
float x = 0;
float y = 0;
float deltaL;
float deltaR;
float L_oldPosition = 0;
float R_oldPosition = 0;
//make both dc motors move forward then stop
void forward_move() {
digitalWrite(left_brake,LOW);
digitalWrite(right_brake,LOW);
digitalWrite(left_dir,HIGH);
digitalWrite(right_dir,LOW);
analogWrite(11,255);
analogWrite(3,255);
delay(1000);
digitalWrite(left_brake,HIGH);
digitalWrite(right_brake,HIGH);
delay(3000);
}
void setup() {
// put your setup code here, to run once:
nh.initNode();
broadcaster.init(nh);
pinMode(left_dir,OUTPUT);
pinMode(left_brake,OUTPUT);
pinMode(right_dir,OUTPUT);
pinMode(right_brake,OUTPUT);
}
void loop() {
//Left this function a comment when not using motors
//forward_move();
//changes in distance traveled by motor set to zero in beginning
deltaL=0;
deltaR=0;
//Reads the number of ticks odometer in each motor
float R_newPosition = L_Enc.read();
float L_newPosition = R_Enc.read();
//If there is a change in ticks for either odometer
if (L_newPosition != L_oldPosition) {
//Converts ticks into distance (Circumference * ticks/resolution) for previous distance
Dl_old= Pi * dia * (L_oldPosition/ ER);
L_oldPosition = L_newPosition;
//Converts ticks into distance (Circumference * ticks/resolution) for previous distance
Dl= Pi * dia * (L_newPosition/ ER);
//calculates change in distance
deltaL=Dl-Dl_old;
}
if (R_newPosition != R_oldPosition) {
Dr_old= Pi * dia * (R_oldPosition/ ER);
R_oldPosition = R_newPosition;
Dr= Pi * dia * (R_newPosition/ ER);
deltaR=Dr-Dr_old;
}
// calculates position
if ((deltaR!=0)||(deltaL!=0)){
//Where the center of the rover is
Dc=( Dl + Dr) /2 ;
// Using triangle rule, finds orientation
Ori_ch=(Dr - Dl)/b;
//if change in orientation, adds it to the previous orientation
Ori = Ori + Ori_ch;
// X and y position of rover in mm
x = x + Dc * cos(Ori);
y = y + Dc * sin(Ori);
//Since the distance travel is very small and ...
What was the answer? I don't see it.