ROS與Arduino學習(九)ros_arduino_brige固件

ROS與Arduino學習(九)ros_arduino_brige固件html

 

Tutorial Level:電機控制(基於ros_arduino_brige)node

Next Tutorial:python

 

Tips 1 ros_arduino_bridge的安裝

一、下載
進入你的workspace目錄下的src目錄,catkin_ws是workspacegit

cd ~/catkin_ws/src
git clone https://github.com/hbrobotics/ros_arduino_bridge.git

 二、編譯,在workspace目錄編譯github

cd <catkin_ws>
catkin_make

三、架構windows

├── README.md
├── ros_arduino_bridge                      # metapackage (元包)
│   ├── CMakeLists.txt
│   └── package.xml
├── ros_arduino_firmware                    #固件包,更新到Arduino
│   ├── CMakeLists.txt
│   ├── package.xml
│   └── src
│       └── libraries                       #庫目錄
│           ├── MegaRobogaiaPololu          #針對Pololu電機控制器,MegaRobogaia編碼器的頭文件定義
│           │   ├── commands.h              #定義命令頭文件
│           │   ├── diff_controller.h       #差分輪PID控制頭文件
│           │   ├── MegaRobogaiaPololu.ino  #PID實現文件
│           │   ├── sensors.h               #傳感器相關實現,超聲波測距,Ping函數
│           │   └── servos.h                #伺服器頭文件
│           └── ROSArduinoBridge            #Arduino相關庫定義
│               ├── commands.h              #定義命令
│               ├── diff_controller.h       #差分輪PID控制頭文件
│               ├── encoder_driver.h        #編碼器驅動頭文件,定義插腳(pins)
│               ├── encoder_driver.ino      #編碼器驅動實現, 讀取編碼器數據,重置編碼器等
│               ├── motor_driver.h          #電機驅動頭文件
│               ├── motor_driver.ino        #電機驅動實現,初始化控制器,設置速度
│               ├── ROSArduinoBridge.ino    #核心功能實現,
│               ├── sensors.h               #傳感器頭文件及實現
│               ├── servos.h                #伺服器頭文件,定義插腳,類
│               └── servos.ino              #伺服器實現
├── ros_arduino_msgs                        #消息定義包
│   ├── CMakeLists.txt
│   ├── msg                                 #定義消息
│   │   ├── AnalogFloat.msg                 #定義模擬IO浮點消息
│   │   ├── Analog.msg                      #定義模擬IO數字消息
│   │   ├── ArduinoConstants.msg            #定義常量消息
│   │   ├── Digital.msg                     #定義數字IO消息
│   │   └── SensorState.msg                 #定義傳感器狀態消息
│   ├── package.xml
│   └── srv                                 #定義服務
│       ├── AnalogRead.srv                  #模擬IO輸入
│       ├── AnalogWrite.srv                 #模擬IO輸出
│       ├── DigitalRead.srv                 #數字IO輸入
│       ├── DigitalSetDirection.srv     #數字IO設置方向
│       ├── DigitalWrite.srv                #數字IO輸入
│       ├── ServoRead.srv                   #伺服電機輸入
│       └── ServoWrite.srv                  #伺服電機輸出
└── ros_arduino_python                      #ROS相關的Python包,用於上位機,樹莓派等開發板或電腦等。
    ├── CMakeLists.txt
    ├── config                              #配置目錄
    │   └── arduino_params.yaml             #定義相關參數,端口,rate,PID,sensors等默認參數。由arduino.launch調用
    ├── launch
    │   └── arduino.launch                  #啓動文件
    ├── nodes
    │   └── arduino_node.py                 #python文件,實際處理節點,由arduino.launch調用,便可單獨調用。
    ├── package.xml
    ├── setup.py
    └── src                                 #Python類包目錄
        └── ros_arduino_python
            ├── arduino_driver.py           #Arduino驅動類
            ├── arduino_sensors.py          #Arduino傳感器類
            ├── base_controller.py          #基本控制類,訂閱cmd_vel話題,發佈odom話題
            └── __init__.py                 #類包默認空文件  

 

 

4、拷貝Arduino庫文件中到相應的Arduino IDE的libraries目錄ruby

$ cd SKETCHBOOK_PATH//Arduino IDE的庫文件目錄
$ \cp -rp ~/catkin_ws/src/ros_arduino_bridge/ros_arduino_firmware/src/libraries/ROSArduinoBridge -T ROSArduinoBridge

     這時候能夠把ROSArduinoBridge拷貝到其餘windows, Mac電腦的Arduino IDE環境下使用,重啓後既能夠用bash

 

Tips 2 ros_arduino_bridge架構介紹

一、common.h  此文件存放了用於串口通訊的指令。架構

二、diff_controller.h PID控制代碼dom

(1)結構體SetPointInfo

存儲一些PID設定值信息,包括

Encoder編碼器測量值、

PrevEnc上一次編碼器測量值、

PrevInput上一次輸入、

output表明輸出

typedef struct {
  double TargetTicksPerFrame;    // target speed in ticks per frame
  long Encoder;                  // encoder count
  long PrevEnc;                  // last encoder count

  int PrevInput;                // last input
  //int PrevErr;                   // last error

  
  //int Ierror;
  int ITerm;                    //integrated term

  long output;                    // last motor setting
}
SetPointInfo;

 

(2)PID參數能夠在此修改

/* PID Parameters */
int Kp = 20;
int Kd = 12;
int Ki = 0;
int Ko = 50;

 (3)resetPID()函數

用來複位PID結構體。

(4)doPID(SetPointInfo * p)函數

此函數爲PID執行函數。

(5)updatePID()

更新PID函數,包括編碼器採集、PID執行以及設定電機PWM。實際咱們調用這個函數便可。

 

三、encoder_driver.h 編碼器代碼

    這裏只是針對了Arduino UNO,使用了中斷接口D2,D3,和模擬接口A4,A5;因此電機編碼器的輸出接線須要按照此規則接線,另外要注意編碼器要有兩路輸出
左側電機的編碼輸出接D2,D3;右側電機的編碼輸出接A4,A5

 

四、encoder_driver.ino 編碼器的實現代碼

 

 

五、motor_driver.h 馬達驅動的接口定義

此處採起L298驅動芯片,對兩個電機的接口進行了定義,包括電機使能端、正轉、反轉。聲明瞭三個函數初始化電機函數、設定單電機速度、雙輪速度。

#ifdef L298_MOTOR_DRIVER
  #define RIGHT_MOTOR_BACKWARD 5
  #define LEFT_MOTOR_BACKWARD  6
  #define RIGHT_MOTOR_FORWARD  9
  #define LEFT_MOTOR_FORWARD   10
  #define RIGHT_MOTOR_ENABLE 12
  #define LEFT_MOTOR_ENABLE 13
#endif

void initMotorController();
void setMotorSpeed(int i, int spd);
void setMotorSpeeds(int leftSpeed, int rightSpeed);

 
六、motor_driver.ino

馬達驅動實現代碼,根據預約義選擇不一樣的驅動板庫

七、sensors.h傳感器的實現文件
八、servos.h舵機的實現文件

聲明瞭舵機的結構體

 

 

Tips 3 主程序的修改

一、啓用Base Controller

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

 二、馬達控制板定義

選擇一種電機驅動方式。能夠採用L298驅動方式。

/* 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

 三、波特率以及佔空比最大值

/* Serial port baud rate */
#define BAUDRATE     57600

/* Maximum PWM signal */
#define MAX_PWM        255

 四、調控週期

此項能夠設置PID調控週期。

 /* Run the PID loop at 30 times per second */
  #define PID_RATE           30     // Hz

 

Tips 4 固件測試

    將程序下載到Arduino中,硬件固件就行了,接下來作進一步測試,咱們打開串口利用common.h中的指令進行測試。

例如發送b返回波特率。

注意:把串口監視器的波特率設置爲57600而後把行結束符設置爲「Carriage return(回車)」或「Both NL & CR」(NL和CR)。

主要指令:

a    模擬讀入        例如  a 3

b    獲取波特率

c    設置某引腳狀態

d    讀取某引腳狀態   例如  d 4

e

m    設定速度         例如  m 20 20

p   

r    復位

s    舵機寫值

t    舵機讀值

u    更新PID

w    數字寫0/1

x    模擬寫  

0

1

相關文章
相關標籤/搜索