2013/11/25

RoboSavvy人型機器人設計比賽-unl

最近參加了個人型機器人的設計比賽,裡面有許多不錯的設計,都可以免費下載下來在自家裡的3D成型機裡面做出來喔。不過呢,這還只是個紙上談兵的部分,做出來能不能動還不知道呢。但是若有時間慢慢拿這些現成的樣本修修改改,應該可以做出些不錯的成果。

這是我的作品,https://grabcad.com/library/robosavvy-humanoid-design-unl-1


主要的設計重點是在可以替換的外殼與容易升級的背包。
當然腳上能夠加的感測器也不能少啦,前後各配備一個超音波感測器,腳底也有四個壓力感測器。背包打開來,裡面一個黑黑獵兔狗骨頭(BeagleBone Black)的小電腦加上一塊1350mAh電池。若是怕不夠用,身體裡面還有空間可以再加上一顆喔。屁股後面紅紅的一個是IMU或加速度計,可作為平衡用的。
 這是背包的部分,那個大大的頭上藍色的蓋子裡面可以加個小喇叭。
 換上小頭,看起來又是另外一種風格。
還有雙伺服馬達的膝關節,三個自由度的髖關節,因為比賽規定只能用AX12/18的伺服機,所以膝關節得用到兩個,才夠產生足夠的扭力。
內部的結構設計,一共用到24個伺服機阿,真是超貴,不過這比賽規定裡面也沒限制,當然就盡量用囉!

小頭的設計。 


 稍有些空閒,修改了部分的設計,這樣大頭裡面有些空間擺其他東西,像是第二台電腦或使一些感測器或是Arduino等等。
最後擺幾個姿勢看看,當然不可少的就是有名的金雞獨立啦。
若是去參加足球賽的話,就大概長成這樣吧!
大小兩個頭比較一下。 


附錄1:
有人跟我提到,對於那個膝關節有些疑惑,不太清楚到底是怎麼運作的,順便說明如下。

膝關節裡面的兩個伺服機其實是用齒輪連在一起,這樣若兩個一起轉動的話,彼此的扭力會經由齒輪機構傳遞到另一端,也由此增加扭力。下面是用Working Model 2D的模擬,當只有一個伺服機施加扭力時,可以看到移動速度較慢,對地面產生的力量較小,而當兩個伺服機同時工作時,不僅速度增加,地面作用力也變大快要兩倍,也就是能夠支撐或對身體施予更多的力量。

不知道大家看到現在,有沒有猜到設計的靈感來源其實就是來自這幾隻啦!



2013/11/15

smach 狀態機安裝筆記

http://wiki.ros.org/smach/Tutorials/Getting%20Started
這個狀態機似乎蠻好用的,而且還可以顯示各種不同狀況。決定來試試看。
一開始是在hydro下面,可是怎麼都找不到smach-viewer這個東西,這樣要怎麼看那個漂亮的圖呢?
最後是自己下載了一份hydro的版本,rosmake後卻又沒有smach-tutorial可以試,到底還有沒有人在用smach呢?唉!

一氣之下,轉回groovy,這下子內建smach_viewer應該就沒問題了吧。哈哈!

但是呢,還是沒有smach_tutorial可用,這到底怎麼了呢!!!?

最後呢,自己去弄一份來吧,反正都走到這步田地了。
http://ros-users.122217.n3.nabble.com/How-to-install-smach-tutorials-package-td1284493.html
svn co https://code.ros.org/svn/ros-pkg/stacks/executive_smach_tutorials/trunk/ executive_smach_tutorials
rosmake executive_smach_tutorials

結束後進去先跑個範例試試看。
ipython state_machine_simple.py
什麼!!!居然不行,這太誇張了吧!
action_server_wrapper.py", line 9, in <module> from actionlib.simple_action_server import SimpleActionServer ImportError: No module named simple_action_server
這是什麼狀況?怎麼連自家人的程式都這樣搞內鬨呢?

http://answers.ros.org/question/44062/smach-tutorial-importerror-no-module-named-msg/
最後找到這裡一看,
There is a file called examples/actionlib.py in the same folder. Rename the file actionlib.py to actionlib1.py and delete the file actionlib.pyc.
居然是這個問題啊!
開個smach_viewer,跑iterator_tutorial.py,終於看到想看到的狀態機啦!


Dell m4700 安裝10.04LTS, ROS, Jaco 筆記

一開始無線網路卡找不到,得自己從別台電腦下載Broadcom的驅動,手動make後在複製到該在的位置。
http://ubuntuforums.org/showthread.php?t=1390979

RAM upgrade: 外加全滿的記憶體後,得要改變核心一下,才能看到升級後的成果。
sudo apt-get update
http://linuxblog.pansapiens.com/2010/06/22/using-more-than-3-gb-of-ram-with-32-bit-ubuntu-10-04-lucid/

可是這時候又找不到網路卡了,當然又是在手動make一下,只是換成新裝的核心位置了。

install Nvidia driver
得要外接個螢幕,用功能鍵將螢幕切換到外部,才能夠看到命令列。
(http://www.nvidia.com/object/linux-display-ia32-310.44-driver.html)
(http://www.ubuntugeek.com/howto-install-nvidia-drivers-manually-on-ubuntu-10-04-lucid-lynx.html)
ctrl+alt+F1  按下後會進到終端機模式
login
sudo service gdm stop  得停止x-server,不然會不給裝。
sudo sh ~/Download/NVIDIA......

至於中文輸入法,就參考這個吧
http://chris959.blogspot.com/2012/02/linux-mint.html

JACO 機器手
http://www.ros.org/wiki/jaco
先設定workspace
roscd

rosws set ros-jaco-arm --git https://github.com/Kinovarobotics/jaco-ros.git

rosws update ros-jaco-arm


重新開一個終端機
cd ros-jaco-arm

rosmake


就可以啦!

最後實在沒辦法,有許多東西不太支援10.04了,音效卡是其中之一,就換成12.04LTS啦!

安裝Jaco Arm

根據ros wiki的介紹,基本上只要照著這個網頁安裝完就可以了。
http://ros.org/wiki/jaco?distro=fuerte
就只有這麼幾個步驟。經過測試,Fuerte/Groovy/Hydro都可以用喔。不過呢,這只適合用在rosmake,catkin的版本還沒出。
roscd

rosws set ros-jaco-arm --git https://github.com/Kinovarobotics/jaco-ros.git
到下一步前,必須先關掉目前的終端機或是開一個新的,這樣這個新加工作區的才會被加入。

rosws update ros-jaco-arm

cd ros-jaco-arm

rosmake

但是實際上呢,我碰到幾個狀況是網頁上沒提到的。上面的紅字是我補充的部份。

另外呢,在問題回報區(https://github.com/Kinovarobotics/jaco-ros/issues/1)裡面有提到32bit的問題。下面是討論區的回覆。
$ roscd jaco_driver/lib/i386-linux-gnu
$ cp Kinova.API.CommLayerUbuntu.so ~/.ros/
我的解決方式是將那目錄裡面的一堆.so檔全複製一份到/usr/lib裡面。噹噹!出現連線成功的雙藍燈囉!

Dell M 4700 安裝 12.04LTS 加上 ROS 筆記

使用版本12.04.03LTS
音效卡正常,顯示卡與網路卡都可以被Additional Drivers找到。
安裝ros-hydro,這樣才有openni2,可以讀到剛買的primesense 3D攝影機(http://www.primesense.com/solutions/3d-sensor/)。

安裝Clearpath Jaco Driver
先照這個網站上的步驟
http://wiki.ros.org/jaco
然後將幾個.so檔案複製一份到/usr/lib/與~/.ros/
https://github.com/Kinovarobotics/jaco-ros/issues/1
最後找出rules.d,再將99-jaco-arm.rules複製一份過去。
這樣好像就可以了。


最後就是移除一些不必要的軟體囉!

可是呢,最近想用smach時發現hydro有個小問題,就是似乎更新不太完全,這部份好像還沒更新到,難道大家不想用狀態機了嗎!

為了試試看smach,只好降回groovy,但是呢,openni2要怎麼辦呢?

我試了幾種方式,都不太有用,大部分是用在kinect的。
http://answers.ros.org/question/54747/primesense-carmine-doesnt-work-but-asus-xtion-does-openni-launch-devices-connected-but-not-found/

本來以為沒希望了,但是呢,天無絕人之路,從這裡下載了ros-groovy裡面沒附上的openni2_launch,記得要選groovy版。
https://github.com/ros-drivers/openni2_launch

重新catkin_make一下。測試一下,
roslaunch openni2_launch openni2.launch
rosrun rviz rviz
照著openni ros裡面的設定加入depth camera,叮咚!


















中間發生了小插曲,因為我砍掉了hydro又重新裝groovy,所以rqt的一堆插件全都失靈,大家都還在懷念hydro啊!真是念舊的ros,該怎麼辦呢!?
http://answers.ros.org/question/91231/rqt-plugin-not-listedfound-in-list-returned-by-rqt-list-plugins/
查了半天rqt裡面的一堆檔案,沒發現有人窩藏hydro在裡面啊,最後找到上面這裡,按照這兩段一用,咻,跟新的一樣啦!
$ rm ~/.config/ros.org/rqt_gui.ini
$ rqt

2013/06/07

MOPED gfortran f951 error

早上跑去CMU請教了MOPED的作者,根據他的描述,只要參考裏面的modeling.dox,裏面的說明非常的直前(straightforward),只要照著做,就可以自己建立模型庫了。

不過我那時沒帶到我裝了Linux的筆電,只好等下午回到實驗室才能證實他的說法。

對於沒有安裝MOPED的人,請先根據這篇文章將MOPED check out出來,接下來所要用到的都在 pr/src/moped/moped2/modeling/ 這個目錄中。

最容易做的就是下載範例了。用

cd examples
sh download_examples.sh

等個幾分鐘,就全部下載完了。

首先要安裝Modeling
make 沒多久後就出現一個錯誤:
gcc: error trying to exec 'f951': execvp: No such file or directory

查了一下,在這裡提到要安裝gfortran,感覺蠻奇怪的,如果 gcc 是c的編譯器,那gfortran不就是fortran的編譯器了嗎!這不是我大學時代就已經開始淘汰的語言嗎!現在都什麼時代了還有人用fortran寫程式,我這可是最新的電腦耶,怎麼可以裝這種老古董的編譯器自損身價,重新找找看有沒有搞錯,可是都沒找到相關的。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48697

雖然有點不願意,但是死馬當活馬醫,先用
sudo apt-get install gfortran
試試看,然後重新
make
果真解決了,還真的是 fortran 編譯器的問題,唉,我實在是小看了這博大精深的Linux了。

2012/05/25

遙控箱子設計

最近在思考若是要作個遙控的箱子,應該長什麼樣子,不過呢,先來看看大家都是怎麼作的。這些大多是軍用的,蠻適合我們身為退伍軍人研究單位的風格啊!
PastedGraphic-2012-05-26-00-27.jpg


PastedGraphic1-2012-05-26-00-27.jpgPastedGraphic2-2012-05-26-00-27.jpg


PastedGraphic3-2012-05-26-00-27.jpg


PastedGraphic4-2012-05-26-00-27.jpg

PastedGraphic5-2012-05-26-00-27.jpg






PastedGraphic6-2012-05-26-00-27.jpg

PastedGraphic7-2012-05-26-00-27.jpg




PastedGraphic8-2012-05-26-00-27.jpg


PastedGraphic9-2012-05-26-00-27.jpg




PastedGraphic10-2012-05-26-00-27.jpg


PastedGraphic11-2012-05-26-00-27.jpg


1__%252524%252521%252540%252521__PastedGraphic-2012-05-26-00-27.jpg


1__%252524%252521%252540%252521__PastedGraphic1-2012-05-26-00-27.jpg


1__%252524%252521%252540%252521__PastedGraphic2-2012-05-26-00-27.jpg1__%252524%252521%252540%252521__PastedGraphic4-2012-05-26-00-27.jpg

2012/05/17

C# game programming - For Serious Game Creation


有用的Timer


using System.Runtime.InteropServices;
namespace GameLoop
{
public class PreciseTimer {
[System.Security.SuppressUnmanagedCodeSecurity] [DllImport("kernel32")]
private static extern bool QueryPerformanceFrequency(ref long
PerformanceFrequency); [System.Security.SuppressUnmanagedCodeSecurity] [DllImport("kernel32")]
private static extern bool QueryPerformanceCounter(ref long PerformanceCount);
long _ticksPerSecond = 0;
long _previousElapsedTime = 0; public PreciseTimer()
{
QueryPerformanceFrequency(ref _ticksPerSecond); GetElapsedTime(); // Get rid of first rubbish result
}
public double GetElapsedTime() {
long time = 0;
QueryPerformanceCounter(ref time);
double elapsedTime = (double)(time - _previousElapsedTime) /
(double)_ticksPerSecond; _previousElapsedTime = time; return elapsedTime;
} }
}
The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter. Most modern hardware has a high- resolution timer; this function is used to get the frequency at which the timer increments. The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter. These can be used together to time how long the last frame took.
GetElapsedTime should be called once per frame and this will keep track of the time. The elapsed time is so important that it should be incorporated into the game loop. Open the Program.cs file and change the game loop so it takes one argument.
public class FastLoop {
PreciseTimer _timer = new PreciseTimer();
public delegate void LoopCallback(double elapsedTime);
The timer is then called once per frame and elapsed time is passed on to FastLoop’s callback.
void OnApplicationEnterIdle(object sender, EventArgs e) {
while (IsAppStillIdle()) {
_callback(_timer.GetElapsedTime()); }
}
The game loop can now be used to smoothly animate any game! By the end of this chapter, the game loop will be used to smoothly rotate a 3D triangle—the ‘‘Hello World’’ application of OpenGL programming.

2011/07/26

How to import kivy in Eclipse 如何在Eclipse中加入Kivy的套件

今天查了下Python的資料,看到一個不錯的套件Kivy,可是呢,網站上的資料都只有英文不說,連如何加到Eclipse裡也沒有。難道我得要每次都拖拉我的程式到Kivy中執行嗎?這太麻煩了啊!

在網路上搜尋了一下,沒有人做過這件事,唯一的一個官方討論區的建議是,大部份的Kivy開發者都用小作家類得文字編輯器,在命令模式下執行。雖然我也很享受在鍵盤上敲打然後程式跑出來的感覺,可是呢,總是不甘心好不容易裝了個Eclipse+PyDev卻不能在上面用Kivy,最後花了點時間東看看西找找,居然也被我弄出來了,為了紀念這麼一天,在此紀錄一下。

在Mac OS X下的做法,首先用Terminal執行以下的命令。用來找出到底kivy躲在哪裡。
$ which kivy

我的電腦幫我找出來他在這裡的目錄內。
/usr/local/bin/kivy





輸入剛才找到的目錄,取個名字叫做kivy。



最後呢,他會幫忙找出這些,我加選了出現kivy的那兩個,其他是電腦自行找出來的。



之後選取Apply,當然,別忘記在Project->Property中選用新作的Interpreter。





最後,再重新啓動Eclipse就可以用囉!測試一下Hello World程式,完全沒有錯誤了。

import kivy
kivy.require(
'1.0.6') # replace with your current kivy version !

from kivy.app import App
from kivy.uix.button import Button

class MyApp(App):
def build(self):
return Button(text='Hello World')

if __name__ in ('__android__', '__main__'):
MyApp().run()



結論,這可能是太簡單了,所以沒有人作成教學放在網路上。不過呢,對於我這種程式菜鳥,還是得靠這種圖文教學才學得會。若有其他人也有同樣的困擾,希望這篇對他有些幫助。