摘要
運動底盤是移動機器人的重要組成部分,不像激光雷達、IMU、麥克風、音響、攝像頭這些通用部件可以直接買到,很難買到通用的底盤。一方面是因為底盤的尺寸結構和參數是要與具體機器人匹配的;另一方面是因為底盤包含軟硬件整套解決方案,是很多機器人公司的核心技術,一般不會隨便公開。出於強烈的求知欲與學習熱情,我想自己DIY一整套兩輪差分底盤,並且將完整的設計過程公開出去供大家學習。說干就干,本章節主要內容:
4.底盤ROS驅動開發
對於做純SLAM算法、機器人導航避障、或者別的需要用到移動底盤的應用,根據底盤的通信協議,直接使用底盤ROS驅動實現跟底盤的交互。miiboo機器人底盤的ROS驅動代碼組織如圖36。
(圖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導航實戰中具體展開。
4.1.底盤控制節點
接口:
底盤控制節點對下與底盤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
4.2.底盤調試節點
接口:
底盤調試節點對下與底盤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技術交流群,一起討論學習^_^
關於我們:
視頻教程: