碼迷,www.tparu.icu
吉利平特名人堂 > 其他好文 > 詳細

平特精版料127期图片:第四天:SLAM智能小車DIY樂趣-小車控制ROS驅動包開發

時間:2018-09-19 21:53:10      閱讀:9937      評論:0      收藏:0      [點我收藏+]

吉利平特名人堂 www.tparu.icu 標簽:位置   span   The   sla   智能   ima   print   串口   slam   

小車控制ROS驅動包開發

####寫在前面####

對于做純SLAM算法和應用功能開發的朋友來說,其實不需要搞明白小車的底層硬件原理和軟件實現等繁瑣的細節,只需要通過上層API調用來實現小車的控制等操作就可以了。因此,本文開始講解用于提供上層API調用的ROS驅動包,本文主要內容:

1) 通信協議簡介(stm32與ROS驅動包通信)

2) ROS接口(topic訂閱與發布)

3) ROS驅動包程序解析

4) 基于航跡推演的里程計解算

####正文####

1.通信協議簡介(stm32與ROS驅動包通信)

    通信協議都基于串口通信,通信數據幀由串口通信的單個字節組合而成,stm32的串口2由“小車控制-ROS驅動包”驅動,stm32的串口1由“小車debug-ROS驅動包”驅動,兩個串口都使用115200的波特率。下面分別介紹兩個驅動包的通信協議:

stm32與小車控制ROS驅動包通信:

技術分享圖片

技術分享圖片

不難發現,其實“小車控制-ROS驅動包”發送和接收數據遵循同樣的協議。

stm32與小車debug-ROS驅動包通信:

 技術分享圖片 

技術分享圖片

stm32發送過來的調試信息時純字符串流,可以通過printf()直接來查看;

小車debug-ROS驅動發送給stm32的kp、ki、kd是一個擴大10000倍后的整數,除以10000后使用。

2. ROS接口(topic訂閱與發布)

ROS接口為上層應用提供API調用,便于SLAM算法和應用功能開發。

訂閱topic:

/cmd_vel  (geometry_msgs::Twist)

發布topic:

/enc_l    (msgs::Int16)

/enc_r    (msgs::Int16)

/odom    (nav_msgs::Odometry)

/tf        (odom->base_footprint)

3.ROS驅動包程序解析

了解了前面的通信協議和ROS接口后,接下來就來看看ROS程序是如何實現的。首先程序訂閱/cmd_vel作為用戶的控制輸入,將控制輸入的速度信息轉換為通信協議中規定的格式,然后通過串口下發給stm32,實現對小車的運動控制。

下圖是訂閱/cmd_vel的回調函數:

技術分享圖片

下圖是串口下發函數:

技術分享圖片

知道了怎么控制小車運動,接下來介紹獲取小車反饋回來的碼盤信息,并將反饋回來的碼盤信息進行里程計解算。

如下圖是串口讀取和里程計解算函數:

技術分享圖片

如下圖是里程計和相關topic發布:

 技術分享圖片

4.基于航跡推演的里程計解算

 首先通過下面的一張圖來了解一下里程計解算的大致原理,下圖包含兩個坐標分別對應圖A、圖B,請看圖:

技術分享圖片

在圖A中,設定機器人初始位置與坐標系原點重合,機器人的正前方為坐標系x軸正方向,機器人方向角定義為由坐標系x軸正方向逆時針方向(即圖中theta軸所示)。利用極限的思想,機器人在很短的時間delta_t內,由A位置運動到B位置,機器人繞p轉動一個微小的角度,其中delta_d_l與delta_d_r分別為左輪和右輪的位移量,可以通過編碼反饋值計算得;delta_theta是方向角變化量,由等腰三角形的關系可以得出delta_theta與圖中各角的關系;L是兩輪之間的軸距。有了這個理論基礎,下面接著介紹如何解算出里程計。

在圖B中,主要說明了如何通過迭代來計算機器人在坐標系中的姿態,從而得到我們需要的里程計。通過圖A中介紹的原理,不難得出delta_d、delta_theta、delta_x、delta_y各變化量,然后通過過迭代的方法便可以求出里程計中的機器人位置(x,y,theta)和機器人的速度(v,w)。

有了里程計解算的理論基礎后,接下來談談具體程序實現,如下圖:

 技術分享圖片

程序的輸入是在采樣周期內得到的左右輪編碼值(delta_encode_left和delta_encode_right),這個編碼值可以通過速度系數speed_ratio便可以換算成實際的位移量,速度系數speed_ratio可以通過后續的標定得到;兩個輪子的軸距wheel_distance也是通過后續的標定得到,采樣周期encode_sampling_time在程序中是一個可選的參數。有了delta_encode_left、delta_encode_right的值,便可以推算出delta_d、delta_theta,繼而可以推算出delta_x、delta_y,繼續往下使用迭代可以計算出最終的里程計值position_x、position_y、oriention、velocity_linear、velocity_angular。最后通過ROS將里程計發布出去就ok了。

第四天:SLAM智能小車DIY樂趣-小車控制ROS驅動包開發

標簽:位置   span   The   sla   智能   ima   print   串口   slam   

原文地址:https://www.cnblogs.com/hiram-zhang/p/9676725.html

(0)
(0)
   
舉報
評論 一句話評論(0
0條  
登錄后才能評論!
? 2014 吉利平特名人堂 版權所有 京ICP備13008772號-2
迷上了代碼!
北赛车pk10官网 飞艇计划手机app软件排行榜 欢乐生肖直播 玩快三稳赚技巧口诀(快三有什么技巧) 腾讯欢乐麻将 内蒙古时时开奖结果查询 时彩必中稳赚技巧 北京pk10赛车走势分析 11选5追号40期必中 彩名堂手机版 关于使用免费黑客棋牌透牌器 大赢家足球即时比分 大乐透预测分析 幸运飞艇大小倍投技巧 黑龙江时时群 苹果彩票下载