當(dāng)前位置:首頁 > 工業(yè)控制 > 工業(yè)控制技術(shù)文庫
[導(dǎo)讀] ROS(Robot OperatingSystem)是開源的機器人系統(tǒng)平臺。使用這個之后,機器人就可以看見東西、測繪、導(dǎo)航,或是以最新的算法作用于周圍的環(huán)境當(dāng)中。假如想要制造復(fù)雜的機器人,已經(jīng)準(zhǔn)

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

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

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

cd~/sketchbook/libraries

rm-rf ros_lib

rosrunrosserial_arduino make_l ibraries.py 。

Arduino的程序

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

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

#include

#include

#include

#include

#define SERVOPIN 3

Servo servo;

void servo_cb( const std_msgs::Float32& msg )

{

const float min = 45;

const float range = 90;

float v = msg.data;

if( v 》 1 ) v = 1;

if( v 《 0 ) v = 0;

float angle = min + (range * v);

servo.write(angle);

}

ros::Subscriber

ros::NodeHandle nh;

void setup()

{

servo.attach(SERVOPIN);

nh.initNode();

nh.subscribe(sub);

}

void loop()

{

nh.spinOnce();

delay(1); }

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

$ cat rosservo.launch

$ roslaunch 。/rosservo.lanch

rostopic指令可以看出ROS訊息傳送到機器人的哪個部位。看了下面的程序代碼就會發(fā)現(xiàn),「/head/TIlt」可以透過Arduino使用。訊息要使用「rostopic」傳送。-1的選項只會發(fā)布(publish)訊息一次,通知/head/TIlt傳送一個浮點數(shù)。

$ rostopic list

/diagnosTIcs

/head/TIlt

/rosout

/rosout_agg

$ rostopic pub -1 /head/tiltstd_msgs/Float32 0.4

$ rostopic pub -1 /head/tilt std_msgs/Float320.9

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

用另一個節(jié)點平滑運動

Houndbot

Terry

Terry和Houndbot都是ROS機器人,以6061個鋁合金零件制造而成。項目的目標(biāo)是要盡量讓這些機器人自主運動。

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

#!/usr/bin/env python

from time import sleep

import numpy as np

import rospy

from std_msgs.msg import Float32

currentPosition = 0.5

pub = None

def moveServo_cb(data):

global currentPosition, pub

targetPosition = data.data

r = targetPosition - currentPosition

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

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

for mi in np.nditer(m):

pos = currentPosition + mi*r

print “pos: “, pos

pub.publish(pos)

sleep(0.05)

currentPosition = targetPosition

print “pos-e: “, currentPosition

pub.publish(currentPosition)

def listener():

global pub

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

rospy.Subscriber(‘/head/tilt/smooth’,F(xiàn)loat32, moveServo_cb)

pub = rospy.Publisher(‘/head/tilt’,F(xiàn)loat32, queue_size=10)

rospy.spin()

if __name__ == ‘__main__’:

listener()

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

$ 。/servoencoder.py

$ rostopic pub -1 /head/tilt/smoothstd_msgs/Float32 1

$ rostopic pub -1 /head/tilt/smoothstd_msgs/Float32 0

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

迎向未來

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

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

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

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉