技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動(dòng)網(wǎng) > 技術(shù)頻道 > 技術(shù)百科 > 控制伺服機(jī)運(yùn)轉(zhuǎn)順暢的ROS程序設(shè)計(jì)

控制伺服機(jī)運(yùn)轉(zhuǎn)順暢的ROS程序設(shè)計(jì)

時(shí)間:2019-01-21 11:05:09來源:Ben Martin

導(dǎo)語:?ROS(RobotOperatingSystem)是開源的機(jī)器人系統(tǒng)平臺(tái)。使用這個(gè)之后,機(jī)器人就可以看見東西、測繪、導(dǎo)航,或是以最新的算法作用于周圍的環(huán)境當(dāng)中。假如想要制造復(fù)雜的機(jī)器人,已經(jīng)準(zhǔn)備好的ROS程序代碼就能派上用場。ROS能在最低限度下運(yùn)用。這可以透過RaspberryPi等級(jí)的計(jì)算機(jī)安裝。

ROS(RobotOperatingSystem)是開源的機(jī)器人系統(tǒng)平臺(tái)。使用這個(gè)之后,機(jī)器人就可以看見東西、測繪、導(dǎo)航,或是以最新的算法作用于周圍的環(huán)境當(dāng)中。假如想要制造復(fù)雜的機(jī)器人,已經(jīng)準(zhǔn)備好的ROS程序代碼就能派上用場。ROS能在最低限度下運(yùn)用。這可以透過RaspberryPi等級(jí)的計(jì)算機(jī)安裝。

做為ROS的入門篇我們來看看如何控制伺服機(jī)。伺服機(jī)的缺點(diǎn)是會(huì)盡快遵照指令運(yùn)轉(zhuǎn),因此頭部常常會(huì)突然活動(dòng),以至于失去平衡。不過使用ROS之后,就可以進(jìn)行正弦曲線運(yùn)動(dòng),讓機(jī)器人保持穩(wěn)定。由于可以在ROS當(dāng)中進(jìn)行這項(xiàng)操作,因此無須改寫控制用的程序代碼。另外,連接伺服機(jī)和ROS的程序代碼,以及伺服機(jī)的硬件都無須變更。再者,程序代碼還可以任意使用。

ROS很適合用在Ubuntu或Debian上,無須編譯。建置時(shí)要在Linux機(jī)器上執(zhí)行Ubuntu,使用業(yè)余用伺服機(jī)、Arduino和普通的導(dǎo)線。ROS要在Ubuntu機(jī)器上啟動(dòng),訊息則透過USB傳送到Arduino。只要安裝二進(jìn)制的ROS套件,就會(huì)在主控臺(tái)程序(像是gnome-terminal或konsole)追加以下指令,這樣Arduino系統(tǒng)就能辨識(shí)ROS函式庫。

cd~/sketchbook/libraries

rm-rfros_lib

rosrunrosserial_arduinomake_libraries.py.

Arduino的程序

接下來要將程序代碼上傳到Arduino當(dāng)中,執(zhí)行低階的伺服機(jī)控制,以便能從Linux機(jī)器操作。這時(shí)要以限制范圍內(nèi)的百分比(0.0~1.0)指定伺服機(jī)的位置。之所以使用百分比而不是寫明角度,是因?yàn)锳rduino的程序代碼限制了正確的角度,要避免在指定角度時(shí)發(fā)生沖突。

就如各位所見,使用ROS之后,一般的循環(huán)函數(shù)就會(huì)變得相當(dāng)簡單。循環(huán)函數(shù)只會(huì)訂閱(subscribe)數(shù)據(jù),任何Arduino循環(huán)都一樣。設(shè)定時(shí)要將ROS初始化,將各個(gè)ROS訊息訂閱者的訂閱叫出來。每個(gè)訂閱者會(huì)占據(jù)Arduino的RAM,數(shù)量取決于要用程序代碼做什么,以6個(gè)到12個(gè)為限。

#include

#include

#include

#include

#defineSERVOPIN3

Servoservo;

voidservo_cb(conststd_msgs::Float32&msg)

{

constfloatmin=45;

constfloatrange=90;

floatv=msg.data;

if(v>1)v=1;

if(v<0)v=0;

floatangle=min+(range*v);

servo.write(angle);

}

ros::Subscriber

ros::NodeHandlenh;

voidsetup()

{

servo.attach(SERVOPIN);

nh.initNode();

nh.subscribe(sub);

}

voidloop()

{

nh.spinOnce();

delay(1);}

接下來要設(shè)法透過Arduino在ROS的世界說話。最簡單的方法是使用機(jī)器人啟動(dòng)檔。雖然以下的檔案內(nèi)容非常簡單,但是這里要追加啟動(dòng)檔,如此一來即使是非常復(fù)雜的機(jī)器人,也能用一個(gè)指令啟動(dòng)。

$catrosservo.launch

$roslaunch./rosservo.lanch

rostopic指令可以看出ROS訊息傳送到機(jī)器人的哪個(gè)部位??戳讼旅娴某绦虼a就會(huì)發(fā)現(xiàn),「/head/tilt」可以透過Arduino使用。訊息要使用「rostopic」傳送。-1的選項(xiàng)只會(huì)發(fā)布(publish)訊息一次,通知/head/tilt傳送一個(gè)浮點(diǎn)數(shù)。

$rostopiclist

/diagnostics

/head/tilt

/rosout

/rosout_agg

$rostopicpub-1/head/tiltstd_msgs/Float320.4

$rostopicpub-1/head/tiltstd_msgs/Float320.9

這個(gè)階段當(dāng)中,能夠?qū)⑺邪l(fā)布數(shù)值到ROS的已知方法用在控制伺服機(jī)上。假如從0改成1,伺服機(jī)就會(huì)全速運(yùn)行。這本來并沒有問題,但實(shí)際上我們想要逐漸加速以達(dá)到全速,然后再逐漸減速,停在目標(biāo)角度上。假如伺服機(jī)驟然運(yùn)轉(zhuǎn),機(jī)器人的動(dòng)作就會(huì)變得僵硬,讓周圍的人嚇一跳。

用另一個(gè)節(jié)點(diǎn)平滑運(yùn)動(dòng)

Houndbot

Terry

Terry和Houndbot都是ROS機(jī)器人,以6061個(gè)鋁合金零件制造而成。項(xiàng)目的目標(biāo)是要盡量讓這些機(jī)器人自主運(yùn)動(dòng)。

以下的Python腳本程序會(huì)監(jiān)聽「/head/tilt/smooth」的訊息,朝「/head/tilt」發(fā)布許多訊息,好讓伺服機(jī)轉(zhuǎn)到目標(biāo)角度之前慢慢加速,再慢慢延遲旋轉(zhuǎn)。當(dāng)訊息抵達(dá)「/head/tilt/smooth」時(shí)一定會(huì)呼叫「moveServo_cb」。這個(gè)回調(diào)函式會(huì)從-90到+90度之間每10度產(chǎn)生1個(gè)數(shù)值,追加到角度數(shù)組當(dāng)中?!竤in()」會(huì)取這個(gè)角度,數(shù)值從-1到+1慢慢增加。該數(shù)值加1之后,范圍就會(huì)變成0到+2,再除以2之后,0到+1的曲線數(shù)值數(shù)組就完成了。然后再看看m數(shù)組當(dāng)中,每當(dāng)發(fā)布訊息時(shí),就會(huì)稍微前進(jìn)一點(diǎn),范圍在r之內(nèi),直到1*r或是全范圍為止。

#!/usr/bin/envpython

fromtimeimportsleep

importnumpyasnp

importrospy

fromstd_msgs.msgimportFloat32

currentPosition=0.5

pub=None

defmoveServo_cb(data):

globalcurrentPosition,pub

targetPosition=data.data

r=targetPosition-currentPosition

angles=np.array((range(190))[0::10])-90

m=(np.sin(angles*np.pi/180.)+1)/2

formiinnp.nditer(m):

pos=currentPosition+mi*r

print“pos:“,pos

pub.publish(pos)

sleep(0.05)

currentPosition=targetPosition

print“pos-e:“,currentPosition

pub.publish(currentPosition)

deflistener():

globalpub

rospy.init_node(‘servoencoder’,anonymous=True)

rospy.Subscriber(‘/head/tilt/smooth’,Float32,moveServo_cb)

pub=rospy.Publisher(‘/head/tilt’,Float32,queue_size=10)

rospy.spin()

if__name__==‘__main__’:

listener()

想要測試伺服機(jī)順暢的動(dòng)作,就要啟動(dòng)Python腳本,將訊息發(fā)布到「/head/tilt/smooth」,這樣一來即可檢視順暢的動(dòng)作。

$./servoencoder.py

$rostopicpub-1/head/tilt/smoothstd_msgs/Float321

$rostopicpub-1/head/tilt/smoothstd_msgs/Float320

ROS當(dāng)中的名稱也可以重新測繪。只要將「/head/tilt/smooth」重新測繪為「/head/tilt」,程序就能向伺服機(jī)發(fā)出命令,而不會(huì)意識(shí)到正弦曲線的數(shù)值在變化。

迎向未來

雖然這里只說明了簡單的伺服機(jī)控制,ROS卻有更多功能。假如想要知道妨礙機(jī)器人的東西是什么,不妨使用已經(jīng)支持ROS的Kinect。就算導(dǎo)航堆棧使用這項(xiàng)數(shù)據(jù)測繪,也可以饋送簡短的Python腳本,讓伺服機(jī)動(dòng)起來,命令機(jī)器人追蹤附近的物體。沒錯(cuò),眼睛真的會(huì)追逐物體。

Terry是室內(nèi)用機(jī)器人,搭載2個(gè)Kinect。一個(gè)專門用來導(dǎo)航,另一個(gè)則用于深度測繪。Terry使用6個(gè)Arduinos,能夠從用了ROS的網(wǎng)絡(luò)接口或PS3遙控器直接操作。

Houndbot是設(shè)計(jì)成要在戶外使用。里頭有遙控器、GPS、羅盤和ROS耳形控制器。后續(xù)計(jì)劃要搭載導(dǎo)航用的PS4雙鏡頭攝影機(jī),因?yàn)镵inect不能在陽光下使用。這臺(tái)機(jī)器人重量為20公斤。還可以追加了懸吊系統(tǒng),為此需要自行制造鋁合金客制化零件。

聲明:本文為轉(zhuǎn)載類文章,如涉及版權(quán)問題,請(qǐng)及時(shí)聯(lián)系我們刪除(QQ: 2737591964,不便之處,敬請(qǐng)諒解!

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:變頻器影響電機(jī)的因素有哪些?

下一篇:一文了解熱電阻參數(shù)選型

中國傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動(dòng)網(wǎng)(m.u63ivq3.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號(hào) | 營業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)