最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

機(jī)器人制作開(kāi)源方案 | 桌面級(jí)機(jī)械臂--仿真設(shè)計(jì)

2023-08-28 13:27 作者:機(jī)器譜  | 我要投稿

1. Ros概述

? ? ? ROS是一個(gè)適用于機(jī)器人編程的框架,這個(gè)框架把原本松散的零部件耦合在了一起,為它們提供了通信架構(gòu)。ROS雖然叫做操作系統(tǒng),但并非Windows、Mac那樣通常意義的操作系統(tǒng),它只是連接了操作系統(tǒng)和你開(kāi)發(fā)的ROS應(yīng)用程序,所以它也算是一個(gè)中間件,基于ROS的應(yīng)用程序之間建立起了溝通的橋梁,所以也是運(yùn)行在Linux上的運(yùn)行時(shí)環(huán)境,在這個(gè)環(huán)境上,機(jī)器人的感知、決策、控制算法可以更好的組織和運(yùn)行。

? ? ? 對(duì)于關(guān)鍵詞(框架、中間件、操作系統(tǒng)、運(yùn)行時(shí)環(huán)境)都可以用來(lái)描述ROS的特性,作為初學(xué)者我們不必深究這些概念,隨著你越來(lái)越多的使用ROS,就能夠體會(huì)到它的作用。

1.1 Ros文件系統(tǒng)概述

Ros作為編程框架,介于應(yīng)用程序與操作系統(tǒng)的中間件,它主要是把我們寫(xiě)的源代碼,進(jìn)行編譯、鏈接后,方便在系統(tǒng)上運(yùn)行。 Ros采用的是Catkin編譯系統(tǒng)(這里的編譯其實(shí)包含了編譯、鏈接兩個(gè)步驟)。 ? ?

Catkin編譯系統(tǒng)的工作原理

使用catkin_make編譯

當(dāng)我們寫(xiě)完代碼,執(zhí)行一次catkin_make進(jìn)行編譯,調(diào)用系統(tǒng)自動(dòng)完成編譯和鏈接過(guò)程,構(gòu)建生成目標(biāo)文件

把源文件放在文末資料中的color_experiment_ws\src路徑下(其中color_experiment_ws為工作空間),那就可以使用下面的命令進(jìn)行編譯:


編譯后,color_experiment_ws文件夾會(huì)自動(dòng)生成build、devel兩個(gè)文件(如下圖所示)。

1.2 Ros常用工具

本節(jié)內(nèi)容主要介紹了ROS開(kāi)發(fā)時(shí)常常使用的工具,分別是RVIZ、URDF、STL(可由外部導(dǎo)入)、TF、Gazebo、Moveit!, ? 這些是我們開(kāi)發(fā)時(shí)經(jīng)常用到的工具。RViz是可視化工具,是將接收到的信息呈現(xiàn)出來(lái);STL文件可以定義復(fù)雜的模型;gazebo是一種最常用的ROS仿真工具,也是目前仿真ROS效果最好的工具;rqt則是非常好用的數(shù)據(jù)流可視化工具,有了它我們可以直觀的看到消息的通信架構(gòu)和流通路徑;moveit!是目前為止應(yīng)用最廣泛的開(kāi)源操作軟件。

1.2.1 RVIZ-機(jī)器人可視化工具

在ROS開(kāi)發(fā)中,這是一個(gè)常用工具,基本上的調(diào)試和開(kāi)發(fā)都離不開(kāi)這個(gè)工具—RViZ(the Robit Visualization tool)機(jī)器人可視化工具。可視化的作用是直觀的,它極大的方便了監(jiān)控和調(diào)試等操作,這個(gè)工具將在后續(xù)實(shí)驗(yàn)中陸續(xù)用到。

RVIZ啟動(dòng)界面
RVIZ啟動(dòng)后的界面

1.2.2 URDF-機(jī)器人模型描述文件

urdf文件是機(jī)器人模型的描述文件,以.urdf結(jié)尾。它定義了機(jī)器人的連桿和關(guān)節(jié)的信息,以及它們之間的位置、角度等信息,通過(guò)urdf文件可以將機(jī)器人的物理連接信息表示出來(lái),并且可視化調(diào)試和仿真中顯示,這里簡(jiǎn)單帶大家了解一下URDF文件。

? ?? ? ?在理解urdf文件之前,我們需要先了解一種表達(dá)方式。機(jī)器人可以由link和joint進(jìn)行描述,link可以簡(jiǎn)單理解為連桿,joint可以簡(jiǎn)單理解為關(guān)節(jié)。機(jī)器人的表達(dá)除了表示link和joint數(shù)量之外,還需要對(duì)link與joint的關(guān)系進(jìn)行描述。

? ? ? 如下圖所示, 機(jī)器人由一個(gè)根link(link1)向上, 分別出現(xiàn)了兩個(gè)分支–link2和link3, 分別由joint連接link:


? ? ? 因此,典型的機(jī)器人描述如下所示,包含robot、link、joint,利用URDF文件進(jìn)行模型描述,這里URDF可以簡(jiǎn)單理解為表達(dá)上述機(jī)器人表達(dá)方式的一種xmal文件。如下所示做一個(gè)簡(jiǎn)單的格式舉例:

那么如何表達(dá)一個(gè)link呢?下面我們來(lái)看一下。

下面我們來(lái)看一下描述link的屬性和子元素:

屬性

? ? ? name(必需)

? ? ? link的名字

子元素

? ? ? <inertial> (可選)

? ? ? 連桿的慣性特性

? ? ? <origin> (可選,defaults to identity if not specified)

? ? ? 定義相對(duì)于連桿坐標(biāo)系的慣性參考系的參考坐標(biāo),該坐標(biāo)必需定義在連桿重心處,其坐標(biāo)軸可與慣性主軸不平行。

? ? ? xyz (可選,默認(rèn)為零向量)

? ? ? 表示 x,y,zx,y,zx,y,z 方向的偏置,單位為米。

? ? ? rpy(可選: defaults to identity if not specified)

? ? ? 表示坐標(biāo)軸在RPY方向上的旋轉(zhuǎn),單位為弧度。

? ? ? <mass>連桿的質(zhì)量屬性

? ? ? <inertia>

? ? ? 3×3旋轉(zhuǎn)慣性矩陣,由六個(gè)獨(dú)立的量組成:ixx, ixy, ixz, iyy, iyz, izz。

? ? ? <visual> (可選)

? ? ? 連桿的可視化屬性。用于指定連桿顯示的形狀(矩形、圓柱體等),同一連桿可以存在多個(gè)visual元素,連桿的形狀為多個(gè)元素兩個(gè)形成。一般情況下模型較為復(fù)雜可以通過(guò)soildwork繪制后生成stl調(diào)用,簡(jiǎn)單的形狀如添加末端執(zhí)行器等可以直接編寫(xiě)。同時(shí)可以在此處可根據(jù)理論模型和實(shí)際模型差距調(diào)整幾何形狀的位置。

? ? ? <namel> (可選)

? ? ? 連桿幾何形狀的名字。

? ? ? <origin> (可選,defaults to identity if not specified)

? ? ? 相對(duì)于連桿的坐標(biāo)系的幾何形狀坐標(biāo)系。

? ? ? xyz (optional: defaults to zero vector)

? ? ? 表示x,y,zx,y,zx,y,z 方向的偏置,單位為米。

? ? ? rpy (optional: defaults to identity if not specified)

? ? ? 表示坐標(biāo)軸在RPY方向上的旋轉(zhuǎn),單位為弧度。

? ? ? <geometry> (必需)

? ? ? 可視化對(duì)象的形狀,可以是下面的其中一種:

? ? ? <box>

? ? ? 矩形,元素包含長(zhǎng)、寬、高。原點(diǎn)在中心。

? ? ? <cylinder>

? ? ? -圓柱體,元素包含半徑、長(zhǎng)度。原點(diǎn)中心。

? ? ? <sphere>

? ? ? 球體,元素包含半徑。原點(diǎn)在中心。

? ? ? <mesh>

? ? ? 網(wǎng)格,由文件決定,同時(shí)提供 scale ,用于界定其邊界。推薦使用 Collada .dae 文件, 也支持.stl文件,但必須為一個(gè)本地文件。

? ? ? <material> (可選)

? ? ? 可視化組件的材料。可以在link標(biāo)簽外定義,但必需在robot標(biāo)簽內(nèi),在link標(biāo)簽外定義時(shí),需引用link的名字。

? ? ? <color>(可選)

? ? ? 顏色,由 red/green/blue/alpha 組成,大小范圍在 [0,1] 內(nèi)。

? ? ? <texture>(可選)

? ? ? 材料屬性,由文件定義。

? ? ? <collision> (可選)

? ? ? 連桿的碰撞屬性。碰撞屬性和連桿的可視化屬性不同,簡(jiǎn)單的碰撞模型經(jīng)常用來(lái)簡(jiǎn)化計(jì)算。同一個(gè)連桿可以有多個(gè)碰撞屬性標(biāo)簽,連桿的碰撞屬性表示由其定義的幾何圖形集構(gòu)成。

? ? ? name (可選)

? ? ? 指定連桿幾何形狀的名稱(chēng)

? ? ? <origin> (可選,defaults to identity if not specified)

? ? ? 碰撞組件的參考坐標(biāo)系相對(duì)于連桿坐標(biāo)系的參考坐標(biāo)系。

? ? ? xyz (可選, 默認(rèn)零向量)

? ? ? 表示x,y,zx,y,zx,y,z 方向的偏置,單位為米。

? ? ? rpy (可選, defaults to identity if not specified)

? ? ? 表示坐標(biāo)軸在RPY方向上的旋轉(zhuǎn),單位為弧度。

? ? ? <geometry>

? ? ? 與上述geometry元素描述相同

示例

下面我們來(lái)看一下描述joint的屬性和子元素:

屬性

? ? ? name (必需的)

? ? ? 指定joint的名字(唯一的)

? ? ? type (必需的)

? ? ? 指定joint的類(lèi)型,有下列選項(xiàng):

? ? ? revolute:可以繞著一個(gè)軸旋轉(zhuǎn)的鉸鏈關(guān)節(jié),有最大值和最小值限制。

? ? ? continuous:連續(xù)型的鉸鏈關(guān)節(jié),可以繞一個(gè)軸旋轉(zhuǎn),沒(méi)有最大值和最小值限制。

? ? ? prismatic:滑動(dòng)關(guān)節(jié),可以沿著一個(gè)軸滑動(dòng),有最大值和最小值限制。

? ? ? fixed:這不是一個(gè)實(shí)際的關(guān)節(jié),因?yàn)樗鼰o(wú)法運(yùn)動(dòng),所有的自由度都被鎖定。這種類(lèi)型的關(guān)節(jié)不需要指定軸、動(dòng)力學(xué)特征、標(biāo)度和最大值最小值限制。

? ? ? floating:這是一個(gè)具有6個(gè)自由度的關(guān)節(jié)。

? ? ? planar:此關(guān)節(jié)在一個(gè)平面內(nèi)運(yùn)動(dòng),垂線是運(yùn)動(dòng)軸。

子元素

? ? ? <origin> (可選,defaults to identity if not specified)

? ? ? 從parent link到child link的變換,joint位于child link的原點(diǎn),修改該參數(shù)可以調(diào)整連桿的位置,可用在調(diào)整實(shí)際模型與理論模型誤差,但不建議大幅度修改,因?yàn)樵搮?shù)影響連桿stl的位置,容易影響碰撞檢測(cè)效果,具體如圖所示。

? ? ? xyz (可選: 默認(rèn)為零向量)

? ? ? 代表x,y,zx,y,zx,y,z軸方向上的偏移,單位米。

? ? ? rpy (可選: 默認(rèn)為零向量)

? ? ? 代表繞著固定軸旋轉(zhuǎn)的角度:roll繞著x軸,pitch繞著y軸,yaw繞著z軸,用弧度表示。

? ? ? <parent> (必需)

? ? ? parent link的名字是一個(gè)強(qiáng)制的屬性。

? ? ? link

? ? ? parent link的名字,是這個(gè)link在機(jī)器人結(jié)構(gòu)樹(shù)中的名字。

? ? ? <child> (必需)

? ? ? child link的名字是一個(gè)強(qiáng)制的屬性。

? ? ? link

? ? ? child link的名字,是這個(gè)link在機(jī)器人結(jié)構(gòu)樹(shù)中的名字。

? ? ? <axis>(可選: 默認(rèn)為(1,0,0))

? ? ? joint的axis軸在joint的坐標(biāo)系中。這是旋轉(zhuǎn)軸(revolute ?joint),prismatic joint移動(dòng)的軸,是planar ?joint的標(biāo)準(zhǔn)平面。這個(gè)軸在joint坐標(biāo)系中被指定。修改該參數(shù)可以調(diào)整關(guān)節(jié)的旋轉(zhuǎn)所繞著的軸,常用于調(diào)整旋轉(zhuǎn)方向,若模型旋向與實(shí)際相反,只需乘-1即可。固定(fixed)和浮動(dòng)(floating)類(lèi)型的joint不需要用到這個(gè)元素。

? ? ? xyz(必需)

? ? ? 代表軸向量的x,y,zx,y,zx,y,z分量,為標(biāo)準(zhǔn)化的向量。

? ? ? <calibration> (可選)

? ? ? joint的參考點(diǎn),用來(lái)矯正joint的絕對(duì)位置。

? ? ? rising (可選)

? ? ? 當(dāng)joint正向運(yùn)動(dòng)時(shí),參考點(diǎn)會(huì)觸發(fā)一個(gè)上升沿。

? ? ? falling (可選)

? ? ? 當(dāng)joint正向運(yùn)動(dòng)時(shí),參考點(diǎn)會(huì)觸發(fā)一個(gè)下降沿。

? ? ? <dynamics>(可選)

? ? ? 該元素用來(lái)指定joint的物理性能。它的值被用來(lái)描述joint的建模性能,尤其是在仿真的時(shí)候。

? ? ? damping(可選,默認(rèn)為0)

? ? ? joint的阻尼值。(移動(dòng)關(guān)節(jié)為N?sm\frac{N\cdot s}{m}mN?s,旋轉(zhuǎn)關(guān)節(jié)為N?m?srad\frac{N\cdot m\cdot s}{rad}radN?m?s)

? ? ? friction(可選,默認(rèn)為0)

? ? ? joint的摩擦力值(移動(dòng)關(guān)節(jié)為NNN,旋轉(zhuǎn)關(guān)節(jié)為N?mN \cdot mN?m)

? ? ? <limit> (當(dāng)關(guān)節(jié)為旋轉(zhuǎn)或移動(dòng)關(guān)節(jié)時(shí)為必需)

? ? ? 該元素為關(guān)節(jié)運(yùn)動(dòng)學(xué)約束。

? ? ? lower (可選, 默認(rèn)為0)

? ? ? 指定joint運(yùn)動(dòng)范圍下界的屬性(revolute joint的單位為弧度,prismatic joint的單位為米),連續(xù)型的joint忽略該屬性。

? ? ? upper (可選, 默認(rèn)為0)

? ? ? 指定joint運(yùn)動(dòng)范圍上界的屬性(revolute joint的單位為弧度,prismatic joint的單位為米),連續(xù)型的joint忽略該屬性。

? ? ? effort (必需)

? ? ? 該屬性指定了joint運(yùn)行時(shí)的最大的力。詳見(jiàn)安全限制.

? ? ? velocity (required)

? ? ? 該屬性指定了joint運(yùn)行時(shí)的最大的速度。詳見(jiàn)安全限制.

? ? ? <mimic>(可選)

? ? ? 這個(gè)標(biāo)簽用于指定已定義的joint來(lái)模仿已存在的joint。這個(gè)joint的值可以用以下公式計(jì)算,此元素不在move_group中啟用,使用會(huì)導(dǎo)致報(bào)錯(cuò)。

? ? ? value = multiplier * other_joint_value + offset.

? ? ? joint(可選)

? ? ? 需要模仿的joint的名字。

? ? ? multiplier(可選)

? ? ? 指定上述公式中的乘數(shù)因子。

? ? ? offset(可選)

? ? ? 指定上述公式中的偏移項(xiàng)。默認(rèn)值為0(revolute joint的單位為弧度,prismatic joint的單位為米)。

? ? ? <safety_controller> (可選)

? ? ? 該元素為安全控制限制,此元素下數(shù)據(jù)會(huì)讀入到move_group中,但實(shí)際上時(shí)無(wú)效,move_group會(huì)跳過(guò)此處限制直接讀取limit下的參數(shù)內(nèi)容,同時(shí)設(shè)置該元素有幾率會(huì)導(dǎo)致規(guī)劃失敗。

? ? ? soft_lower_limit (可選, 默認(rèn)為0)

? ? ? 該屬性指定了joint安全控制邊界的下界,是joint安全控制的起始限制點(diǎn)。這個(gè)值需要大于上述的limit中的lower值。更多細(xì)節(jié)詳見(jiàn)安全限制。

? ? ? soft_upper_limit (可選, 默認(rèn)為0)

? ? ? 該屬性指定了joint安全控制邊界的上界,是joint安全控制的起始限制點(diǎn)。這個(gè)值需要小于上述的limit中的upper值。更多細(xì)節(jié)詳見(jiàn)安全限制。

? ? ? k_position(可選, 默認(rèn)為0)

? ? ? 本屬性用于說(shuō)明位置和速度之間的關(guān)系。更多細(xì)節(jié)詳見(jiàn)安全限制。

? ? ? k_velocity(必需)

? ? ? 本屬性用于說(shuō)明力和速度之間的關(guān)系。更多細(xì)節(jié)詳見(jiàn)安全限制。

示例:

1.2.3 STL-3D模型文件

? ? ? STL文件是3D模型文件,機(jī)器人的URDF或仿真環(huán)境通常會(huì)引用這類(lèi)文件,它們描述了機(jī)器人的三維模型。相比URDF文件簡(jiǎn)單定義的型狀,STL文件可以定義復(fù)雜的模型,可以直接從solidworks或其他建模軟件導(dǎo)出機(jī)器人裝配模型,從而顯示出更加精確的外形。

1.2.4 Rqt-數(shù)據(jù)流可視化工具

? ? ? rqt是一個(gè)基于qt開(kāi)發(fā)的可視化工具,擁有擴(kuò)展性好、靈活易用、跨平臺(tái)等特點(diǎn),主要作用和RViz一致都是可視化,但是和RViz相比,rqt要高級(jí)一個(gè)層次。常見(jiàn)的命令有:

? ? ? rqt_graph:顯示通信架構(gòu)

? ? ? rqt_plot:繪制曲線

? ? ? rqt_console:查看日志

1.2.5 TF-坐標(biāo)轉(zhuǎn)換

? ? ? TF是ROS世界里一個(gè)基本的也很重要的概念,所謂TF(TransForm),就是坐標(biāo)轉(zhuǎn)換。在現(xiàn)實(shí)生活中,我們做出各種行為模式都可以在很短的時(shí)間里完成(比如拿起身邊的物品),但是在機(jī)器人的世界里,則遠(yuǎn)遠(yuǎn)沒(méi)有那么簡(jiǎn)單。觀察下圖,我們來(lái)分析一下抓取物品需要做到什么?而TF又起到什么樣的作用?

? ? ? 當(dāng)機(jī)器人的"眼睛"(如攝像頭)獲取一組關(guān)于物體的坐標(biāo)方位數(shù)據(jù)后,但是相對(duì)于來(lái)說(shuō),這個(gè)坐標(biāo)只是相對(duì)于安裝的攝像頭,并不直接適用于機(jī)械手爪執(zhí)行,那么物體相對(duì)于頭部和手臂之間的坐標(biāo)轉(zhuǎn)換,就是TF。

? ? ? 坐標(biāo)變換包括位置和姿態(tài)兩個(gè)方面的變換,ROS中的tf是一個(gè)可以讓用戶(hù)隨時(shí)記錄多個(gè)坐標(biāo)系的軟件包。tf保持緩存的樹(shù)形結(jié)構(gòu)中的坐標(biāo)系之間的關(guān)系,并且允許用戶(hù)可以在任何期望的時(shí)間點(diǎn)以及任何兩個(gè)坐標(biāo)系之間轉(zhuǎn)換點(diǎn)、矢量等。

1.2.6 Gazebo-機(jī)器人仿真工具

? ?? ? ?Gazebo是一個(gè)機(jī)器人仿真工具、模擬器,也是一個(gè)獨(dú)立的開(kāi)源機(jī)器人仿真平臺(tái),可以進(jìn)行機(jī)器人的運(yùn)動(dòng)學(xué)、動(dòng)力學(xué)仿真,能夠模擬機(jī)器人常用的傳感器(如激光雷達(dá)、攝像頭、IMU等),也可以加載自定義的環(huán)境和場(chǎng)景。 ?Gazebo提供高保真度的物理模擬,其提供一整套傳感器模型,以及對(duì)用戶(hù)和程序非常友好的交互方式。

? ? ? 通常一些不依賴(lài)于具體硬件的算法和場(chǎng)景都可以在Gazebo上仿真,例如圖像識(shí)別、傳感器數(shù)據(jù)融合處理、路徑規(guī)劃、SLAM等任務(wù)完全可以在Gazebo上仿真實(shí)現(xiàn),大大減輕了對(duì)硬件的依賴(lài)。

1.2.7 Moveit!-運(yùn)動(dòng)導(dǎo)航

? ?? ? ?Moveit!是目前針對(duì)移動(dòng)操作最先進(jìn)的軟件。它結(jié)合了運(yùn)動(dòng)規(guī)劃、操縱、三維感知、運(yùn)動(dòng)學(xué)、控制和導(dǎo)航的最新進(jìn)展;它提供了一個(gè)易于使用的平臺(tái),能開(kāi)發(fā)先進(jìn)的機(jī)器人應(yīng)用程序,評(píng)估新的機(jī)器人設(shè)計(jì)和建筑集成的機(jī)器人產(chǎn)品,它廣泛應(yīng)用于工業(yè),商業(yè),研發(fā)和其他領(lǐng)域。MOVEit!是最廣泛使用的開(kāi)源軟件的操作,并已被用于超過(guò)65個(gè)機(jī)器人。

? ?? ? ?MOVEit!的使用通過(guò)為用戶(hù)提供接口來(lái)調(diào)用它,包括C++、Python、GUI三種接口。ROS中的move_group節(jié)點(diǎn)充當(dāng)整合器,整合多個(gè)獨(dú)立組件,提供ROS風(fēng)格的Action和service。move_group通過(guò)ROS ? topic和action與機(jī)器人通訊,獲取機(jī)器人的位置、節(jié)點(diǎn)等狀態(tài),獲取數(shù)據(jù)再傳遞給機(jī)器人的控制器。為了便于理解Moveit!,請(qǐng)查看下面的系統(tǒng)架構(gòu)圖(見(jiàn)下圖)。


Moveit!系統(tǒng)架構(gòu)圖

2. 創(chuàng)建Ros工作空間并編譯

? ? ? 本節(jié)實(shí)驗(yàn)主要是學(xué)會(huì)為源代碼創(chuàng)建新的Ros工作空間并能進(jìn)行編譯。需要提前準(zhǔn)備好硬件、并配置好軟件環(huán)境(如下表所示)。

2.1為源碼創(chuàng)建空間并編譯

? ? ? 第一步:打開(kāi)終端,創(chuàng)建工作空間。

? ? ? 打開(kāi)終端:同時(shí)按下Crtl+Alt+T ,接著按下Enter,等待終端打開(kāi);

? ? ? 新建ros工作空間:在終端中輸入mkdir ?-p ?~/myself_ws/src ,接著按下 Enter,(如下圖所示)。

第二步:編譯ros工作空間。

在上述的終端中輸入:cd ?~/myself_ws,接著按下Enter;

接著在該終端繼續(xù)輸入:catkin_make,接著按下Enter,等待創(chuàng)建的ros工作空間編譯完成(大致需要15秒左右)。

?? ? ?? 編譯完成后在終端中輸入ls ?,接著按下Enter,查看ros工作空間是否編譯完成。如果編譯完成,myself_ws下會(huì)出現(xiàn)三個(gè)文件夾分別為:(build編譯空間Build ?Space)、devel(開(kāi)發(fā)空間Development Space)、src(代碼空間Source Space),否則檢查輸入命令是否有誤。


第三步:拷貝源代碼并編譯URDF及moveit文件。

? ? ? ?① 復(fù)制功能包:將文末資料中的ats_arm02和my_robot_arm兩個(gè)功能包復(fù)制粘貼到PC機(jī)的/myself_ws/src 文件夾中。

? ? ? ?② 編譯: 打開(kāi)終端,并在終端中輸入:cd ?~/myself_ws,之后按下Enter;接著在上述終端中輸入:catkin_make,接著按下Enter,等待編譯完成,該過(guò)程大致需要30秒。

2.2 設(shè)置環(huán)境變量

? ? ? ?在計(jì)算機(jī)操作系統(tǒng)里面設(shè)置環(huán)境變量其實(shí)就是設(shè)置一定的文件路徑,讓計(jì)算機(jī)執(zhí)行命令的時(shí)候方便找到。所以ROS中環(huán)境變量就是為了讓計(jì)算機(jī)更方便的找到文件所在的路徑來(lái)執(zhí)行。這里介紹兩種將ros工作空間添加到環(huán)境變量的方法,主要介紹其中常見(jiàn)的一種。

? ? ? ?永久上傳創(chuàng)建的ros工作空間至環(huán)境變量中:

3. URDF與仿真

? ? ? 本節(jié)實(shí)驗(yàn)主要是把URDF模型在rviz中顯示出來(lái),并通過(guò)tf觀察建立起坐標(biāo)系;同時(shí)通過(guò)改變joint來(lái)觀察機(jī)械臂朝向變化。

系統(tǒng)架構(gòu)圖(側(cè)重看URDF、TF部分)

機(jī)械臂的URDF文件介紹

? ? ? 機(jī)械臂的實(shí)物圖如下,我們將把其拆分為底座、轉(zhuǎn)臺(tái)、大臂、小臂四大部件,進(jìn)行建模。

? ??? 首先構(gòu)建base_link作為底座的父坐標(biāo)系,然后在base_link基礎(chǔ)上,再構(gòu)建轉(zhuǎn)臺(tái)、大臂和小臂的link. ?最后不同的link之間通過(guò)joint來(lái)連接,它們分別是base_spin_joint、pin_first_swing_joint、first_second_swing_joint(生成的文件如下圖所示)。

3.1 在tf中觀察各Link建立的坐標(biāo)

? ?? ? ?下面主要通過(guò)在Ros中加載URDF文件(詳細(xì)見(jiàn)文末資料中的Source_Urdf_Moveit_File\ats_arm02\urdf),在Rviz中顯示并調(diào)試。 ?在終端輸入roslaunch ats_arm02 display.launch命令后,啟動(dòng)Rviz,設(shè)置3個(gè)參數(shù)(如下圖所示)。


設(shè)置3個(gè)參數(shù)


各Link的tf圖

下面是各個(gè)link的坐標(biāo)系圖。

3.2 查看TF樹(shù)

輸入rosrun rqt_tf_tree rqt_tf_tree,可以看到以下tf 樹(shù),觀察link之間的關(guān)系:

3.3 改變joint來(lái)觀察機(jī)械臂的朝向變化

移動(dòng)joint_state_publisher進(jìn)度條(見(jiàn)下圖),可以臨時(shí)改變joint的朝向。

? ? ? 為了便于查看各個(gè)joint的變化情況,每次都要先點(diǎn) center,讓其保持正中位置,然后調(diào)整其中一個(gè)joint來(lái)觀察變化。下面是通過(guò)調(diào)整進(jìn)度調(diào)條后,改變joint朝向后的狀態(tài)圖。

改變base_spin_joint值


改變spin_first_swing_joint值
改變first_second_swing_joint值

4. 路徑規(guī)劃

move_group介紹

? ?? ? ?move_group是MoveIt的核心部分,可以綜合機(jī)器人的各獨(dú)立組件,為用戶(hù)提供一系列需要的動(dòng)作指令和服務(wù)。從moveit!架構(gòu)圖中我們可以看到,move_group類(lèi)似于一個(gè)積分器,本身并不具備豐富的功能,主要做各功能包、插件的集成。它通過(guò)消息或服務(wù)的形式接收機(jī)器人上傳的點(diǎn)云信息、joints的狀態(tài)消息、還有機(jī)器人的tf ?tree,另外還需要ROS的參數(shù)服務(wù)器提供機(jī)器人的運(yùn)動(dòng)學(xué)參數(shù),這些參數(shù)會(huì)在使用 ? ?setup ?assistant的過(guò)程中根據(jù)機(jī)器人的URDF模型文件,創(chuàng)建生成(SRDF和配置文件)。下圖是以move_group為中心提供的服務(wù):

move_group節(jié)點(diǎn)集成器

用戶(hù)可以通過(guò)以下三種方式之一來(lái)訪問(wèn)move_group提供的操作和服務(wù):

? ? ? 在C++中 --使用move_group_interface包,提供一個(gè)易于設(shè)置C++接口move_group;

? ? ? 在 Python中 --使用moveit_commander包;

? ? ? 通過(guò) GUI -- 使用運(yùn)動(dòng)規(guī)劃插件到Rviz(ROS可視化工具)。

? ? ? 下面我們將采用GUI方式來(lái)進(jìn)行運(yùn)動(dòng)規(guī)劃。在進(jìn)行運(yùn)動(dòng)規(guī)劃前,需要先利用MoveIt Setup Assistant圖形化界面進(jìn)行配置。

4.1生成Ros包

? ?? ? 要使用MoveIt控制我們的機(jī)器人,需要配置一個(gè)ROS的軟件包。MoveIt提供了一個(gè)圖形化工具M(jìn)oveIt Setup ?Assistant可以快捷的進(jìn)行配置。MoveIt Setup ?Assistant是一個(gè)圖形界面的工具,幫助配置MoveIt所需的ROS包。Setup ?Assistant會(huì)根據(jù)用戶(hù)導(dǎo)入的機(jī)器人的urdf模型,生成SRDF( Semantic Robot Description ?Format)文件,從而生成一個(gè)MoveIt!的功能包,來(lái)完成機(jī)器人的互動(dòng)、可視化和仿真。

? ? ? 下面我們將加載上面內(nèi)容介紹的URDF模型,并完成相應(yīng)的配置。

? ? ? 首先運(yùn)行setup assistant,命令如下:roslaunch moveit_setup_assistant setup_assistant.launch

? ? ? 請(qǐng)打開(kāi)終端(Crtl+Alt+T),啟動(dòng)后輸入上面的命令,效果如下圖所示:

第一步:加載URDF,請(qǐng)點(diǎn)擊Create New MoveIt! Configuration Package。

點(diǎn)瀏覽后,找到文末資料中的Source_Urdf_Moveit_File\ats_arm02\urdf\ats_arm02.urdf文件即可。

第二步:Self-Collisions自碰撞

? ? ? 默認(rèn)的碰撞免檢矩陣生成器搜索機(jī)器人所有關(guān)節(jié),這個(gè)碰撞免檢矩陣是可以安全地關(guān)閉檢查,從而減少行動(dòng)規(guī)劃的處理時(shí)間

? ? ? 在某些關(guān)節(jié)會(huì)關(guān)閉碰撞檢查,比如總是碰撞,從不碰撞,在默認(rèn)的位置碰撞,或在運(yùn)動(dòng)學(xué)鏈條上的相鄰處

? ? ? 采樣密度指定了多少個(gè)隨機(jī)機(jī)器人位置來(lái)檢查碰撞。更高的密度需要更多的計(jì)算時(shí)間,而較低的密度就要減少關(guān)閉的檢查節(jié)點(diǎn)

? ? ? 默認(rèn)值是10000個(gè)碰撞檢查。碰撞檢查是并行完成,以減少處理時(shí)間

由于只有三個(gè)joint,所以需要去掉第一個(gè)對(duì)勾。

? ? ? 第三步virtual ?joint ?虛擬關(guān)節(jié)。虛擬關(guān)節(jié)就是定義一個(gè)關(guān)節(jié)將機(jī)器人與世界鏈接起來(lái),針對(duì)本實(shí)驗(yàn)中來(lái)說(shuō),假如放在桌子上,那么與桌子的連接就算一個(gè)虛擬關(guān)節(jié),這個(gè)關(guān)節(jié)類(lèi)型是fixed(固定)的;而base_link是與這個(gè)虛擬關(guān)節(jié)相連的,作為child_link。明白了原理后,請(qǐng)按照下面三幅圖進(jìn)行虛擬關(guān)節(jié)的設(shè)置。

圖1
圖2


圖3

第四步:planning ?group規(guī)劃組。MoveIt通過(guò)定義規(guī)劃組(planning ?group)來(lái)定義機(jī)械臂的各個(gè)部分(如手臂、末端執(zhí)行器等)。簡(jiǎn)單的說(shuō)就是定義某些關(guān)節(jié)為一個(gè)組合并起一個(gè)名字,下面我們將定義一個(gè)my_new_arm的組、選擇運(yùn)動(dòng)學(xué)算法、選擇規(guī)劃組的方式。

? ? ? 請(qǐng)點(diǎn)擊Planning Groups----Add Group按鈕;

?? ? ?? 請(qǐng)輸入組名,在運(yùn)動(dòng)學(xué)求解器上選擇kdl_kinematics_plugin/KDLKinematicsPlugin ?,創(chuàng)建規(guī)劃組有四種方法:Add Joints、Add Links、Add Kin. Chain、Add Subgroups,這里選用Add ?Kin. Chain。具體見(jiàn)下圖:

接下來(lái)選擇機(jī)械臂的底座base_link為BaseLink的second_swing_Link作為T(mén)ipLink。設(shè)置結(jié)果如下圖:

這樣就完成了一個(gè)規(guī)劃組的配置(見(jiàn)下圖)。

第五步:Robot Poses機(jī)器人姿態(tài)設(shè)置。下面我們將添加一個(gè)預(yù)設(shè)的姿態(tài)并命名為my_new_arm_pose。這里的預(yù)設(shè)姿態(tài)為0(這里是弧度制,0代表90度),當(dāng)然大家也可以按需進(jìn)行調(diào)整滑動(dòng)條,進(jìn)行姿態(tài)的預(yù)設(shè)。

下圖為配置好的預(yù)設(shè)姿態(tài)結(jié)果。

?? ? 第六步: End Effectors末端執(zhí)行器。在大多數(shù)情況下,我們會(huì)給機(jī)械臂安裝末端執(zhí)行器,可以是夾持器,也可以是真空吸盤(pán),甚至可以是3d打印機(jī)的擠出頭。本實(shí)驗(yàn)中的URDF中暫且沒(méi)有畫(huà)執(zhí)行器,就先不用設(shè)置了。

? ? ? 第七步:Passive Joints 被動(dòng)關(guān)節(jié)。被動(dòng)關(guān)節(jié)就是無(wú)法主動(dòng)運(yùn)動(dòng)的關(guān)節(jié),也可以理解為從動(dòng)關(guān)節(jié),這樣moveit在規(guī)劃運(yùn)動(dòng)時(shí),這些關(guān)節(jié)是無(wú)法主動(dòng)控制的。由于這里沒(méi)有被動(dòng)關(guān)節(jié),所以這一步也可以跳過(guò)。

? ? ? 第八步:選擇Ros ?Control(Ros 控制)。ROS ?Control是ROS官方提供的針對(duì)控制機(jī)器人的一套硬件驅(qū)動(dòng)框架,針對(duì)不懂得運(yùn)動(dòng)執(zhí)行器提供不同的驅(qū)動(dòng)接口,再這之上又加入了一個(gè)硬件抽象層統(tǒng)一接入ROS,包含了一系列ROS包。這里我們可以通過(guò)ROS ?Control面板為關(guān)節(jié)添加simulation(模擬控制器),就可以通過(guò)MoveIt模擬機(jī)械臂的運(yùn)動(dòng)。

? ? ? 點(diǎn)擊Auto Add FollowJointsTrajectory Controllers For Each Planning Group按鈕后,會(huì)自動(dòng)添加。生成的Controller如下圖所示:

第九步:選擇模擬器simulation。點(diǎn)擊Generate URDF按鈕后,會(huì)自動(dòng)生成URDF文件。

第十步:選擇3D Perception(3D感知) 。主要為添加傳感器,這里暫且沒(méi)有用到傳感器,可以先跳過(guò)。

第十一步:選擇Author Information(作者信息),方便后續(xù)發(fā)布用。

第十二步:選擇Configuration Files(配置文件)。請(qǐng)先點(diǎn)擊Browse選擇一個(gè)文件夾,然后點(diǎn)Generate Package按鈕即可。

針對(duì)項(xiàng)目,我們選擇是文末資料中的Source_Urdf_Moveit_File\my_robot_arm文件夾,生成的文件如下圖所示。

4.2 運(yùn)動(dòng)規(guī)劃

? ? ?對(duì)于運(yùn)動(dòng)規(guī)劃這部分,我們可以采用隨機(jī)規(guī)劃路徑、也可以手動(dòng)規(guī)劃路徑。

4.2.1 隨機(jī)規(guī)劃路徑

? ? ?第一步:打開(kāi)終端,輸入命令 roslaunch my_robot_arm demo.launch,并等待RVIZ啟動(dòng)。


啟動(dòng)后,利用鼠標(biāo)來(lái)調(diào)整視圖。鼠標(biāo)的操作方法,一般常用的就是“shift+鼠標(biāo)左鍵”轉(zhuǎn)換視角,“鼠標(biāo)左鍵”平移視角,“滾輪”縮放大小。

第二步:接下來(lái)我們選擇面板Planning---Goal State,選擇<random valid>。

第三步:點(diǎn)Plan按鈕,就可以看見(jiàn)效果(如下圖所示)。

第四步:點(diǎn)Execute按鈕,執(zhí)行效果如下圖所示。

如果想停止執(zhí)行效果,請(qǐng)?jiān)俅伟聪翽lan按鈕。


4.2.2 手動(dòng)規(guī)劃路徑

? ? ?下面我們將分別對(duì)機(jī)械臂的轉(zhuǎn)臺(tái)、大臂、小臂分別進(jìn)行手動(dòng)規(guī)劃,并執(zhí)行查看其效果。

? ? ? 第一步:打開(kāi)終端,輸入命令 roslaunch my_robot_arm demo.launch,并等待RVIZ啟動(dòng)并調(diào)整好視圖。 ? ?

? ? ? 第二步:接下來(lái)我們選擇面板Planning,選中Allow Approx IK solutions(如下圖所示)。


第三步:手動(dòng)設(shè)置轉(zhuǎn)臺(tái)的路徑。

? ? ?點(diǎn)擊藍(lán)色的圓圈,設(shè)置轉(zhuǎn)動(dòng)的目標(biāo)位置(見(jiàn)下圖),點(diǎn)Plan按鈕規(guī)劃路徑;然后點(diǎn)面板上的Execute按鈕后觀察效果;再次點(diǎn)擊Plan按鈕后停止。

第四步:手動(dòng)設(shè)置大臂的路徑。

? ? ?點(diǎn)擊紅色的箭頭,設(shè)置轉(zhuǎn)動(dòng)的目標(biāo)位置(見(jiàn)下圖),點(diǎn)Plan按鈕規(guī)劃路徑;然后點(diǎn)面板上的Execute按鈕后觀察效果;再次點(diǎn)擊Plan按鈕后停止。

步:手動(dòng)設(shè)置小臂的路徑。

? ? ? 點(diǎn)擊綠色的圓圈,設(shè)置轉(zhuǎn)動(dòng)的目標(biāo)位置(見(jiàn)下圖),點(diǎn)Plan按鈕規(guī)劃路徑;然后點(diǎn)面板上的Execute按鈕后觀察效果;再次點(diǎn)擊Plan按鈕后停止。

5. 資料下載

資料內(nèi)容:程序源代碼

資料下載地址:桌面級(jí)機(jī)械臂-仿真設(shè)計(jì) https://www.robotway.com/h-col-259.html


機(jī)器人制作開(kāi)源方案 | 桌面級(jí)機(jī)械臂--仿真設(shè)計(jì)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
广昌县| 霍邱县| 麦盖提县| 怀仁县| 永胜县| 景德镇市| 中阳县| 齐河县| 开化县| 勃利县| 信阳市| 龙口市| 玛沁县| 分宜县| 丰台区| 手游| 邹城市| 佛学| 牙克石市| 五莲县| 平安县| 五河县| 晋城| 丰镇市| 阿瓦提县| 宜丰县| 和龙市| 冕宁县| 莫力| 贡嘎县| 黔南| 维西| 深州市| 东乌| 宕昌县| 鄂托克旗| 扎鲁特旗| 朝阳区| 巴里| 彭阳县| 通榆县|