ROS與Arduino學習(九)ros_arduino_brige固件html
Tutorial Level:電機控制(基於ros_arduino_brige)node
Next Tutorial:python
一、下載
進入你的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
一、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舵機的實現文件
聲明瞭舵機的結構體
一、啓用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
將程序下載到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