引言
這篇文檔主要介紹 RT-Thread 如何使用串口或者無(wú)線和 ROS 連接,會(huì)包含這么些內(nèi)容:
第一部分:ROS 環(huán)境搭建
第二部分:RT-Thread rosserial 軟件包
第二部分:RT-Thread 添加 USART2 和 PWM
第三部分:RT-Thread 使用 ESP8266 AT 固件聯(lián)網(wǎng)
這里先介紹一下什么是 ROS?為什么要和 ROS 連接?
機(jī)器人操作系統(tǒng) ROS (Robots Operating System) 最早是斯坦福大學(xué)的一個(gè)軟件框架,現(xiàn)在不管是工業(yè)機(jī)器人,還是娛樂(lè)用的機(jī)器人都運(yùn)行著 ROS。
圖片來(lái)源網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除
一個(gè)機(jī)器人通常有很多個(gè)部件、傳感器,為了保證機(jī)器人不會(huì)因?yàn)槟骋粋€(gè)傳感器故障,導(dǎo)致整個(gè)系統(tǒng)癱瘓,所以采用了分布式的節(jié)點(diǎn),利用不同節(jié)點(diǎn)之間的通訊收集傳感器數(shù)據(jù)和控制指令,這篇文檔后面會(huì)使用到的通訊協(xié)議就是rosserial。 和 ROS 連接的好處在于,一方面由 ROS 管理各個(gè)機(jī)器人節(jié)點(diǎn)更穩(wěn)定,另一方面 ROS 現(xiàn)在已經(jīng)有了非常多成熟的軟件包,使用 ROS 就可以非常方便的為自己的機(jī)器人添加攝像頭圖像識(shí)別、激光雷達(dá)建圖導(dǎo)航等高級(jí)功能。 不過(guò)這篇文檔只會(huì)涉及 RT-Thread 和 ROS 建立基本的連接,實(shí)現(xiàn)小車的運(yùn)動(dòng)控制,之后可能會(huì)有后續(xù)文檔介紹如何連接激光雷達(dá)建圖,并進(jìn)行全局路徑規(guī)劃。
這篇文章假定大家都已經(jīng)會(huì)用 RT-Thread 的 env 工具下載軟件包,生成項(xiàng)目上傳固件到 stm32 上,并且熟悉 Ubuntu 的基本使用。
1 ROS 簡(jiǎn)介
這里的開(kāi)發(fā)環(huán)境搭建其實(shí)是需要搭建 2 份,一份是小車上的 ARM 開(kāi)發(fā)板 (樹(shù)莓派,NanoPi 什么的),另一個(gè)則是自己的電腦,因?yàn)槲覀兿M央娔X作為 ROS 從節(jié)點(diǎn),連接到小車上的 ROS 主節(jié)點(diǎn),不過(guò)開(kāi)發(fā)板和電腦的 ROS 安裝是一模一樣的。
既然要和 ROS 連接,那么首先就得要有一個(gè)正常運(yùn)行的 ROS。安裝 ROS 其實(shí)非常簡(jiǎn)單,這里推薦使用 Ubuntu 18 (開(kāi)發(fā)板推薦系統(tǒng)用 Armbian),因?yàn)楣俜綄?duì) Ubuntu 的支持優(yōu)先級(jí)是最高的,安裝教程也可以參照官網(wǎng):http://wiki.ros.org/melodic/Installation/Ubuntu 只需要輸入下面的 4 行命令,就在 Ubuntu 上裝好了 ROS。
1sudosh-c'echo"debhttps://mirror.tuna.tsinghua.edu.cn/ros/ubuntu$(lsb_release-sc)main">/etc/apt/sources.list.d/ros-latest.list' 2sudoapt-keyadv--keyserver'hkp://keyserver.ubuntu.com:80'--recv-keyC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 3sudoaptupdate 4sudoaptinstallros-melodic-ros-base上面我使用了清華大學(xué)的鏡像源,這樣從國(guó)內(nèi)下載 ROS 會(huì)快很多,而且我只安裝了 ROS 的基本軟件包,沒(méi)有安裝圖形化軟件包 gviz,gazebo 什么的,因?yàn)楹竺嬉矝](méi)有用到。
1.2 ROS 環(huán)境初始化
ROS 安裝好之后還需要進(jìn)行初始化,不過(guò)也是只有短短幾行命令:
1sudorosdepinit 2rosdepupdate 3 4echo"source/opt/ros/melodic/setup.bash">>~/.bashrc 5source~/.bashrc 1.3 啟動(dòng) ROS 啟動(dòng) ROS 的話我們需要確保它是常駐后臺(tái)運(yùn)行的,所以我們可以使用 tmux:1roscore
在 tmux 里啟動(dòng)了 ROS 主節(jié)點(diǎn)后,我們就可以 Ctrl + B D 退出了,而 ROS 主節(jié)點(diǎn)依舊在后臺(tái)運(yùn)行。
1.4 參考文獻(xiàn)
Armbian:https://www.armbian.com/
ROS Melodic 安裝//wiki.ros.org/melodic/Installation/Ubuntu
2 RT-Thread 串口連接 ROS
這一部分會(huì)介紹如何使用串口將運(yùn)行著 RT-Thread 的 STM32 開(kāi)發(fā)板和運(yùn)行著 ROS 的 ARM 開(kāi)發(fā)板連接,看起來(lái)差不多就是這樣。
這里說(shuō)明一下不同開(kāi)發(fā)板的分工,STM32 運(yùn)行著 RT-Thread 負(fù)責(zé)控制電機(jī),接收傳感器信息;ARM 運(yùn)行著 ROS 負(fù)責(zé)進(jìn)行全局控制,例如給小車發(fā)出前進(jìn)的指令。
2.1 RT-Thread 配置
首先我們需要打開(kāi) usart2,因?yàn)?usart1 被 msh 使用了,保留作為調(diào)試還是挺方便的。
在 CubeMX 里我打開(kāi)了 USART2,另外還打開(kāi)了 4 路 PWM,因?yàn)槲液竺媸褂昧?2 個(gè)電機(jī),每個(gè)電機(jī)需要 2 路 PWM 分別控制前進(jìn)和后退。 接下來(lái)還需要在 menuconfig 里面打開(kāi)對(duì)應(yīng)的選項(xiàng),考慮到有的開(kāi)發(fā)板默認(rèn)的 bsp 可能沒(méi)有這些選項(xiàng),可以修改 board/Kconfig 添加下面的內(nèi)容。串口的配置:
1menuconfigBSP_USING_UART 2bool"EnableUART" 3defaulty 4selectRT_USING_SERIAL 5ifBSP_USING_UART 6configBSP_USING_UART1 7bool"EnableUART1" 8defaulty 9 10configBSP_UART1_RX_USING_DMA 11bool"EnableUART1RXDMA" 12dependsonBSP_USING_UART1&&RT_SERIAL_USING_DMA 13defaultn 14 15configBSP_USING_UART2 16bool"EnableUART2" 17defaulty 18 19configBSP_UART2_RX_USING_DMA 20bool"EnableUART2RXDMA" 21dependsonBSP_USING_UART2&&RT_SERIAL_USING_DMA 22defaultn 23endifPWM 的配置:1menuconfigBSP_USING_PWM 2bool"Enablepwm" 3defaultn 4selectRT_USING_PWM 5ifBSP_USING_PWM 6menuconfigBSP_USING_PWM3 7bool"Enabletimer3outputpwm" 8defaultn 9ifBSP_USING_PWM3 10configBSP_USING_PWM3_CH1 11bool"EnablePWM3channel1" 12defaultn 13configBSP_USING_PWM3_CH2 14bool"EnablePWM3channel2" 15defaultn 16configBSP_USING_PWM3_CH3 17bool"EnablePWM3channel3" 18defaultn 19configBSP_USING_PWM3_CH4 20bool"EnablePWM3channel4" 21defaultn 22endif 23endif
這樣我們?cè)?env 下就可以看到有對(duì)應(yīng)的配置了,
除此之外,我們還需要選擇 rosserial 軟件包:
可以看到上面默認(rèn)的串口就是 USART2,這樣我們就可以生成對(duì)應(yīng)的工程了:
1pkgs--update 2scons--target=mdk5-s如果我們打開(kāi) Keil 項(xiàng)目,首先需要把 main.c 修改為 main.cpp,因?yàn)?rosserial 很多數(shù)據(jù)格式的定義都是用 C++ 寫(xiě)的,所以如果要使用 rosserial 庫(kù),我們先得把后綴改為 cpp,這樣 Keil 就會(huì)用 C++ 編譯器編譯。
下面是 main.cpp 的內(nèi)容,其實(shí)就是初始化了電機(jī),然后發(fā)布了 2 個(gè)話題 (topic),一個(gè)是 /vel_x 告訴 ROS 當(dāng)前小車的速度,一個(gè)是 /turn_bias 告訴 ROS 當(dāng)前小車的旋轉(zhuǎn)速度。同時(shí)又訂閱了一個(gè)話題 /cmd_vel,用來(lái)接收從 ROS 發(fā)出的控制指令。 代碼不是特別長(zhǎng),我也添加了一些注釋,所以這里就不一行行分析了。
1#include
另外還有對(duì)應(yīng)的電機(jī)控制的代碼,不過(guò)這個(gè)大家的小車不同,驅(qū)動(dòng)應(yīng)當(dāng)也不一樣,我這里由于小車電機(jī)上沒(méi)有編碼器,所以全部是開(kāi)環(huán)控制的。
motors.h
1#include
2.2 ROS 配置
我們把上面 RT-Thread 的固件傳到板子上以后,可以用一個(gè) USB-TTL 一邊和 STM32 控制板的 USART2 連接,另一邊插到 ARM 控制板的 USB 口,接下來(lái)就可以建立連接了,在 ARM 板上輸入命令:
1$rosrunrosserial_pythonserial_node.py/dev/ttyUSB0如果看到下面的輸出,那就成功建立連接了:1tpl@nanopineoplus2:~$rosrunrosserial_pythonserial_node.py/dev/ttyUSB0 2[INFO][1567239474.258919]:ROSSerialPythonNode 3[INFO][1567239474.288435]:Connectingto/dev/ttyUSB0at57600baud 4[INFO][1567239476.425646]:Requestingtopics... 5[INFO][1567239476.464336]:Note:publishbuffersizeis512bytes 6[INFO][1567239476.471349]:Setuppublisheronvel_x[std_msgs/Float64] 7[INFO][1567239476.489881]:Setuppublisheronturn_bias[std_msgs/Float64] 8[INFO][1567239476.777573]:Note:subscribebuffersizeis512bytes 9[INFO][1567239476.785032]:Setupsubscriberoncmd_vel[geometry_msgs/Twist]
2.3 ROS 控制小車
既然已經(jīng)成功建立連接了,下一步就是寫(xiě)小車控制的代碼了。 我們先初始化一個(gè)工作區(qū)間:
1$mkdircatkin_workspace&&cdcatkin_workspace 2$catkin_init_workspace
接下來(lái)創(chuàng)建一個(gè)軟件包:
1$cdsrc 2$catkin_create_pkgmy_first_pkgrospy 這樣就會(huì)自動(dòng)在 src 目錄創(chuàng)建一個(gè) ROS 軟件包了。 我們?cè)?catkin_workspace/src/my_first_pkg/src 目錄下新建一個(gè)文件 ros_cmd_vel_pub.py:1#!/usr/bin/python 2 3importrospy 4fromgeometry_msgs.msgimportTwist 5frompynput.keyboardimportKey,Listener 6 7vel=Twist() 8vel.linear.x=0 9 10defon_press(key): 11 12try: 13if(key.char=='w'): 14print("Forward") 15vel.linear.x=0.8 16vel.angular.z=0 17 18if(key.char=='s'): 19print("Backward") 20vel.linear.x=-0.8 21vel.angular.z=0 22 23if(key.char=='a'): 24print("CounterClockwise") 25vel.linear.x=0 26vel.angular.z=-0.8 27 28if(key.char=='d'): 29print("Clockwise") 30vel.linear.x=0 31vel.angular.z=0.8 32 33returnFalse 34 35exceptAttributeError: 36print('specialkey{0}pressed'.format(key)) 37returnFalse 38 39defon_release(key): 40vel.linear.x=0 41vel.angular.z=0 42 43returnFalse 44 45#InitNode 46rospy.init_node('my_cmd_vel_publisher') 47pub=rospy.Publisher('cmd_vel',Twist,queue_size=10) 48 49#Setrate 50rate=rospy.Rate(10) 51 52listener=Listener(on_release=on_release,on_press=on_press) 53 54whilenotrospy.is_shutdown(): 55print(vel.linear.x) 56pub.publish(vel) 57vel.linear.x=0 58vel.angular.z=0 59rate.sleep() 60 61ifnotlistener.running: 62listener=Listener(on_release=on_release,on_press=on_press) 63listener.start() 這就是我們的 python 控制程序了,可以使用鍵盤(pán)的 wasd 控制小車前進(jìn)后退,順時(shí)針、逆時(shí)針旋轉(zhuǎn)。我們需要給它添加可執(zhí)行權(quán)限:1$chmodu+x./ros_cmd_vel_pub.py
這樣就可以編譯軟件包了,在 catkin_worspace 目錄下。
1$catkin_make 2$sourcedevel/setup.bash
我們終于就可以啟動(dòng)程序從電腦上控制小車運(yùn)動(dòng)了:
1rosrunmy_first_pkgros_cmd_vel_pub.py 可以看到用 ROS 實(shí)現(xiàn)小車控制其實(shí)代碼量并不算多,只需要在自己小車原有的代碼上發(fā)布一些話題,告訴 ROS 小車當(dāng)前的狀態(tài),并且訂閱一個(gè)話題接收 ROS 的控制指令就可以了。
2.4 參考文獻(xiàn)
ros-pibot:https://github.com/wuhanstudio/ros-pibot
3 RT-Thread 無(wú)線連接 ROS
3.1 rosserial 配置
其實(shí)無(wú)線連接和有線連接幾乎是一模一樣的,只不過(guò)是先用 ESP8266 使自己的控制板能連上網(wǎng),然后用 tcp 連接和 ROS 通信,關(guān)于 RT-Thread 使用 ESP8266 上網(wǎng)的教程可以參照官網(wǎng):https://www.rt-thread.org/document/site/application-note/components/at/an0014-at-client/,非常詳細(xì)了,我這里就不重復(fù)了。 確保開(kāi)發(fā)板有網(wǎng)絡(luò)連接后,我們就可以在 rosserial 里面配置為使用 tcp 連接:
我們只需要在上一部分的 main.cpp 里添加一行代碼:
1//設(shè)置ROS的IP端口號(hào) 2nh.getHardware()->setConnection("192.168.1.210",11411); 3 4//添加在節(jié)點(diǎn)初始化之前 5nh.initNode();開(kāi)發(fā)板就能通過(guò) tcp 連接和 ROS 通信了,非常方便。
3.2 ROS 配置
由于我們使用了 tcp 連接,所以 ROS 上自然也要開(kāi)啟一個(gè)服務(wù)器了,之前是使用的串口建立連接,現(xiàn)在就是使用 tcp 了:
1$rosrunrosserial_pythonserial_node.pytcp
其他的代碼完全不需要改變,這樣我們就實(shí)現(xiàn)了一個(gè) ROS 無(wú)線控制的小車了。
3.3 參考文獻(xiàn)
RT-Thread 使用 ESP8266 上網(wǎng):
https://www.rt-thread.org/document/site/application-note/components/at/an0014-at-client/
-
串口
+關(guān)注
關(guān)注
14文章
1555瀏覽量
76558 -
智能車
+關(guān)注
關(guān)注
21文章
404瀏覽量
76979 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1291瀏覽量
40176 -
ROS
+關(guān)注
關(guān)注
1文章
278瀏覽量
17019
原文標(biāo)題:RT-Thread+STM32實(shí)現(xiàn)智能車目標(biāo)識(shí)別系統(tǒng)的教程
文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論