OriginBot源碼學(xué)習(xí)—底盤(pán)驅(qū)動(dòng)
從拿到OriginBot到現(xiàn)在也玩了好一段時(shí)間了,打算基于它做一些自定義的開(kāi)發(fā),不可避免的會(huì)接觸到源碼,所以打算用“OriginBot源碼學(xué)習(xí)”這個(gè)系列來(lái)記錄和分享我的學(xué)習(xí)過(guò)程。
我是一名機(jī)器人小白,只有Python的基礎(chǔ),所以這個(gè)系列的文章會(huì)更適合新手看。
先體驗(yàn)功能
這是我第一次看硬件類開(kāi)源項(xiàng)目的源碼,但是我覺(jué)得應(yīng)該和看軟件開(kāi)源項(xiàng)目是差不多的。
在真正開(kāi)始學(xué)習(xí)源代碼之前,一定要先好好玩一玩OriginBot,把它的功能基本都熟悉之后才能比較容易地理解代碼。
我也是在玩了兩個(gè)月的小車,基本把所有的功能都玩了一遍之后有了一些自定義開(kāi)發(fā)的想法之后才開(kāi)始學(xué)習(xí)源代碼的。
源碼學(xué)習(xí)計(jì)劃
我會(huì)按照官網(wǎng)的功能清單去閱讀,如下圖

所以這個(gè)系列的內(nèi)容會(huì)參照快速上手?、基礎(chǔ)使用和應(yīng)用功能來(lái)寫(xiě),但是不會(huì)是囊括里面的所有內(nèi)容,只會(huì)包含我所需要的部分。
快速上手代碼解析
功能解釋
快速上手部分是向我們展示怎么樣讓小車能運(yùn)動(dòng)起來(lái),比如前進(jìn)、后退和拐彎這些,可以讓我們對(duì)小車有一個(gè)直觀的體驗(yàn)。
具體參考:?https://www.originbot.org/guide/easy_start/(老實(shí)說(shuō),第一次組裝好小車并且讓它動(dòng)起來(lái)還是很開(kāi)心的)
這一部分代碼不是很復(fù)雜,并且在后面幾乎所有功能中需要使用到,所以我覺(jué)得這是我學(xué)習(xí)源碼的一個(gè)很好的切入點(diǎn)。
鍵盤(pán)控制節(jié)點(diǎn)分析
官網(wǎng)的教程讓我們先啟動(dòng)機(jī)器人底盤(pán),再啟動(dòng)鍵盤(pán)控制節(jié)點(diǎn),也就是分別先后運(yùn)行一下兩行命令:'''sh
啟動(dòng)機(jī)器人人底盤(pán)
ROS2 發(fā)布o(jì)riginbot_bringup originbot.launch.py
啟動(dòng)鍵盤(pán)控制節(jié)點(diǎn)
但是這里要先說(shuō)鍵盤(pán)控制節(jié)點(diǎn)。
以下內(nèi)容需要一點(diǎn)ros2的基礎(chǔ)知識(shí),如果完全不懂ros2的話建議先去學(xué)一下[ros2 21講](https://book.guyuehome.com/)**?
teleop_twist_keyboard 是ros2自帶的一個(gè)功能,并不是OriginBot自己的代碼。(我一開(kāi)始以為這是OriginBot的代碼,找了很久都沒(méi)有找到源碼)
大家可以在一臺(tái)安裝好ros2的ubuntu運(yùn)行'ros2 topic list', 會(huì)發(fā)現(xiàn)只有兩個(gè)ros2自帶的topic,輸出如下,'''sh$ ros2 topic list/parameter_events/rosout
這個(gè)時(shí)候啟動(dòng)另一個(gè)命令行session,運(yùn)行ros2 run teleop_twist_keyboard teleop_twist_keyboard,如下,
此時(shí)在先前的命令行session中再次運(yùn)行ros2 topic list,如下:
可以發(fā)現(xiàn)多了一個(gè)cmd_vel
然后在當(dāng)前命令行執(zhí)行 ros2 topic echo /cmd_vel (這個(gè)命令用于打印來(lái)自于cmd_vel這個(gè)topic的message), 并在先前的teleop_twist_keyboard 命令行session中按一次i鍵,會(huì)觀察到ros2 topic echo /cmd_vel 會(huì)有如下輸出:
可以看到我們收到了一組linear(線速度)和angular(角速度)
作用就是把上面的線速度和角速度以合適的形式發(fā)送給STM32,然后STM32就會(huì)對(duì)小車的速度按照接收的數(shù)據(jù)進(jìn)行調(diào)整。
底盤(pán)控制節(jié)點(diǎn)解析
前文提到過(guò),通過(guò)執(zhí)行ros2 launch originbot_bringup originbot.launch.py 可以啟動(dòng)機(jī)器人底盤(pán),這個(gè)命令背后實(shí)際運(yùn)行的代碼是 originbot.launch.py, 為了方便解釋代碼,我把代碼原文貼在下面,以注釋的形式記錄。
代碼中三個(gè)launch.actions.IncludeLaunchDescription部分調(diào)用分別調(diào)用了底盤(pán)驅(qū)動(dòng)節(jié)點(diǎn)、雷達(dá)節(jié)點(diǎn)和攝像頭節(jié)點(diǎn)。
而其中的第一個(gè)調(diào)用了底盤(pán)驅(qū)動(dòng)節(jié)點(diǎn),實(shí)際上就是調(diào)用了originbot_base功能包中的launch文件,路徑是:originbot/originbot_base/launch/robot.launch.py
代碼如下:
originbot_base.cpp 里面設(shè)計(jì)到很多跟STM32交互的代碼,我在這里只嘗試解釋跟運(yùn)動(dòng)相關(guān)的部分的代碼。
首先,會(huì)進(jìn)過(guò)下面這行代碼,
這行代碼代碼是創(chuàng)建了一個(gè)訂閱者來(lái)訂閱Twist消息,也就是前面提到的ros2 run teleop_twist_keyboard teleop_twist_keyboard?命令發(fā)出來(lái)的消息,實(shí)際上是一個(gè)線速度和角速度的集合。
接收到到消息之后,再調(diào)用cmd_vel_callback函數(shù),這個(gè)函數(shù)的作用就是解析消息的內(nèi)容,并以合適的格式發(fā)送給STM32。
以下是cmd_vel_callback的代碼
通信協(xié)議如下圖所示:

自定義拓展—用Python實(shí)現(xiàn)
上面是對(duì)于OriginBot底盤(pán)驅(qū)動(dòng)的代碼閱讀和理解,為了加深印象,我用Python把其中的訂閱器重寫(xiě)了一下, 步驟如下:
創(chuàng)建功能包
按照先后順序執(zhí)行以下命令
到這里就有一個(gè)python格式的originbot_base功能包了
編寫(xiě)訂閱器代碼
在上面的功能包的originbot_base路徑創(chuàng)建originbot_base.py, 內(nèi)容如下:
代碼其實(shí)很簡(jiǎn)單,只寫(xiě)了怎么通過(guò)訂閱者獲取到速度信息,并通過(guò)差分模型計(jì)算出兩個(gè)輪子的速度,后面還應(yīng)該按照通信協(xié)議進(jìn)行封裝并通過(guò)串口通信發(fā)送給STM32,不過(guò)工業(yè)上這一部分還是C++用的多,就不再用Python寫(xiě)了。
編譯
代碼寫(xiě)完了還需要編譯才能運(yùn)行,并以也很簡(jiǎn)單,在originbot_py路徑下執(zhí)行?colcon build?就可以了
運(yùn)行和校驗(yàn)
編譯正常的話,就可以運(yùn)行了,先在另外一個(gè)命令行窗口中運(yùn)行ros2 run teleop_twist_keyboard teleop_twist_keyboard?來(lái)啟動(dòng)鍵盤(pán)控制節(jié)點(diǎn),再執(zhí)行如下命令,
此時(shí)在鍵盤(pán)控制節(jié)點(diǎn)的命令行中給出一些指令,我們用Python寫(xiě)的代碼就可以獲取到對(duì)應(yīng)的信息了,日志如下:
到這里我們的代碼就正常運(yùn)行了。