ros melodic chefbot motor test
Enquadrado na tentativa de adaptar as instruções do ros robot chefbot para o ros melodic e kinetic.
arduino script
chefbot_motor_test
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include <WProgram.h>
#endif
#include <Servo.h>
#include <ros.h>
#include <std_msgs/UInt16.h>
/////////////////////////////////////////////////////////////////
//Motor Pin definition
//Left Motor pins
#define A_1 50
#define B_1 51
//PWM 1 pin number
#define PWM_1 6
//Right Motor
#define A_2 53
#define B_2 52
//PWM 2 pin number
#define PWM_2 7
///////////////////////////////////////////////////////////////////////////////////////
//Motor speed from PC
//Motor left and right speed
float motor_left_speed = 0;
float motor_right_speed = 0;
ros::NodeHandle nh;
void motorLpwm_cb( const std_msgs::UInt16& cmd_msg){
motor_left_speed = cmd_msg.data;
}
ros::Subscriber<std_msgs::UInt16> sub1("cmd_vel_l", motorLpwm_cb);
void motorRpwm_cb( const std_msgs::UInt16& cmd_msg){
motor_right_speed = cmd_msg.data;
}
ros::Subscriber<std_msgs::UInt16> sub2("cmd_vel_r", motorRpwm_cb);
void setup(){
pinMode(13, OUTPUT);
SetupMotors();
nh.initNode();
nh.subscribe(sub1);
nh.subscribe(sub2);
}
void loop() {
nh.spinOnce();
Update_Motors();
delay(10);
//digitalWrite(13, HIGH-digitalRead(13)); //toggle led
}
void SetupMotors() {
//Left motor
pinMode(A_1,OUTPUT);
pinMode(B_1,OUTPUT);
//Right Motor
pinMode(A_2,OUTPUT);
pinMode(B_2,OUTPUT);
}
void Update_Motors() {
moveRightMotor(motor_right_speed);
moveLeftMotor(motor_left_speed);
}
void moveRightMotor(float rightServoValue) {
if (rightServoValue>0) {
digitalWrite(A_2,HIGH);
digitalWrite(B_2,LOW);
analogWrite(PWM_2,rightServoValue);
} else if(rightServoValue<0) {
digitalWrite(A_2,LOW);
digitalWrite(B_2,HIGH);
analogWrite(PWM_2,abs(rightServoValue));
} else if(rightServoValue == 0) {
digitalWrite(A_2,HIGH);
digitalWrite(B_2,HIGH);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void moveLeftMotor(float leftServoValue) {
if (leftServoValue > 0) {
digitalWrite(A_1,LOW);
digitalWrite(B_1,HIGH);
analogWrite(PWM_1,leftServoValue);
} else if(leftServoValue < 0) {
digitalWrite(A_1,HIGH);
digitalWrite(B_1,LOW);
analogWrite(PWM_1,abs(leftServoValue));
} else if(leftServoValue == 0) {
digitalWrite(A_1,HIGH);
digitalWrite(B_1,HIGH);
}
}
terminal 1
roscore
terminal 2
rosrun rosserial_python serial_node.py /dev/ttyUSB0
terminal 3
Run
rostopic pub –once cmd_vel_l std_msgs/UInt16 120
rostopic pub –once cmd_vel_r std_msgs/UInt16 120
Stop
rostopic pub –once cmd_vel_l std_msgs/UInt16 0
rostopic pub –once cmd_vel_r std_msgs/UInt16 0