CityU Dream Development

Dependencies:   mbed ros_lib_melodic

main.cpp

Committer:
bensonsinsin998
Date:
2021-02-25
Revision:
0:c2b6f8b48076

File content as of revision 0:c2b6f8b48076:

/*
    CityU Robocon Dream Development - 2021 TR Carbase
*/

// Mbed Library
#include "mbed.h"
#include "math.h"
// ROS Library
#include <ros.h>
#include "geometry_msgs/Twist.h"
#include "std_msgs/Bool.h"
#include "std_msgs/Float32.h"
#include "std_msgs/Float64MultiArray.h"
#include "std_msgs/Int32.h"
#include "std_msgs/MultiArrayLayout.h"
#include "std_msgs/MultiArrayDimension.h"
// Header File
#include "MotorDrive.h"
#include "OmniWheel.h"

// ROS Connect Baud Rate 
#define BAUD_RATE 115200

using namespace std;
using namespace ros;
using namespace std_msgs;
using namespace geometry_msgs;

// Mbed Pin
DigitalOut led = LED1;
// -> 3.3V Reference Pin
DigitalOut reference_voltage_3_3 = PB_1;
// -> Motor Pin
DigitalOut motor_enable = PC_7;
DigitalOut motor_stop[] = {PB_6, PC_5, PC_0};
// -> Motor PWN Pin
PwmOut motor_pwm[] = {PA_9, PC_8, PA_11};

// Constant Variable
// -> Motor
const int motor_num = sizeof(motor_pwm) / sizeof(PwmOut);
// -> Motor -> PWM Wait Period
const int pwm_period_ms = 20;
// -> Motor -> Stop PWM
const double stop_pwm = 0.5;

// ROS Variable
// -> Node Handler
NodeHandle nh;
// -> ROS Msessage
Float64MultiArray motor_pwm_msg;
Twist motor_command_msg;

MotorDrive motor_drive;

// Function
// -> Motor
// -> Motor -> Intialize
void motorInit() {
    // Initialize motor
    motor_enable = 0;
    for(int i = 0; i < motor_num; i++) {
        motor_pwm[i].period_ms(pwm_period_ms);
        motor_pwm[i] = stop_pwm;
    }
    
    // Set Reference Voltage
    reference_voltage_3_3 = 1;
    wait(1);    // Wait 1s For Voltage
    
    // Enable Motor
    motor_enable = 1;
}

// -> Motor -> Send PWM
void motorMoveCallback(int _motor_index, double _pwm) {
    motor_stop[_motor_index] = 0;
    motor_pwm[_motor_index] = _pwm;
}

void motorStopCallback(int _motor_index) {
    motor_stop[_motor_index] = 1;
    motor_pwm[_motor_index] = 0.5;
}

// -> ROS Subscurber 
void velCallback(const Twist& _msg) {
    OmniWheel omni_wheel_data = motor_drive.getOmniWheelData(_msg.linear.x, _msg.linear.y, _msg.angular.z);
    
    vector<double> omni_wheel_pwm = omni_wheel_data.getPwm();   // Get PWM data
    
    for(int i = 0; i < motor_num; i++)      // Send PWM to each motor
        if(omni_wheel_pwm[i] != stop_pwm)
            motorMoveCallback(i, omni_wheel_pwm[i]);
        else
            motorStopCallback(i);
}
Subscriber<Twist> sub_motor_pwm("base_twist", &velCallback);

// Main
int main() {
    // ROS Setup
    // -> Set Baud Rate
    nh.getHardware()->setBaud(BAUD_RATE);
    // -> Initialize ROS Node
    nh.initNode();
    nh.subscribe(sub_motor_pwm);    // Subscribe the callback function
    
    // Initialize motor
    motorInit();
    
    // Main programming
    while(true) {
        nh.spinOnce();

        if(nh.connected())
            led = 1;    // Turn on the LED if the ROS successfully connect with the Jetson
        else 
            led = 0;    // Turn off the LED if the ROS cannot connect with the Jetson
    }
}