運動底盤是移動機器人的重要組成部分,不像激光雷達、IMU、麥克風、音響、攝像頭這些通用部件能夠直接買到,很難買到通用的底盤。一方面是由於底盤的尺寸結構和參數是要與具體機器人匹配的;另外一方面是由於底盤包含軟硬件整套解決方案,是不少機器人公司的核心技術,通常不會隨便公開。出於強烈的求知慾與學習熱情,我想本身DIY一整套兩輪差分底盤,而且將完整的設計過程公開出去供你們學習。說幹就幹,本章節主要內容:html
1.stm32主控硬件設計python
2.stm32主控軟件設計nginx
3.底盤通訊協議算法
4.底盤ROS驅動開發django
6.底盤裏程計標ubuntu
對於作純SLAM算法、機器人導航避障、或者別的須要用到移動底盤的應用,根據底盤的通訊協議,直接使用底盤ROS驅動實現跟底盤的交互。miiboo機器人底盤的ROS驅動代碼組織如圖36。centos
(圖36)miiboo機器人底盤的ROS驅動代碼組織網絡
整個代碼組織是一個完整的ROS功能包,功能包名爲miiboo_bringup,功能包中包含兩個ROS節點源碼(base_controller.cpp和pid_set.cpp),不難看出這兩個節點正是對底盤通訊協議中的DATA-uart2與DEBUG-uart1的具體實現。base_controller.cpp負責對底盤控制驅動的具體實現,pid_set.cpp負責對底盤調試驅動的具體實現。本節重點對這兩個節點進行講解,至於功能包名下的其餘內容將放在後面的miiboo機器人SLAM導航實戰中具體展開。架構
接口:
底盤控制節點對下與底盤DATA-uart2串口通訊,對上開放ROS接口爲應用層提功能數據發佈與訂閱,便於SLAM導航等功能的開發。
(圖37)底盤控制節點接口
節點實現源碼解析:
底盤控制節點由base_controller.cpp實現。程序主要分爲兩個過程:訂閱topic數據並下發給底盤、從底盤接收數據併發布到topic。
首先,程序訂閱/cmd_vel做爲用戶的控制輸入,將控制輸入的速度信息轉換爲通訊協議中DATA-uart2規定的格式,而後經過串口下發給底盤,實現對底盤的運動控制。訂閱/cmd_vel的回調函數和串口下發函數分別如圖38和圖39所示。
(圖38)訂閱/cmd_vel的回調函數
(圖39)串口下發函數
而後,程序從串口獲取底盤的速度反饋,並將速度反饋數據放入航跡推演算法中進行解算,獲得里程計,將反饋回來的左輪速度、右輪速度值分別發佈到/wheel_left_speed和/wheel_right_speed主題,將解算出來的里程計分別發佈到/odom和/tf主題。因爲不一樣的算法對里程計的格式要求不同,因此將里程計同時發佈到/odom和/tf主題,便於不一樣的算法使用。從串口獲取速度反饋並求解里程計和發佈反饋速度與里程計到topic
分別如圖40和圖41所示。
(圖40)從串口獲取速度反饋並求解里程計
(圖41)發佈反饋速度與里程計到topic
基於航跡推演算法的里程計解算:
首先,咱們須要瞭解一下ROS下的機器人座標系爲右手座標系,如圖42,機器人底盤的正前方爲x軸正方向、機器人底盤的正上方爲z軸正方向、機器人底盤的正左方向爲y軸正方向、機器人航向角theta座標軸以x軸爲0度角並逆時針方向增大。通常以機器人底盤上電時刻,機器人底盤的位置創建里程計座標系,也就是說機器人底盤的起始位姿爲原點O,機器人底盤在運動過程當中,經過前一時刻的位置和左、右輪位移能夠推算出機器人底盤的下一時刻位姿,這就是航跡推演算法。
(圖42)機器人右手座標系與航跡推演
咱們這裏值討論兩輪差分底盤的狀況,分析如圖41,經過前一時刻的位置和左、右輪位移能夠推算出機器人底盤的下一時刻位姿。航跡推演的數學模型如圖43。
(圖43)航跡推演的數學模型
在很短的時間間隔裏,先後兩個機器人位姿知足必定的關係,具體看圖44的推導。
(圖44)短期內兩個機器人位姿的約束關係
這樣,通過進一步的化簡,能夠獲得咱們解算里程計的核心公式,如圖45。
(圖45)解算里程計核心公式
不難發現,上面程序中解算里程計部分的代碼就是這個核心公式的具體編程實現。關於航跡推演算法更詳細的推導,請參考:
http://faculty.salina.k-state.edu/tim/robotics_sg/Control/kinematics/odometry.html
接口:
底盤調試節點對下與底盤DEBUG-uart1串口通訊,對上經過命令行終端指令交互方式。
(圖46)底盤調試節點接口
節點實現源碼解析:
底盤調試節點由pid_set.cpp實現。程序主要分爲兩個過程:從終端獲取調試命令並下發給底盤、從底盤接收應答數據並顯示在終端。
首先,程序從終端獲取調試命令,用戶可輸入數字1,2,3,若是用戶輸入3會再要求輸入kp,ki,kd這三個數,將調試命令轉換爲通訊協議中DEBUG-uart1規定的格式,而後經過串口下發給底盤,實現對底盤的調試。調試命令獲取與下發如圖47。
(圖47)調試命令獲取與下發
而後,程序從串口獲取底盤的應答信息,這裏就比較簡單了,直接將獲取的應答數據原樣打印到終端就好了,如圖48。
(圖48)應答數據原樣打印
------SLAM+語音機器人DIY系列【目錄】快速導覽------
第1章:Linux基礎
第2章:ROS入門
第3章:感知與大腦
第4章:差分底盤設計
第5章:樹莓派3開發環境搭建
第6章:SLAM建圖與自主避障導航
2.google-cartographer機器人SLAM建圖
第7章:語音交互與天然語言處理
第8章:高階拓展
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章將持續更新,敬請關注-----------------
若是你們對博文的相關類容感興趣,或有什麼技術疑問,歡迎加入下面的《SLAM+語音機器人DIY》QQ技術交流羣,一塊兒討論學習^_^
關於咱們:
視頻教程: