




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
機(jī)器人操作系統(tǒng)(ROS)機(jī)器人操作系統(tǒng)(ROS)遙控小海龜運(yùn)動7.1機(jī)器人操作系統(tǒng)(ROS)7.1遙控小海龜運(yùn)動
我們在剛開始學(xué)習(xí)ROS的時候,接觸到的第一個功能包是turtlesim,該功能包可以通過鍵盤控制小海龜在界面中移動。這個功能包的核心是turtlesim_node節(jié)點(diǎn),提供一個可視化的海龜仿真器。本章中我們將學(xué)習(xí)在ROS中如何使用遙控器來控制小海龜運(yùn)動,實驗分別以紅外遙控器和游戲手柄為例來實現(xiàn)小海龜?shù)倪\(yùn)動控制。
紅外遙控器
游戲手柄
仿真小海龜機(jī)器人操作系統(tǒng)(ROS)7.1.1紅外遙控器控制小海龜運(yùn)動硬件基礎(chǔ)
實驗用到的硬件包括:紅外遙控器、紅外解碼模塊、USB轉(zhuǎn)TTL模塊。紅外解碼模塊可將紅外遙控器發(fā)射的紅外編碼信號解碼成相應(yīng)的16進(jìn)制數(shù)并通過串口進(jìn)行輸出。USB轉(zhuǎn)TTL模塊與紅外解碼模塊通過杜邦線進(jìn)行連接,通過USB端口連接至上位機(jī)。
紅外遙控器紅外解碼器USB轉(zhuǎn)TTL模塊紅外遙控器按鍵對應(yīng)的16進(jìn)制編碼紅外遙控器按鍵對應(yīng)的16進(jìn)制編碼,其中用戶碼為“00FF”,串口輸出數(shù)據(jù)為“用戶碼+鍵位碼”,例如我們按下“OK”鍵,串口則輸出“00FF1C”。機(jī)器人操作系統(tǒng)(ROS)軟件基礎(chǔ)在終端中輸入以下命令安裝ROS串口功能包:$catkin_create_pkgteleoperationstd_msgsrospyroscpp輸入以下命令檢測serial包是否安裝好:$rospackfindserial若終端顯示serial的路徑(/opt/ros/melodic/share/serial),則說明安裝成功。7.1.1紅外遙控器控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)在~/catkin_ws/src下輸入以下命令創(chuàng)建一個名為serialport的功能包:$catkin_create_pkgserialportroscpprospystd_msgsserial在serialport/src文件夾下創(chuàng)建名為infrared_remote.cpp的文件,并填入以下代碼:#include<ros/ros.h>#include<serial/serial.h>//ROS已經(jīng)內(nèi)置了的串口包#include<geometry_msgs/Twist.h>serial::Serialser;//聲明串口對象
uint8_tbuffer[3];//定義串口數(shù)據(jù)存放數(shù)組
uint8_ta;intmain(intargc,char**argv){ros::init(argc,argv,"serial_remote_node");//初始化節(jié)點(diǎn)ros::NodeHandlenh;//聲明節(jié)點(diǎn)句柄 ros::Publisherread_pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);//發(fā)布話題……7.1.1紅外遙控器控制小海龜運(yùn)動軟件基礎(chǔ)機(jī)器人操作系統(tǒng)(ROS)代碼解釋ros/ros.h包含大部分ROS中通用的頭文件,serial/serial.h即ROS中已經(jīng)內(nèi)置了的串口包,通過它可以與串口設(shè)備進(jìn)行通訊,另外節(jié)點(diǎn)會發(fā)布geometry_msgs/Twist類型的消息,所以需要加入包含該類型的頭文件Twist.h,這個頭文件根據(jù)Twist.msg的消息結(jié)構(gòu)定義自動生成。1.頭文件部分#include<ros/ros.h>#include<serial/serial.h>#include<geometry_msgs/Twist.h>7.1.1紅外遙控器控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋在main函數(shù)中,通過init函數(shù)初始化ros節(jié)點(diǎn),節(jié)點(diǎn)名稱為serial_remote_node,該名稱在運(yùn)行的ROS中是唯一的,不允許同時存在名稱相同的兩個節(jié)點(diǎn)。通過ros::NodeHandlenh聲明節(jié)點(diǎn)句柄,最后創(chuàng)建一個名為read_pub的發(fā)布者,發(fā)布者向話題/turtle1/cmd_vel中發(fā)布Twist類型的消息,其中緩存區(qū)大小為1。2.主函數(shù)部分intmain(intargc,char**argv){ros::init(argc,argv,"serial_remote_node");ros::NodeHandlenh;
ros::Publisherread_pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1);......}7.1.1紅外遙控器控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋進(jìn)入trycatch語句,設(shè)置串口設(shè)備號為/dev/ttyUSB0,串口波特率為9600b/s,串口超時時間為1000ms,設(shè)置完成后打開串口。當(dāng)串口打開錯誤時,在終端報錯:"Unabletoopenport"并返回-1。若串口成功打開,則在終端輸出:"SerialPortinitialized"。2.主函數(shù)部分try{ser.setPort("/dev/ttyUSB0");ser.setBaudrate(9600);serial::Timeoutto=serial::Timeout::simpleTimeout(1000);ser.setTimeout(to);ser.open();}catch(serial::IOException&e){ROS_ERROR_STREAM("Unabletoopenport");return-1;}7.1.1紅外遙控器控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋ros::Rateloop_rate(50);geometry_msgs::Twistvel;指定程序循環(huán)的頻率為50hz,并創(chuàng)建一個geometry_msgs::Twist類型的變量vel,用于存儲需要發(fā)布的線速度和角速度數(shù)據(jù)。while(ros::ok()){if(ser.available()){ ...... } ros::spinOnce loop_rate.sleep();}進(jìn)入while循環(huán),通過ser.available()函數(shù)接收串口緩沖區(qū)中當(dāng)前剩余的字符個數(shù),判斷串口的緩沖區(qū)有無數(shù)據(jù)。當(dāng)ser.available()>0時,說明串口接收到了數(shù)據(jù),可以進(jìn)行數(shù)據(jù)解析,否則等待串口數(shù)據(jù)接收。7.1.1紅外遙控器控制小海龜運(yùn)動2.主函數(shù)部分機(jī)器人操作系統(tǒng)(ROS)編譯功能包在CMakeLists.txt文件中添加:add_executable(infrared_remotesrc/infrared_remote.cpp)
add_dependencies(infrared_remote${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS})
target_link_libraries(infrared_remote${catkin_LIBRARIES})修改完成之后,在工作空間中進(jìn)行編譯:$cd~/catkin_ws
$catkin_make7.1.1紅外遙控器控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)開啟終端輸入以下命令啟動小海龜節(jié)點(diǎn),在啟動前不要忘記啟動roscore命令:$roscore$rosrunturtlesimturtlesim_node插入紅外接收探頭,另啟終端輸入以下命令開啟紅外遙控節(jié)點(diǎn):$source
~/catkin_ws/devel/setup.bash$rosrunserialportinfrared_remote按動紅外遙控器上的按鍵,將出現(xiàn)信息輸出日志:信息輸出日志結(jié)果7.1.1紅外遙控器控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)7.1.1紅外遙控器控制小海龜運(yùn)動可通過如下命令查看遙控器發(fā)送的/turtle1/cmd_vel話題消息:$rostopicecho/turtle1/cmd_vel話題/turtle1/cmd_vel內(nèi)容機(jī)器人操作系統(tǒng)(ROS)7.1.1紅外遙控器控制小海龜運(yùn)動遙控小海龜運(yùn)動情況此時我們就可以通過紅外遙控器控制小海龜?shù)倪\(yùn)動,小海龜運(yùn)動情況如圖所示。讀者可以根據(jù)自己的需要定義遙控器上其他按鍵的功能,編寫屬于自己的控制命令。本實驗遙控器的按鍵信息對應(yīng)如下:上下左右鍵分別對應(yīng)前進(jìn)、后退、左轉(zhuǎn)和右轉(zhuǎn),OK鍵對應(yīng)停止。機(jī)器人操作系統(tǒng)(ROS)7.1.2游戲手柄控制小海龜運(yùn)動硬件基礎(chǔ)
除了上一節(jié)中討論的紅外遙控器控制小海龜運(yùn)動,我們還可以通過游戲手柄更加真實而有趣的控制屏幕里的小海龜。微軟XBOX360手柄機(jī)器人操作系統(tǒng)(ROS)軟件基礎(chǔ)在終端中輸入以下命令安裝手柄驅(qū)動功能包:$sudoapt-getinstallros-melodic-joystick-drivers輸入以下命令檢測serial包是否安裝好:$rospackfindserial安裝完成后將手柄連接到電腦,運(yùn)行如下命令,查看游戲手柄是否被識別,js0即為手柄端口,查看端口號結(jié)果如圖。$ls/dev/input查看端口號7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)使用如下命令檢查它是否工作,其中jstest是虛擬搖桿工具:$sudojstest/dev/input/js0得到以下輸出,說明游戲手柄正常工作,微軟X-BOX360手柄有8個軸向輸入和11個按鈕,操作手柄上的搖桿或按鈕將會發(fā)生相應(yīng)數(shù)值變化,如圖所示:軟件基礎(chǔ)查看手柄數(shù)據(jù)7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)軟件基礎(chǔ)當(dāng)確定好游戲手柄能夠正常工作以后,使用joy和joy_node功能包測試它的功能。輸入如下命令并得到以下輸出,說明所有配置都是正確的,節(jié)點(diǎn)運(yùn)行結(jié)果如圖所示:$roscore$rosrunjoyjoy_node我們可以通過如下命令查看joy話題發(fā)布的消息,話題/joy內(nèi)容如圖所示:$rostopicecho/joy話題/joy內(nèi)容查看手柄數(shù)據(jù)7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)
通過以下命令查看Joy類型的消息,Joy類型消息如圖所示:$rostopictype/joy$rosmsgshowsensor_msgs/Joy軟件基礎(chǔ)查看話題類型7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)通過如下命令啟動仿真小海龜,運(yùn)行小海龜節(jié)點(diǎn)如圖所示,小海龜界面如圖所示:$rosrunturtlesimturtlesim_node軟件基礎(chǔ)運(yùn)行節(jié)點(diǎn)結(jié)果圖小海龜界面7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)通過rostopiclist命令查看所有話題,其中/turtle1/cmd_vel是控制小海龜移動的話題,我們可以通過rostopictype命令查看其消息類型:通過如下指令查看geometry_msgs/Twist消息類型$rosmsgshowgeometry_msgs/Twist查看話題類型geometry_msgs/Twist消息類型其中,linear代表三個方向上的線速度,angular代表三個方向的角速度。7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)在serialport/src文件夾下創(chuàng)建一個新的文件xbox_remote.cpp,并填入以下內(nèi)容:$catkin_create_pkgserialportroscpprospystd_msgsserial在serialport/src文件夾下創(chuàng)建名為infrared_remote.cpp的文件,并填入以下代碼:#include<ros/ros.h>#include<sensor_msgs/Joy.h>#include<geometry_msgs/Twist.h>usingnamespacestd;classTeleopJoy{ public: TeleopJoy();private: voidcallBack(constsensor_msgs::Joy::ConstPtr&joy); ros::NodeHandlen; ros::Publisherpub; ros::Subscribersub; inti_velLinear,i_velAngular;};……軟件基礎(chǔ)7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋#include<ros/ros.h>#include<sensor_msgs/Joy.h>#include<geometry_msgs/Twist.h>ros/ros.h包含大部分ROS中通用的頭文件。節(jié)點(diǎn)會發(fā)布sensor_msgs/Joy和geometry_msgs/Twist類型的消息,所以需要加入包含該類型的頭文件Joy.h和Twist.h,這兩個頭文件根據(jù)Joy.msg和Twist.msg的消息結(jié)構(gòu)定義自動生成。1.頭文件部分7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋在main函數(shù)中,通過init函數(shù)初始化ros節(jié)點(diǎn),節(jié)點(diǎn)名稱為xbox_remote,該名稱在運(yùn)行的ROS中是唯一的,不允許同時存在名稱相同的兩個節(jié)點(diǎn)。同時創(chuàng)建TeleopJoy類的一個實例:teleop_turtle,實現(xiàn)遙控器數(shù)據(jù)的接收和小海龜控制消息的發(fā)布。2.主函數(shù)部分intmain(intargc,char**argv){ ros::init(argc,argv,"xbox_remote"); TeleopJoyteleop_turtle; ros::spin()}7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋在TeleopJoy()的類中,創(chuàng)建了一個節(jié)點(diǎn)句柄,用于使用和管理節(jié)點(diǎn)資源。同時定義了回調(diào)函數(shù)、線速度變量和角速度變量、發(fā)布者和訂閱者。3.類和函數(shù)部分classTeleopJoy{public:TeleopJoy();private:voidcallBack(constsensor_msgs::Joy::ConstPtr&joy);ros::NodeHandlen;ros::Publisherpub;ros::Subscribersub;inti_velLinear,i_velAngular;};7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋在構(gòu)造函數(shù)中,對參數(shù)進(jìn)行初始化。線速度和角速度通過參數(shù)服務(wù)器獲取變量的值。發(fā)布者pub向話題/turtle1/cmd_vel中發(fā)布Twist類型的消息,緩存區(qū)大小為1。訂閱者sub通過名為joy的話題接收sensor_msgs::Joy類型的消息數(shù)據(jù),緩存區(qū)大小為10,其中TeleopJoy::callBack為需要執(zhí)行的回調(diào)函數(shù)。3.類和函數(shù)部分TeleopJoy::TeleopJoy(){ n.param("axis_linear",i_velLinear,i_velLinear); n.param("axis_angular",i_velAngular,i_velAngular); pub=n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1); sub=n.subscribe<sensor_msgs::Joy>("joy",10,&TeleopJoy::callBack,this);}7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)代碼解釋回調(diào)函數(shù)是訂閱節(jié)點(diǎn)接收消息的基礎(chǔ)機(jī)制,當(dāng)話題收到消息時會自動以消息指針作為參數(shù),調(diào)用回調(diào)函數(shù),完成對消息內(nèi)容的處理。如上,我們在回調(diào)函數(shù)中創(chuàng)建一個geometry_msgs::Twist類型的變量vel,用于存儲需要發(fā)布的線速度和角速度數(shù)據(jù)。當(dāng)接收到Xbox手柄的軸向角速度和線速度時,更新vel中對應(yīng)的值。最后,通過調(diào)用publish函數(shù)將消息發(fā)布出去。4.回調(diào)函數(shù)部分voidTeleopJoy::callBack(constsensor-msgs::Joy::ConstPtr&joy){ geometry_msgs::Twistvel; vel.angular.z=joy->axes[i_velAngular]; vel.linear.x=joy->axes[i_velLinear]; pub.publish(vel);}7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)編譯功能包打開功能包中的CMakeLists.txt文件,并添加如下內(nèi)容:add_executable(xbox_remotesrc/xbox_remote.cpp)
target_link_libraries(xbox_remote${catkin_LIBRARIES})修改完成之后,在工作空間中進(jìn)行編譯:$cd~/catkin_ws
$catkin_make7.1.2游戲手柄控制小海龜運(yùn)動機(jī)器人操作系統(tǒng)(ROS)我們創(chuàng)建一個xbox_remote.launch的啟動文件,為參數(shù)服務(wù)器聲明一些變量,并同時啟動turtlesim、joy和xbox_remote三個節(jié)點(diǎn)。創(chuàng)建啟動文件<launch> <nodename="sim"pkg="turtlesim"type="turtlesim_node"/> <nodename="xbox_remote"pkg="serialport"type="example1"/> <paramname="axis_linear"value="1"type="int"/> <paramname="axis_angular"value="0"type="int"/>
<noderespawn="true"pkg="joy"type="joy_node"name="teleo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZHAQ 8-2024 小葉牛大力種植技術(shù)規(guī)程
- 二零二五年度應(yīng)屆大學(xué)生人力資源實習(xí)合同
- 二零二五年度股票投資風(fēng)險控制與合規(guī)監(jiān)督協(xié)議
- 二零二五年度個人債權(quán)轉(zhuǎn)讓協(xié)議書(關(guān)于專利權(quán)轉(zhuǎn)讓)
- 高管二零二五年度勞動合同及離職交接程序
- 二零二五年度路橋工程土地征用與拆遷合同
- 美容院合伙人投資回報與風(fēng)險控制協(xié)議書(2025年度)
- 2025年度金融借款合同違約起訴流程及費(fèi)用結(jié)算合同
- 2025年度餐飲企業(yè)跨界合作合伙經(jīng)營合同
- 2025年度租房押金保險產(chǎn)品推廣合同
- (正式版)CB∕T 4548-2024 船舶行業(yè)企業(yè)相關(guān)方安全管理要求
- 部編版八年級物理(上冊)期末試卷(帶答案)
- 《衡水內(nèi)畫》課程標(biāo)準(zhǔn)
- DB32T 4400-2022《飲用水次氯酸鈉消毒技術(shù)規(guī)程》
- 化學(xué)品(氬氣+二氧化碳混合氣)安全技術(shù)使用說明書
- 煤層氣開發(fā)-第2章-煤層氣地質(zhì)
- 美羅華(利妥昔單抗)課件
- 稅務(wù)簡易注銷課件
- 人教版五年級數(shù)學(xué)下冊第六單元分層作業(yè)設(shè)計
- 肺葉切除術(shù)和全肺切除術(shù)的麻醉課件
- 智能制造在食品加工業(yè)的應(yīng)用
評論
0/150
提交評論