《鴻蒙機(jī)器人編程》實訓(xùn)指南_第1頁
《鴻蒙機(jī)器人編程》實訓(xùn)指南_第2頁
《鴻蒙機(jī)器人編程》實訓(xùn)指南_第3頁
《鴻蒙機(jī)器人編程》實訓(xùn)指南_第4頁
《鴻蒙機(jī)器人編程》實訓(xùn)指南_第5頁
已閱讀5頁,還剩105頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

從0到1搭建ROS環(huán)境課程內(nèi)容: 本節(jié)將從安裝Ubuntu開始從0到1逐步安裝及搭建好ROS環(huán)境教學(xué)目標(biāo):掌握如何安裝Ubuntu系統(tǒng)掌握如何安裝及搭建ROS環(huán)境一.安裝Ubuntu注意!>/etc/apt/sources.list.d/ros-latest.list'或來自國內(nèi)清華的安裝源:$sudosh-c'./etc/lsb-release&&echo"deb/ros/ubuntu/`lsb_release-cs`main">/etc/apt/sources.list.d/ros-latest.list'或來自國內(nèi)中科大的安裝源:$sudosh-c'./etc/lsb-release&&echo"deb/ros/ubuntu/`lsb_release-cs`main">/etc/apt/sources.list.d/ros-latest.list'第三步:設(shè)置Key這一步是為了確認(rèn)原始的代碼是正確的,并且沒有人在未經(jīng)所有者授權(quán)的情況下修改任何程序代碼。通常情況下,當(dāng)添加完軟件庫時,你就已經(jīng)添加了軟件庫的密鑰,并將其添加到操作系統(tǒng)的可信任列表中。$sudoaptinstallcurl$curl-s/ros/rosdistro/master/ros.asc|sudoapt-keyadd-現(xiàn)在我們能夠確定代碼來自授權(quán)網(wǎng)站并且沒有被修改。第四步:安裝ROS1.安裝現(xiàn)在準(zhǔn)備開始安裝ROS。在開始之前最好先升級一下軟件,避免錯誤的庫版本或軟件版本產(chǎn)生各種問題。輸入以下命令升級該軟件:$sudoapt-getupdateROS非常大,相關(guān)功能包非常多,根據(jù)不同用途,提供了三種安裝方式:1)完全版安裝最簡單的安裝方式(并且是推薦的安裝方式,但你需要足夠大的硬盤空間)就是桌面完整安裝(desktop-full)。這將安裝ROS、rqt工具箱、rviz可視化環(huán)境(3D)、通用機(jī)器人庫、2D(如stage)和3D(如gazebo)仿真環(huán)境、導(dǎo)航工功能包集(移動、定位、地圖繪制、機(jī)械臂控制),以及其他感知庫,如視覺、激光雷達(dá)和RGBD攝像頭(深度攝像頭):$sudoaptinstallros-noetic-desktop-full2)桌面版安裝如果你沒有足夠的硬盤空間,或更喜歡安裝特定部分的功能包集,那么第一次安裝可以僅安裝桌面安裝文件,包括ROS、rqt工具箱、rviz和其他通用機(jī)器人庫。之后在需要的時候,再安裝其他功能包集(使用apt命令并查找ros-noetic-*功能包集):$sudoaptinstallros-noetic-desktop3)基礎(chǔ)版安裝如果你只是想嘗試一下,請安裝ROS-base。ROS-base通常直接安裝在機(jī)器人上,尤其是機(jī)器人沒有屏幕和人機(jī)界面,只能TTY遠(yuǎn)程登錄的情況下。它只安裝ROS的編譯和通信包,而沒有任何的GUI工具。在BeagleBoneBlack(BBB)中,你將使用下面命令:$sudoaptinstallros-noetic-ros-base2.配置環(huán)境若安裝過程中沒有報錯,那么恭喜你!說明你已經(jīng)成功安裝ROS!原理上,你已經(jīng)可以使用ROS相關(guān)的功能了。但為了方便使用ROS相應(yīng)的可執(zhí)行程序或命令,即為了讓系統(tǒng)知道可執(zhí)行或二進(jìn)制文件以及其他命令的位置,通常需要進(jìn)行環(huán)境變量的設(shè)置。具體在終端運(yùn)行如下腳本:$source/opt/ros/noetic/setup.bash如果你安裝了多個ROS版本,可將上面的noetic替換成你想要使用的版本。注意:每個需要使用ROS命令的終端,都需要手動運(yùn)行上面的腳本。如果你在命令行中輸入roscore,那么將看到有程序啟動。這是用來測試是否完成ROS安裝以及是否正確安裝最好的方法。.bashrc文件在用戶的home文件夾下(/home/USERNAME/.bashrc)。每次用戶打開終端,這個文件會加載命令行或終端的配置。所以你可以添加命令或進(jìn)行配置以方便用戶使用。出于這個原因,我們將在.bashrc文件結(jié)束時添加腳本,以避免我們每次打開一個新終端時都要重復(fù)輸入命令。我們用下面命令:$echo"source/opt/ros/noetic/setup.bash">>~/.bashrc如果要使配置生效,你必須使用下面的命令去執(zhí)行這個文件,或關(guān)閉當(dāng)前終端,打開另一個新終端:$source~/.bashrc一些用戶需要在他們的系統(tǒng)中安裝不止一個ROS的發(fā)行版。由于每次調(diào)用腳本都會覆蓋系統(tǒng)當(dāng)前配置,所以~/.bashrc只能設(shè)置你正在使用的那一個版本的setup.bash。為了實現(xiàn)在幾個發(fā)行版之間切換,你需要調(diào)用不同的setup.bash腳本。例如,在.bashrc文件下面可能有這么幾行代碼:…source/opt/ros/indigo/setup.bashsource/opt/ros/jade/setup.bashsource/opt/ros/kinetic/setup.bashsource/opt/ros/melodic/setup.bashsource/opt/ros/noetic/setup.bash在這種情況下,ROSMelodic版本將被執(zhí)行。所以你必須確保將要運(yùn)行的版本是文件中的最后一個,建議只導(dǎo)入單獨一個setup.bash。如果你想通過終端檢查使用的版本,可以非常簡單地使用以下命令。$echo$ROS_DISTRO如果一切正常,你會在終端中看到以下內(nèi)容。3.安裝ROS指定功能包額外功能包安裝無論你選擇哪一個選項進(jìn)行安裝,你都可以獨立安裝特定的ROS功能包集(將PACKAGE替換成給定功能包集的名稱):$sudoaptinstallros-noetic-PACKAGE4.安裝rosinstall到目前為止,你已經(jīng)安裝了運(yùn)行核心ROS包所需的內(nèi)容。為了創(chuàng)建忽然管理自己的ROS工作區(qū),有各種各樣色工作和需求。例如:rosinstall是一個經(jīng)常使用命令行工具,他使你能夠輕松地從一個命令下載許多ROS包的源樹。要安裝這個工具和其他構(gòu)建ROS包的依賴項,請運(yùn)行:$sudoaptinstallpython3-rosdeppython3-rosinstallpython3-rosinstall-generatorpython3-wstoolbuild-essential5.安裝rosdep在使用ROS之前,必須先安裝和初始化rosdep命令行工具。這可以使你輕松地安裝庫和編譯源代碼時的系統(tǒng)依賴,來運(yùn)行在ROS中的一些核心組件。你必須安裝完ROS后再使用rosdep,因為它是一個獨立的工具。現(xiàn)在rosdep默認(rèn)安裝在ROS中。你可以使用下面的命令安裝和初始化rosdep:$sudoaptinstallpython3-rosdep$sudorosdepinit$rosdepupdate

運(yùn)行第一個ROS程序課程內(nèi)容: 本節(jié)將啟動turtlesim小烏龜程序,通過本章內(nèi)容,可了解啟動ROS程序的命令,以及熟悉啟動ROS程序的流程。教學(xué)目標(biāo):熟悉啟動ROS程序流程掌握ROS常用命令掌握rqt工具的使用一.turtlesim小烏龜仿真程序這是一個經(jīng)常被用來展示ROS程序特點的小例子。安裝ROS通常就已經(jīng)自帶了turtlesim這個程序,如果沒有,可通過下面的命令進(jìn)行安裝:$sudoapt-getinstallros-noetic-turtlesim啟動ROS管理器:roscore打開一個終端,輸入以下命令:$roscoreroscore將啟動:aROS

MasteraROS

ParameterServera

rosout

loggingnode運(yùn)行功能包:rosrun打開一個新的終端,并輸入以下命令啟動turtlesimdemo。$rosrunturtlesimturtlesim_node(語法:rosrun<package><executable>)turtlesim就是一個功能包,這個功能包下面會有一個可執(zhí)行的程序就是這個可執(zhí)行程序的名字。可執(zhí)行程序的文件名就是turtlesimnode。所以這句話的意思就是rosrun就是說我要啟動啟動turtlesim這個包下面的node節(jié)點。查看話題:rostopiclist顯示ROS節(jié)點所發(fā)布的所有話題。$rostopiclist我們把這個當(dāng)前啟動起來機(jī)械系統(tǒng)的這個話題用rostopiclist這樣一個命令列出來。發(fā)送單個話題:rostopicpubpub就是要用這個工具來去發(fā)送消息,所以這個pub就是publish的縮寫,就是發(fā)送消息。目的:讓海龜以0.2m/s爬行。方法:發(fā)布cmd_velmessage給/turtle1/cmd_vel的x:完整命令$rostopicpub/turtle1/cmd_velgeometry_msgs/Twist'{linear:{x:0.2,y:0,z:0},angular:{x:0,y:0,z:0}}'簡化命令$rostopicpub/turtle1/cmd_velgeometry_msgs/Twist'{linear:{x:0.2}}'速度消息分成兩部分一部分是線速度,就是linear;angular是角速度。我們用xyz這三個軸上的向量來去描述速度。x這個朝向的話,就是他正前方速度是0.2米每秒。在他側(cè)向沒有速度。在z軸就是在垂直方向也是沒有速度的。那么這樣的話就描述了線速度。角速度同樣就是說繞著這個小烏龜?shù)哪膫€軸來去轉(zhuǎn)動的這個角速度。通過這樣一個命令就可以讓這個小烏龜以0.2米每秒這個速度來去爬行了。這個命令實際上是可以簡化成下面的msgs。連續(xù)自動發(fā)送給話題:rostopicpub如果我想循環(huán)的發(fā)送同樣的這個消息,比如說我想讓他這個持續(xù)的發(fā)送這個消息就用到了下面的這個參數(shù)。參量:-r單位Hz(defaultis10Hz)。例如讓海龜連續(xù)轉(zhuǎn)圈圈:$rostopicpub/turtle1/cmd_vel-r10geometry_msgs/Twist'{linear:{x:0.2,y:0,z:0},angular:{x:0,y:0,z:0.5}}'發(fā)送一個既有線速度也有角速度的這樣一個速度,他就轉(zhuǎn)圈圈了。我們速度消息的這個軟件總線上發(fā)。以10赫茲的頻率來發(fā)送這個消息。這個消息類型跟前面的這個消息類型一致,linear跟前面這個是一樣的。這里面多了一個角速度就是繞著Z軸0.5弧度每秒這樣一個速度來去做角速度,那么這樣話他就會就會轉(zhuǎn)圈圈了。讓海龜轉(zhuǎn)起來消息格式定義:rosmsg使用rosmsg工具查看geometry_msgs/Twist消息格式定義$rosmsgshowgeometry_msgs/Twist這個消息分成兩部分:一部分是linear,一部分是這個angular。linear是一個向量,這個向量的每一個分量是三個浮點數(shù);angular這個向量也是3個浮點數(shù)。記錄ROSTopic:rosbagrecord記錄所有topic(-a):$rosbagrecord-a-Ocmd_vel_record-a是把所有的topic都給記錄下來,-O是把數(shù)據(jù)都記錄下來,存儲到cmd_velrecord這樣一個文件里面。在同一終端按Ctrl+C結(jié)束記錄。回放cmd_vel_record.bag(先Ctrl+C停止原來轉(zhuǎn)圈命令的topic發(fā)布)。$rosbagplaycmd_vel_record.bag你會發(fā)現(xiàn)海龜會像先前的記錄裝態(tài)重新轉(zhuǎn)起來!使用rqt_graph打開rqt_graph:$rqt_graph剛才我們說了rosrun啟動個turtlesim這個程序之后,實際上就是啟動了一個機(jī)器人系統(tǒng)。相當(dāng)于啟動了機(jī)械系統(tǒng)。那么這個機(jī)械系統(tǒng)他都有哪些節(jié)點,這些節(jié)點之間是通過哪些話題來去通信的。我們可以用rqtgraph可以看到數(shù)據(jù)在幾個node之間的傳遞。用rqtgraph就可以把前面說這個計算圖給呈現(xiàn)出來使用ROSservice可使用rosservice命令調(diào)用一只新的海龜:$rosservicecall/spawn'{x:1.0,y:1.0,theta:1.0,name:''}'也可使用rqt中的servicecaller:$rqt在rqt窗口的工具欄選擇Plugins->Services->ServiceCallerService欄選中/spawn

實踐課-動手編譯及運(yùn)行第一個ROS程序課程內(nèi)容:本節(jié)將對Turtlesim功能包進(jìn)行簡單解讀,了解功能包結(jié)構(gòu),創(chuàng)建及編譯工作空間,了解launch文件作用及roslaunch命令使用。教學(xué)目標(biāo):了解Turtlesim功能包結(jié)構(gòu)掌握工作空間運(yùn)行機(jī)制掌握launch文件使用一.功能包解析1.Turtlesim功能包結(jié)構(gòu)Turtlesim功能包下主要有images、include、launch、msg、srv、src、tutorials活頁夾及CMakeLists.txt和package.xml文件。Images--海龜圖片,用于程序加載和顯示Include--功能包頭文件launch--啟動的配置文件msg、srv--topic和service的數(shù)據(jù)類型定義文件src--海龜繪制的源代碼文件tutorials--控制海龜運(yùn)動的源代碼文件功能包共有四個node:turtlesim_node:用來繪制窗口及turtlesim,并通過topic和service提供了控制turtlesim的相關(guān)接口;teleop_turtle_key:利用turtlesim的相關(guān)接口用鍵盤控制turtlesim的運(yùn)動;draw_square:利用相關(guān)接口控制turtlesim給出矩形軌跡;mimic:提供了復(fù)制海龜運(yùn)動的接口。后三個node是控制turtlesim的三種方式示例,放在tutorials文件夾。2.核心代碼簡單解讀①TurtleApp類節(jié)點turtlesim_node的入口在turtlesim.cpp中,通過QApplication的繼承類TurtleApp實現(xiàn)QT程序的初始化,并完成了node的初始化;創(chuàng)建TurtleFrame對象,顯示窗口;最后通過QApplication::exec()進(jìn)入事件循環(huán)。node的實例化使用了boost的智能指針,因為在包含檔turtle_frame.h中已經(jīng)進(jìn)行了對NodeHandle實例化,所以此處使用了reset(),以保證智能指針的正常自動銷毀。使用智能指針保證了NodeHandle同一實例對象在TurtleFrame類中的正常使用。具體代碼如下:②TurtleFrame類TurtleFrame繼承自QFrame類,實現(xiàn)有框架的窗口部件。其主要作用是窗口部件與事件管理、海龜圖片加載顯示。它提供了clear、reset、spawn、kill四個service用來提供海龜?shù)纳膳c銷毀等操作調(diào)用接口。clearCallback通過調(diào)用clear函數(shù),用預(yù)定的背景色重繪窗口。但并未對海龜圖片作任何操作,也就是說只重置背景及清除海龜運(yùn)動軌跡。實現(xiàn)如下:resetCallback先清空存放海龜對象的map,再重新生成海龜,最后調(diào)用clear函數(shù)。實現(xiàn)如下:spawnCallback通過spawnTurtle函數(shù)以服務(wù)調(diào)用請求的位置、朝向及名字參數(shù)生成海龜。此處會對海龜命名重名給出出錯提示。實現(xiàn)如下:killCallback就是刪除指定名的海龜,實際是通過key清除存放海龜對象map的相應(yīng)條目,調(diào)用update()實現(xiàn)重繪。實現(xiàn)如下:QT繪制事件及ROS事件QT繪制事件通過update()手動觸發(fā)或窗口變動自動觸發(fā),然后通過重寫的paintEvent虛函數(shù)槽實現(xiàn)繪制。實現(xiàn)如下:ROS事件通過QT的信號槽機(jī)制以16ms為周期進(jìn)行,用onupdate()函數(shù)槽實現(xiàn)。③Turtle類實際上海龜?shù)倪\(yùn)動是通過海龜圖片的平移與旋轉(zhuǎn)實現(xiàn)的。具體代碼在Turtle類中,共有一個訂閱的TOPIC、兩個發(fā)布的TOPIC及三個SERVICE。訂閱的TOPIC為:cmd_velcmd_vel:訂閱海龜控制的速度信息發(fā)布的TOPIC為:pose、color_sensorpose:發(fā)布海龜?shù)奈恢谩⒊颉⒓熬€速度和角速度color_sensor:發(fā)布海龜?shù)讓拥念伾齻€服務(wù)為:set_pen、teleport_relative、teleport_absoluteset_pen:為設(shè)置畫筆顏色及寬度的服務(wù)接口teleport_relative:以相對位置控制海龜運(yùn)動teleport_absolute:以絕對位置控制海龜運(yùn)動turtle對象創(chuàng)建中,同時以生成的海龜名為參數(shù)對NodeHandle進(jìn)行了實例化,所以上面提到的發(fā)布的TOPIC及提供的SERVICE都是有海龜名這個命名空間的。二.創(chuàng)建及編譯工作空間$mkdir-pcatkin_ws/src在終端上,利用cd命令進(jìn)入工作空間,然后用catkin_make編譯。$cd~/catkin_ws

$catkin_make或$cd~/catkin_ws$catkin_make-DCATKIN_WHITELIST_PACKAGES=“turtlesim”1.將項目源代碼中的turtlesim功能包復(fù)制到工作空間的src目錄下2.編譯turtlesim功能包$cd~/catkin_ws

$catkin_make3.新建終端,運(yùn)行roscore$roscore4.動手運(yùn)行ROS節(jié)點,控制小烏龜運(yùn)動運(yùn)行小烏龜節(jié)點$sourcedevel/setup.bash$rosrunturtlesimturtlesim_node查看發(fā)布的TOPIC及其數(shù)據(jù)和提供的服務(wù),rostopic和rosservice工具$rostopiclist讓海龜作圓周運(yùn)動(可使用rqt工具):$rostopicpub-r10/turtle1/cmd_velgeometry_msgs/Twist'{linear:{x:0.2,y:0,z:0},angular:{x:0,y:0,z:0.3}}'生成新的海龜(可使用rqt工具):$roservicecallspawn330myturtle啟動鍵盤控制:$rosrunturtlesimturtle_teleop_key5.查看launch文件,運(yùn)行roslaunch啟動launch文件:$roslaunchturtlesimmultisim.launch啟動launch文件后,可通過一個鍵盤控制兩只啟動的小烏龜(鍵盤控制其中一只小烏龜,另一只小烏龜模仿其運(yùn)動)。下圖示例是用鍵盤控制小烏龜,也可以通過其它控制方式,如TOPIC工具。此處要體驗一下命名空間的作用。

建造自己機(jī)器人的3D模型課程內(nèi)容: 本節(jié)主要介紹機(jī)器人仿真的相關(guān)內(nèi)容,結(jié)合Rviz和Gazebo進(jìn)行集成使用教學(xué)目標(biāo):掌握在Rviz中顯示機(jī)器人模型掌握在Gazebo中顯示機(jī)器人模型掌握如何在Gazebo中控制機(jī)器人運(yùn)動一.在Rviz中顯示機(jī)器人模型實現(xiàn)流程:第一步(準(zhǔn)備):新建功能包,導(dǎo)入依賴第二步(核心):編寫urdf文件第三步(核心):在launch文件集成URDF與RViz第四步(結(jié)果):在RViz中顯示機(jī)器人模型1.新建功能包首先進(jìn)入工作空間catkin_ws的src目錄下,創(chuàng)建名為“spark_description”的功能包,并為其導(dǎo)入相關(guān)依賴$cdcatkin_ws/src/$catkin_create_pkgspark_descriptionroscpprospyurdftfgeometry_msgsstd_msgs2.編寫urdf文件(用urdf構(gòu)建一臺極簡的spark機(jī)器人模型)①進(jìn)入spark_description功能包,創(chuàng)建urdf文件夾,用于存放urdf文件。$cdspark_description$mkdirurdf②導(dǎo)入機(jī)器人模型素材,在項目源代碼中將meshes文件夾復(fù)制到此功能包下項目源碼路徑:復(fù)制到創(chuàng)建的功能包下:③創(chuàng)建urdf文件(spark_description_simple.urdf)將項目源代碼中的spak_description_simple.urdf文件復(fù)制到urdf文件夾下我們首先創(chuàng)建一個urdf文件去描述一臺極簡的spark機(jī)器人,用robot標(biāo)簽將機(jī)器人各部分包含進(jìn)來。起名為sparkbase,每部分用link標(biāo)簽去表示,分別用joint將各部分連接。下面是詳細(xì)代碼:<robotname="spark_base"> <linkname="base_footprint"/> <linkname="base_link"> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </visual> </link> <jointname="base_joint"type="fixed"> <origin xyz="000.01" rpy="000"/> <parentlink="base_footprint"/> <childlink="base_link"/> </joint> <linkname="left_wheel_link"> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </visual> </link> <jointname="left_wheel_joint"type="continuous"> <origin xyz="0-0.1310.024" rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="left_wheel_link"/> </joint> <linkname="right_wheel_link"> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </visual> </link> <jointname="right_wheel_joint"type="continuous"> <origin xyz="00.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="right_wheel_link"/> </joint> <linkname="spark_stack"><visual><origin xyz="000"rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></visual></link><jointname="spark_stack_joint"type="fixed"><origin xyz="000" rpy="000"/><parentlink="base_link"/><childlink="spark_stack"/></joint></robot>3.在launch文件集成URDF與RViz①創(chuàng)建launch文件夾,用于存放launch文件$mkdirlaunch$cdlaunch②創(chuàng)建launch文件將項目源代碼中的spark_description_simple.launch文件復(fù)制到此launch文件夾中③導(dǎo)入Rviz環(huán)境,將項目源代碼中的rviz文件夾復(fù)制到功能包下用urdf文件描述出機(jī)器人的基本信息后,我們就可以在rviz里面通過launch文件來啟動它。launch文件中,根標(biāo)簽就是launch,然后定義幾個在launch文件里面用到的參數(shù)。model就是機(jī)器人的模型描述文件;usegui表示是否使用gui;publishdefaultpositions表示是否發(fā)布這個位置信息。然后我們用一個param標(biāo)簽來將model上傳到參數(shù)服務(wù)器,命名為robotdescription。launch文件的具體編寫如下:<launch><argname="model"default="$(findspark_description)/urdf/teaching/spark_description_simple.urdf"/><argname="use_gui"default="false"/><argname="publish_default_positions"default="true"/><paramname="robot_description"command="$(findxacro)/xacro$(argmodel)"/><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"> <paramname="use_gui"value="$(arguse_gui)"/> <paramname="publish_default_positions"value="$(argpublish_default_positions)"/> <rosparamparam="source_list">["wheel_states"]</rosparam></node><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"/><nodepkg="rviz"type="rviz"name="rviz"args="-d$(findurdf_demo_rviz)/config/urdf.rviz"/></launch>4.在RViz中顯示機(jī)器人模型用下列命令,啟動構(gòu)造好的spark機(jī)器人:$cdcatkin_ws$sourcedevel/setup.bash$roslaunchspark_descriptionspark_description_simple.launch下面是運(yùn)行界面截圖:二.在Gazebo中顯示機(jī)器人模型實現(xiàn)流程:第一步(核心):編寫urdf文件第二步(核心):編寫launch文件第三步(結(jié)果):在Gazebo中顯示機(jī)器人模型1.編寫urdf文件將項目源代碼中的spark_description_gazebo_simple.urdf文件復(fù)制到此urdf文件夾中如何修改上面的urdf文件使機(jī)器人在Gazebo中顯示?必須步驟

:在每一個<link>內(nèi)添加<inertia>標(biāo)簽。可選步驟

:在每一個<link>內(nèi)添加<gazebo>標(biāo)簽。將外觀顏色轉(zhuǎn)換成Gazebo格式;將stl文件轉(zhuǎn)換成dae文件,獲得更好的渲染效果;添加傳感器插件。在<robot>標(biāo)簽內(nèi)添加<gazebo>。為了防止機(jī)器人陷入障礙物,我們增加了碰撞模型標(biāo)簽。此標(biāo)簽設(shè)置了碰撞模型的位置、姿態(tài)以及碰撞幾何體,以便機(jī)器人能夠進(jìn)行碰撞檢測。具體代碼如下:<robotname="spark"> <linkname="base_footprint"/> <linkname="base_link"> <inertial> <origin xyz="000"rpy="000"/> <mass value="0.916261377"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </collision> </link> <jointname="base_joint"type="fixed"> <origin xyz="000.01" rpy="000"/> <parentlink="base_footprint"/> <childlink="base_link"/> </joint> <linkname="left_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </collision> </link> <jointname="left_wheel_joint"type="continuous"> <origin xyz="0-0.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="left_wheel_link"/> </joint> <linkname="right_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </collision> </link> <jointname="right_wheel_joint"type="continuous"> <origin xyz="00.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="right_wheel_link"/> </joint><linkname="spark_stack"><inertial><origin xyz="000" rpy="000"/><massvalue="0.224592038"/><inertiaixx="0.052467491"ixy="-0.000000000"ixz="0.001956704"iyy="0.055610919"iyz="0.000000000"izz="0.012118046"/></inertial><visual><origin xyz="000" rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></visual><collision><originxyz="000"rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></collision></link><jointname="spark_stack_joint"type="fixed"><origin xyz="000" rpy="000"/><parentlink="base_link"/><childlink="spark_stack"/></joint><transmissionname="tran1"><type>transmission_interface/SimpleTransmission</type><jointname="left_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor1"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission><transmissionname="tran2"><type>transmission_interface/SimpleTransmission</type><jointname="right_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor2"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>-1</mechanicalReduction></actuator></transmission><gazebo><pluginname="gazebo_ros_control"filename="libgazebo_ros_control.so"><robotNamespace>/</robotNamespace><robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType></plugin></gazebo> </robot>2.編寫launch文件將項目源代碼中的spark_gazebo_simple.launch文件復(fù)制到此launch文件夾中具體代碼如下:<launch><!--thesearetheargumentsyoucanpassthislaunchfile,forexamplepaused:=true--><argname="paused"default="false"/><argname="use_sim_time"default="true"/><argname="gui"default="true"/><argname="headless"default="false"/><argname="debug"default="false"/><!--Weresumethelogicinempty_world.launch--><includefile="$(findgazebo_ros)/launch/empty_world.launch"><argname="debug"value="$(argdebug)"/><argname="gui"value="$(arggui)"/><argname="paused"value="$(argpaused)"/><argname="use_sim_time"value="$(arguse_sim_time)"/><argname="headless"value="$(argheadless)"/></include><!--urdfxmlrobotdescriptionloadedontheParameterServer--><paramname="robot_description"command="$(findxacro)/xacro'$(findspark_description)/urdf/teaching/spark_description_gazebo_simple.urdf'"/><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"></node><!--Startingrobotstatepublishwhichwillpublishtf--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"output="screen"><paramname="publish_frequency"type="double"value="50.0"/></node><!--Runapythonscripttothesendaservicecalltogazebo_rostospawnaURDFrobot--><nodename="urdf_spawner"pkg="gazebo_ros"type="spawn_model"respawn="false"output="screen" args="-urdf-modelspark-paramrobot_description"/></launch>3.在Gazebo中顯示機(jī)器人模型用下列命令,將spark機(jī)器人模型加載到gazebo:$cdcatkin_ws$sourcedevel/setup.bash$roslaunchspark_descriptionspark_gazebo_simple.launch下面是運(yùn)行界面截圖:三.在gazebo中實現(xiàn)spark機(jī)器人的運(yùn)動仿真實現(xiàn)流程:第一步(核心):編寫urdf文件第二步(核心):創(chuàng)建控制器配置文件第三步(核心):編寫launch文件第四步(結(jié)果):啟動Gazebo并發(fā)布spark_controller/cmd_vel消息控制機(jī)器人運(yùn)動1.編寫urdf文件將項目源代碼中的spark_description_gazebo.urdf文件復(fù)制到此urdf文件夾中如何修改上面的urdf文件使機(jī)器人在Gazebo中實現(xiàn)運(yùn)動控制?必須步驟

:向URDF文件中的joint添加<transmission>標(biāo)簽。向URDF文件中添加ros_control插件,并添加相應(yīng)插件的controller配置文件。可選步驟:

在每一個<link>內(nèi)添加<gazebo>標(biāo)簽。將外觀顏色轉(zhuǎn)換成Gazebo格式;將stl文件轉(zhuǎn)換成dae文件,獲得更好的渲染效果;添加傳感器插件。在每一個<joint>內(nèi)添加<gazebo>標(biāo)簽。設(shè)置適當(dāng)?shù)淖枘釀恿ο禂?shù);添加執(zhí)行器控制插件。在<robot>標(biāo)簽內(nèi)添加<gazebo>。為了完成傳動所描述的這種動力驅(qū)動,我們需要加載roscontrol這個插件。這里我們用到了gazebo里面的一個插件libgazeboroscontrol。首先要在這個gazebo標(biāo)簽里加上plugin插件的標(biāo)簽,連同設(shè)置了你的插件的名字、文件名。這里面還允許你設(shè)置機(jī)器人的命名空間,還有這個機(jī)器人的仿真的類型。具體代碼如下:<robotname="spark"> <linkname="base_footprint"/> <linkname="base_link"> <inertial> <origin xyz="000"rpy="000"/> <mass value="0.916261377"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/spark_base.DAE"/> </geometry> </collision> </link> <jointname="base_joint"type="fixed"> <origin xyz="000.01" rpy="000"/> <parentlink="base_footprint"/> <childlink="base_link"/> </joint> <linkname="left_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/left_wheel.DAE"/> </geometry> </collision> </link> <jointname="left_wheel_joint"type="continuous"> <origin xyz="0-0.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="left_wheel_link"/> </joint> <linkname="right_wheel_link"> <inertial> <massvalue="0.01"/> <originxyz="000"/> <inertiaixx="0.001"ixy="0.0"ixz="0.0" iyy="0.001"iyz="0.0" izz="0.001"/> </inertial> <visual> <origin xyz="000" rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </visual> <collision> <origin xyz="000"rpy="000"/> <geometry> <mesh filename="package://spark_description/meshes/spark/base/right_wheel.DAE"/> </geometry> </collision> </link> <jointname="right_wheel_joint"type="continuous"> <origin xyz="00.1310.024"rpy="000"/> <axisxyz="010"/> <parentlink="base_link"/> <childlink="right_wheel_link"/> </joint><linkname="spark_stack"><inertial><origin xyz="000" rpy="000"/><massvalue="0.224592038"/><inertiaixx="0.052467491"ixy="-0.000000000"ixz="0.001956704"iyy="0.055610919"iyz="0.000000000"izz="0.012118046"/></inertial><visual><origin xyz="000" rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></visual><collision><originxyz="000"rpy="000"/><geometry><meshfilename="package://spark_description/meshes/spark/stack/spark_stack.DAE"/></geometry></collision></link><jointname="spark_stack_joint"type="fixed"><origin xyz="000" rpy="000"/><parentlink="base_link"/><childlink="spark_stack"/></joint><transmissionname="tran1"><type>transmission_interface/SimpleTransmission</type><jointname="left_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor1"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission><transmissionname="tran2"><type>transmission_interface/SimpleTransmission</type><jointname="right_wheel_joint"><hardwareInterface>VelocityJointInterface</hardwareInterface></joint><actuatorname="motor2"><hardwareInterface>VelocityJointInterface</hardwareInterface><mechanicalReduction>-1</mechanicalReduction></actuator></transmission><gazebo><pluginname="gazebo_ros_control"filename="libgazebo_ros_control.so"><robotNamespace>/</robotNamespace><robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType></plugin></gazebo> </robot>2.創(chuàng)建控制器配置文件控制器的一些參數(shù),我們通常把它寫成一個配置文件。命名為controller.yaml①在功能包下創(chuàng)建config文件夾,用于存放配置文件$mkdirconfig$cdconfig②將項目源代碼中的controller.yaml文件復(fù)制到此config文件夾中具體代碼如下:joint_state_controller:type:joint_state_controller/JointStateControllerpublish_rate:20spark_controller:type:"diff_drive_controller/DiffDriveController"left_wheel:"left_wheel_joint"right_wheel:"right_wheel_joint"wheel_separation:0.11wheel_radius:0.04publish_rate:50.0#defaultsto50pose_covariance_diagonal:[0.001,0.001,1000000.0,1000000.0,1000000.0,1000.0]twist_covariance_diagonal:[0.001,0.001,1000000.0,1000000.0,1000000.0,1000.0]cmd_vel_timeout:20.0#wetestthisseparately,giveplentyfortheothertests我們這里面將控制器的這個參數(shù)寫到controller.yaml,然后我們用rosparam來將這些配置參數(shù)加載到參數(shù)服務(wù)器上。這里面控制器包括jointstatecontroller和sparkcontroller。3.創(chuàng)建launch文件將項目源代碼中的spark_gazebo.launch文件復(fù)制到此launch文件夾中具體代碼如下:<launch><!--urdfxmlrobotdescriptionloadedontheParameterServer--><paramname="robot_description"command="$(findxacro)/xacro'$(findspark_description)/urdf/teaching/spark_description_gazebo.urdf'"/><nodename="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher"></node><!--Startingrobotstatepublishwhichwillpublishtf--><nodename="robot_state_publisher"pkg="robot_state_publisher"type="robot_state_publisher"output="screen"><paramname="publish_frequency"type="double"value="50.0"/></node><!--thesearetheargumentsyoucanpassthislaunchfile,forexamplepaused:=true--><argname="paused"default="false"/><argname="use_sim_time"default="true"/><argname="gui"default="true"/><argname="headless"default="false"/><argname="debug"default="false"/><!--Weresumethelogicinempty_world.launch--><includefile="$(findgazebo_ros)/launch/empty_world.launch"><argname="debug"value="$(argdebug)"/><argname="gui"value="$(arggui)"/><argname="paused"value="$(argpaused)"/><argname="use_sim_time"value="$(arguse_sim_time)"/><argname="headless"value="$(argheadless)"/></include><!--Runapythonscripttothesendaservicecalltogazebo_rostospawnaURDFrobot--><nodename="urdf_spawner"pkg="gazebo_ros"type="spawn_model"respawn="false"output="screen" args="-urdf-modelspark-paramrobot_description"/><!--LoadjointcontrollerconfigurationsfromYAMLfiletoparameterserver--><rosparamfile="$(findspark_description)/config/controller.yaml"command="load"/><!--loadthecontrollers--><nodename="controller_spawner"pkg="controller_manager"type="spawner"respawn="false" output="screen"args="joint_state_controllerspark_controller"/></launch>4.啟動Gazebo并發(fā)布spark_controller/cmd_vel消息控制機(jī)器人運(yùn)動用下列命令,將spark機(jī)器人模型加載到gazebo:$cdcatkin_ws$sourcedevel/setup.bash$roslaunchspark_descriptionspark_gazebo.launch當(dāng)我們把機(jī)器人的urdf上傳到服務(wù)器上,并且把它加載到gazebo。這時,我們就可以通過/spark_controller/cmd_vel話題控制spark在gazebo中運(yùn)動了。當(dāng)然也可以添加更多功能,例如視覺傳感器等。 通過發(fā)布話題命令,控制Spark在gazebo中運(yùn)動:$rostopicpub-r10/spark_controller/cmd_velgeometry_msgs/Twist'{linear:{x:1,y:0,z:0},angular:{x:0,y:0,z:0}}'

實踐課-創(chuàng)建仿真機(jī)器人與實體機(jī)器人同步課程內(nèi)容: 本節(jié)主要介紹Arbotix控制機(jī)器人模型運(yùn)動的功能,以及操控實體機(jī)器人和仿真機(jī)器人的同步運(yùn)動。教學(xué)目標(biāo):掌握Arbotix控制機(jī)器人模型運(yùn)動掌握啟動實體機(jī)器人運(yùn)動的demo掌握操作實體機(jī)器人及仿真機(jī)器人進(jìn)行同步運(yùn)動一.控制仿真機(jī)器人運(yùn)動1.準(zhǔn)備工作先去github下載Spark的代碼:$cd~$gitclone/NXROBO/spark_noetic.git在Spark的開發(fā)包里,已經(jīng)包含了Spark的仿真啟動環(huán)境,我們先從啟動腳本入手來了解下Spark的仿真啟動內(nèi)容。launch文件路徑: spark_noetic/src/spark/spark_description/launch/spark_description_rviz.launch2.加載模型下圖是launch文件的具體內(nèi)容。<!--sparkdescriptionwithrviz--><launch><argname="camera_type_tel"default="astrapro"doc="cameratypes[asatra,astrapro,d435...]"/><argname="lidar_type_tel"defaul

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論