引言
這篇文檔主要介紹 RT-Thread 如何使用串口或者無線和 ROS 連接,會包含這么些內(nèi)容:
第一部分:ROS 環(huán)境搭建
第二部分:RT-Thread rosserial 軟件包
第二部分:RT-Thread 添加 USART2 和 PWM
第三部分:RT-Thread 使用 ESP8266 AT 固件聯(lián)網(wǎng)
這里先介紹一下什么是 ROS?為什么要和 ROS 連接?
機器人操作系統(tǒng) ROS (Robots Operating System) 最早是斯坦福大學(xué)的一個軟件框架,現(xiàn)在不管是工業(yè)機器人,還是娛樂用的機器人都運行著 ROS。
圖片來源網(wǎng)絡(luò),如有侵權(quán)請聯(lián)系刪除
一個機器人通常有很多個部件、傳感器,為了保證機器人不會因為某一個傳感器故障,導(dǎo)致整個系統(tǒng)癱瘓,所以采用了分布式的節(jié)點,利用不同節(jié)點之間的通訊收集傳感器數(shù)據(jù)和控制指令,這篇文檔后面會使用到的通訊協(xié)議就是rosserial。 和 ROS 連接的好處在于,一方面由 ROS 管理各個機器人節(jié)點更穩(wěn)定,另一方面 ROS 現(xiàn)在已經(jīng)有了非常多成熟的軟件包,使用 ROS 就可以非常方便的為自己的機器人添加攝像頭圖像識別、激光雷達建圖導(dǎo)航等高級功能。 不過這篇文檔只會涉及 RT-Thread 和 ROS 建立基本的連接,實現(xiàn)小車的運動控制,之后可能會有后續(xù)文檔介紹如何連接激光雷達建圖,并進行全局路徑規(guī)劃。
這篇文章假定大家都已經(jīng)會用 RT-Thread 的 env 工具下載軟件包,生成項目上傳固件到 stm32 上,并且熟悉 Ubuntu 的基本使用。
1 ROS 簡介
這里的開發(fā)環(huán)境搭建其實是需要搭建 2 份,一份是小車上的 ARM 開發(fā)板 (樹莓派,NanoPi 什么的),另一個則是自己的電腦,因為我們希望把電腦作為 ROS 從節(jié)點,連接到小車上的 ROS 主節(jié)點,不過開發(fā)板和電腦的 ROS 安裝是一模一樣的。
既然要和 ROS 連接,那么首先就得要有一個正常運行的 ROS。安裝 ROS 其實非常簡單,這里推薦使用 Ubuntu 18 (開發(fā)板推薦系統(tǒng)用 Armbian),因為官方對 Ubuntu 的支持優(yōu)先級是最高的,安裝教程也可以參照官網(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é)的鏡像源,這樣從國內(nèi)下載 ROS 會快很多,而且我只安裝了 ROS 的基本軟件包,沒有安裝圖形化軟件包 gviz,gazebo 什么的,因為后面也沒有用到。
1.2 ROS 環(huán)境初始化
ROS 安裝好之后還需要進行初始化,不過也是只有短短幾行命令:
1sudorosdepinit 2rosdepupdate 3 4echo"source/opt/ros/melodic/setup.bash">>~/.bashrc 5source~/.bashrc 1.3 啟動 ROS 啟動 ROS 的話我們需要確保它是常駐后臺運行的,所以我們可以使用 tmux:1roscore
在 tmux 里啟動了 ROS 主節(jié)點后,我們就可以 Ctrl + B D 退出了,而 ROS 主節(jié)點依舊在后臺運行。
1.4 參考文獻
Armbian:https://www.armbian.com/
ROS Melodic 安裝//wiki.ros.org/melodic/Installation/Ubuntu
2 RT-Thread 串口連接 ROS
這一部分會介紹如何使用串口將運行著 RT-Thread 的 STM32 開發(fā)板和運行著 ROS 的 ARM 開發(fā)板連接,看起來差不多就是這樣。
這里說明一下不同開發(fā)板的分工,STM32 運行著 RT-Thread 負責控制電機,接收傳感器信息;ARM 運行著 ROS 負責進行全局控制,例如給小車發(fā)出前進的指令。
2.1 RT-Thread 配置
首先我們需要打開 usart2,因為 usart1 被 msh 使用了,保留作為調(diào)試還是挺方便的。
在 CubeMX 里我打開了 USART2,另外還打開了 4 路 PWM,因為我后面使用了 2 個電機,每個電機需要 2 路 PWM 分別控制前進和后退。 接下來還需要在 menuconfig 里面打開對應(yīng)的選項,考慮到有的開發(fā)板默認的 bsp 可能沒有這些選項,可以修改 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
這樣我們在 env 下就可以看到有對應(yīng)的配置了,
除此之外,我們還需要選擇 rosserial 軟件包:
可以看到上面默認的串口就是 USART2,這樣我們就可以生成對應(yīng)的工程了:
1pkgs--update 2scons--target=mdk5-s如果我們打開 Keil 項目,首先需要把 main.c 修改為 main.cpp,因為 rosserial 很多數(shù)據(jù)格式的定義都是用 C++ 寫的,所以如果要使用 rosserial 庫,我們先得把后綴改為 cpp,這樣 Keil 就會用 C++ 編譯器編譯。
下面是 main.cpp 的內(nèi)容,其實就是初始化了電機,然后發(fā)布了 2 個話題 (topic),一個是 /vel_x 告訴 ROS 當前小車的速度,一個是 /turn_bias 告訴 ROS 當前小車的旋轉(zhuǎn)速度。同時又訂閱了一個話題 /cmd_vel,用來接收從 ROS 發(fā)出的控制指令。 代碼不是特別長,我也添加了一些注釋,所以這里就不一行行分析了。
1#include
另外還有對應(yīng)的電機控制的代碼,不過這個大家的小車不同,驅(qū)動應(yīng)當也不一樣,我這里由于小車電機上沒有編碼器,所以全部是開環(huán)控制的。
motors.h
1#include
2.2 ROS 配置
我們把上面 RT-Thread 的固件傳到板子上以后,可以用一個 USB-TTL 一邊和 STM32 控制板的 USART2 連接,另一邊插到 ARM 控制板的 USB 口,接下來就可以建立連接了,在 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)成功建立連接了,下一步就是寫小車控制的代碼了。 我們先初始化一個工作區(qū)間:
1$mkdircatkin_workspace&&cdcatkin_workspace 2$catkin_init_workspace
接下來創(chuàng)建一個軟件包:
1$cdsrc 2$catkin_create_pkgmy_first_pkgrospy 這樣就會自動在 src 目錄創(chuàng)建一個 ROS 軟件包了。 我們在 catkin_workspace/src/my_first_pkg/src 目錄下新建一個文件 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 控制程序了,可以使用鍵盤的 wasd 控制小車前進后退,順時針、逆時針旋轉(zhuǎn)。我們需要給它添加可執(zhí)行權(quán)限:1$chmodu+x./ros_cmd_vel_pub.py
這樣就可以編譯軟件包了,在 catkin_worspace 目錄下。
1$catkin_make 2$sourcedevel/setup.bash
我們終于就可以啟動程序從電腦上控制小車運動了:
1rosrunmy_first_pkgros_cmd_vel_pub.py 可以看到用 ROS 實現(xiàn)小車控制其實代碼量并不算多,只需要在自己小車原有的代碼上發(fā)布一些話題,告訴 ROS 小車當前的狀態(tài),并且訂閱一個話題接收 ROS 的控制指令就可以了。
2.4 參考文獻
ros-pibot:https://github.com/wuhanstudio/ros-pibot
3 RT-Thread 無線連接 ROS
3.1 rosserial 配置
其實無線連接和有線連接幾乎是一模一樣的,只不過是先用 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/,非常詳細了,我這里就不重復(fù)了。 確保開發(fā)板有網(wǎng)絡(luò)連接后,我們就可以在 rosserial 里面配置為使用 tcp 連接:
我們只需要在上一部分的 main.cpp 里添加一行代碼:
1//設(shè)置ROS的IP端口號 2nh.getHardware()->setConnection("192.168.1.210",11411); 3 4//添加在節(jié)點初始化之前 5nh.initNode();開發(fā)板就能通過 tcp 連接和 ROS 通信了,非常方便。
3.2 ROS 配置
由于我們使用了 tcp 連接,所以 ROS 上自然也要開啟一個服務(wù)器了,之前是使用的串口建立連接,現(xiàn)在就是使用 tcp 了:
1$rosrunrosserial_pythonserial_node.pytcp
其他的代碼完全不需要改變,這樣我們就實現(xiàn)了一個 ROS 無線控制的小車了。
3.3 參考文獻
RT-Thread 使用 ESP8266 上網(wǎng):
https://www.rt-thread.org/document/site/application-note/components/at/an0014-at-client/
-
串口
+關(guān)注
關(guān)注
14文章
1559瀏覽量
77106 -
智能車
+關(guān)注
關(guān)注
21文章
405瀏覽量
77070 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40412 -
ROS
+關(guān)注
關(guān)注
1文章
280瀏覽量
17111
原文標題:RT-Thread+STM32實現(xiàn)智能車目標識別系統(tǒng)的教程
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
RT-Thread+STM32實現(xiàn)智能車目標識別系統(tǒng)的教程
RT-Thread+STM32實現(xiàn)智能車目標識別系統(tǒng)的教程 精選資料推薦
RT-Thread實時操作系統(tǒng)與ROS2是怎樣進行通信的
RT-Thread編程指南
記錄——基于 RT-Thread 實現(xiàn) USB 虛擬串口
![記錄——基于 <b class='flag-5'>RT-Thread</b> 實現(xiàn) USB 虛擬<b class='flag-5'>串口</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
機器人操作系統(tǒng) (RO2) 和 RT-Thread 通信
![機器人操作系統(tǒng) (RO2) 和 <b class='flag-5'>RT-Thread</b> 通信](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
RT-Thread全球技術(shù)大會:Kconfig在RT-Thread中的工作機制
![<b class='flag-5'>RT-Thread</b>全球技術(shù)大會:Kconfig在<b class='flag-5'>RT-Thread</b>中的工作機制](https://file.elecfans.com/web2/M00/46/18/pYYBAGKQcvGAQEQrAAFnDo7l2-o172.png)
RT-Thread學(xué)習筆記 RT-Thread的架構(gòu)概述
![<b class='flag-5'>RT-Thread</b>學(xué)習筆記 <b class='flag-5'>RT-Thread</b>的架構(gòu)概述](https://file.elecfans.com/web2/M00/52/31/pYYBAGLKk5WAA__jAADjdAdXhIs410.jpg)
RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
![<b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論