原創文章,出自"博客園, _阿龍clliu" :http://www.cnblogs.com/clliu/
上一次介紹了界面和一個簡單的自由落體,然而在實際運用中,機器人的結構都是可以大做文章的,天馬星空的想象如果能在仿真中運行一下是再好不過了的。這一次說一說webots下建模。
本人是學機械的,都知道現在主流的三維建模軟件都有SolidWorks、Creo(Pro\E)、UG等等,這些軟件建模的功能很強大,操作也相對簡單。而webots的建模是基於VRML語言的,我知道的使用這個語言的建模軟件有3dmax,我所知道一些工業設計的同學他們使用這款軟件。所以,我們在SolidWorks等軟件下建模的文件是沒有辦法導入webots的。
在webots建模中,都是以場景樹中的節點貫穿所有信息,關於節點的概念,我也講不清楚,英文能力好的朋友可以查單reference.pdf(F4)中Chapter 2 -Node Chart。
用一句話概括一下webots的建模模式:建一個基本單元(圓柱、長方體等),經過translation(位移)、rotation(旋轉)、sacle(縮放)的過程得到一個新的形狀,多個這樣的形狀通過關系組合。(基本上和openGL的繪圖模式一樣)
建立一個四足機器人模型
進入正題,我們在一級節點(與WorldInfo、Viewpoint同級)下新建節點。會出現新節點、USE、PROTO(項目)、PROTO(webots)。
新節點 是代表可以添加的節點,在不同的節點下新建,這一欄的內容是不一樣的。
USE 里面包含在項目中用戶建好的節點,差不多復制的意思吧,前提是建好的節點需要命名(再強調一遍,命名不是修改節點下name屬性,是選中該節點在下方DEF中輸入)。
PROTO(項目) 里面添加源目錄的文件,現在不用到。
PROTO(Webots) 里面有軟件寫好的一些模型,有些生活中的物品,桌子,球之類的,還有現在有名機器人(nao等)和傳感器。用到最多的就是object下的floors下的Floor(Solid),新建世界時軟件添加的CheckeredFLoor地板真是太丑了,我一般都刪了自己加一個。
選擇新節點下的Robot節點,創建一個機器人,點擊Robot節點,下方DEF命名為robot。(在添加節點時要養成命名的好習慣)選擇robot節點下的children,新建節點,這時候的新節點下的內容和之前不一樣,多了很多項。
選擇Shape節點,我們建立一個機器人的機身。在Shape節點下有appearance和gometry兩個子節點,代表着外觀和幾何形狀。
選中geometry節點,新建節點box,命名為body,選中size,修改成(x,y,z)為(0.32,0.01, 0.16)。
這時候機器人的機身貼在地板上,我們選擇Robot節點下的translation節點,將修改成0.25,這時候機器人就向上移動了0.25m。
接下來繼續選擇Robot節點下Children(也可以選中DEF body Shape節點),新建一個servo節點,只要和DEF body Shape節點在同一級就可以。命名為fore_right_1。
在servo下的children節點下新建Transform節點,命名為servo_shape,Transform節點可以進行位移、旋轉、縮放的變換。
在其children下添加shape節點,命名servo_shape,在shape的geometry NULL下新建Cylinder(圓柱)節點,修改屬性height為0.01,radius為0.01。修改完后,圓柱完全藏在機身里面了。
接下來修改DEF fore_right_1 Servo下的translation 為(0.12,0,0.085),rotation為(0,0,1,0);將DEF servo_shape Transfrom下的rotation修改為(1,0,0,1.5708)。
rotation這種旋轉變化應該是四元數,和常用的歐拉角不一樣,指的是繞一個向量旋轉某個弧度,(1,0,0,1.5708)指繞x軸旋轉pi/2。修改完成之后應該如下,這里一定要細心。
打開菜單欄 查看->可選顯示->顯示伺服軸,查看電機的旋轉方向是否正確。這時候視圖中出現一條黑線。這個方向是錯誤的,電機的旋轉軸應該和機身平行向外。
這時候選中DEF fore_right_1 Servo的rotation,點擊一下角度屬性的^按鈕,方向就調整過來了,再按一下向下的,恢復到0,電機的方向就和Z向相同了。另外,需要使用直線位移的電機,可以將servo下type屬性改成linear,更詳細的介紹查看reference.pdf中 3.42 Servo。
接下來繼續建模,在DEF servo_shape Transform同級下新建節點Transform,命名leg1,修改translation為(0,-0.05,0)。在其下children新建shape節點,命名leg1。在其geometry下新建box節點,size屬性改成(0.01,0.1,0.008)。
接下來在DEF leg1 Transform同級新建servo節點,命名fore_right_2,修改translation為(0,-0.1,0)。在其fore_right_2 servo 的children下新建Transport節點,命名servo_shape,修改rotation(1,0,0,1.5708),在children下新建USE節點servo_shape(如果之前沒有命名,USE節點將無法使用)。說的不清楚可以看圖操作。
接下來的操作都差不多,直接放圖,按着圖上做吧。
最下面與地面接觸的小圓柱,我使用的是touchSensor節點,這個傳感器節點可以反饋與地面的接觸力,控制機器人的時候可以使用到。具體的操作看圖吧。
有人會問為什么一個電機2要加在電機1的子節點下,因為小腿的位置是伴隨着髖關節和膝關節兩個電機的變化而變化,髖關節(servo1)轉動,大腿(leg1)、小腿(leg2)和膝關節(servo2)都會隨之轉動;膝關節(servo2)轉動,只有小腿(leg2)隨之轉動。所以,大腿(leg1)、小腿(leg2)和膝關節(servo2),都是髖關節(servo1)的子節點;小腿(leg2)是膝關節(servo2)的子節點。
然后接下來其他的腿建模,基本上都是用USE節點的,過程就不說了,后面會給出模型的文件下載。
模型建完之后,是一項很繁瑣的工作,設置boundingObject和Phyzics,給每個零件添加顏色,這個過程難度不大,照着下載的文件跟着做吧。
另外說一點,不是所有的形狀都要加boundingObject(外邊界),這樣很容易產生干涉,建議只給body和12個小圓柱加外邊界。
圖中彎曲的腿,可以通過修改每個servo的rotation的值,具體可以看文件吧。
.wbo文件導入方法:新建一個世界,按下導入選擇文件。
下一篇講控制器,建議學習的時候多查reference。