基于ROS的自主导航小车制作

本文介绍一种基于ros_arduino_bridge功能包以及SLAM的自主导航小车的制作过程

1、材料清单

1、arduino nano
2、10cm长母对母杜邦线若干
3、TB6612FNG电机驱动模块
4、2.54单排针1*40
5、1x15P单排母座若干
6、1x8P单排母座若干
7、7x9cm单面万能版
8、JGA37直流减速电机,减速比1/43 (2)
9、JGB37电机固定座 L型支架(2)
10、六角联轴器 配套小车轮子使用6cm(2)
11、机器人轮胎 68mm轮胎(2)
12、2寸万向轮
13、12V锂电池 12V 4000mAh
14、思岚激光雷达 RPLIDAR A1
15、树莓派4代RaspberryPi4B
16、电烙铁,焊锡丝

2、 控制板制作

基于ROS的自主导航小车制作_第1张图片
如图所示是控制板的布局草图,最左边是arduino nano,arduino nano通过单排母座插在控制板上,紧挨着arduino nano的是一列VCC和一列GND。再右边是TB6612电机驱动板,最右边是左右电机的接线排针。12V电源接线排针位于控制板的最上方。
通过虚拟机安装ubuntu18.04,并在ubuntu系统上安装ros melodic版本,ubuntu系统以及ros的安装请自行百度。建立一个ros工作空间,然后通过网址将ros_arduino_bridge功能包下载在工作空间的src目录下。进入ros_arduino_bridge功能包的ros_arduino_firmware/src/libraries/RSOArduinoBridge/目录下,利用arduino IDE打开RISArduinoBridge.ino。修改以下代码

#define USE_BASE      // Enable the base controller code
//#undef USE_BASE     // Disable the base controller code

/* Define the motor controller and encoder library you are using */
#ifdef USE_BASE
   /* The Pololu VNH5019 dual motor driver shield */
   //#define POLOLU_VNH5019

   /* The Pololu MC33926 dual motor driver shield */
   //#define POLOLU_MC33926

   /* The RoboGaia encoder shield */
   //#define ROBOGAIA
   
   /* Encoders directly attached to Arduino board */
   #define ARDUINO_ENC_COUNTER

   /* L298 Motor driver*/
   #define L298_MOTOR_DRIVER
#endif

//#define USE_SERVOS  // Enable use of PWM servos as defined in servos.h
#undef USE_SERVOS     // Disable use of PWM servos

因为ros_arduino_bridge的代码是适用于L298电机驱动板的,我们使用的是TB6612电机驱动板,所以需要将电机驱动程序修改成适用于TB6612的程序。首先打开motor_driver.h,修改代码

#ifdef L298_MOTOR_DRIVER
  #define RIGHT_MOTOR_BACKWARD 11
  #define LEFT_MOTOR_BACKWARD  9
  #define RIGHT_MOTOR_FORWARD  12
  #define LEFT_MOTOR_FORWARD   8
  #define RIGHT_MOTOR_PWM 6
  #define LEFT_MOTOR_PWM 5
  #define STBY 10
#endif

打开motor_driver.ino,修改代码

#elif defined L298_MOTOR_DRIVER
  void initMotorController() {
    digitalWrite(STBY, HIGH);
  }
void setMotorSpeed(int i, int spd) {
    unsigned char reverse = 0;
  
    if (spd < 0)
    {
      spd = -spd;
      reverse = 1;
    }
    if (spd > 255)
      spd = 255;
    
    if (i == RIGHT) { 
      if      (reverse == 0) { digitalWrite(RIGHT_MOTOR_FORWARD, HIGH); digitalWrite(RIGHT_MOTOR_BACKWARD, LOW); analogWrite(RIGHT_MOTOR_PWM, spd); }
      else if (reverse == 1) { digitalWrite(RIGHT_MOTOR_BACKWARD, HIGH); digitalWrite(RIGHT_MOTOR_FORWARD, LOW); analogWrite(RIGHT_MOTOR_PWM, spd); }
    }
    else /*if (i == RIGHT) //no need for condition*/ {
      if      (reverse == 0) { digitalWrite(LEFT_MOTOR_FORWARD, HIGH); digitalWrite(LEFT_MOTOR_BACKWARD, LOW); analogWrite(LEFT_MOTOR_PWM, spd); }
      else if (reverse == 1) { digitalWrite(LEFT_MOTOR_BACKWARD, HIGH); digitalWrite(LEFT_MOTOR_FORWARD, LOW); analogWrite(LEFT_MOTOR_PWM, spd); }
    }
  }

查看已经修改好的motor_driver.h,以及encoder_driver.h,按照程序定义的引脚进行连线

基于ROS的自主导航小车制作_第2张图片
基于ROS的自主导航小车制作_第3张图片
连好线后,最好用万用表测一下电路是否存在短路,短路的情况,如果电路没问题,可将程序烧录到arduino nano中

最终结果

纸糊的自主导航小车

你可能感兴趣的:(slam)