移動(dòng)機(jī)器人技術(shù)開發(fā)與應(yīng)用 課件 10.服務(wù)機(jī)器人綜合應(yīng)用實(shí)例_第1頁
移動(dòng)機(jī)器人技術(shù)開發(fā)與應(yīng)用 課件 10.服務(wù)機(jī)器人綜合應(yīng)用實(shí)例_第2頁
移動(dòng)機(jī)器人技術(shù)開發(fā)與應(yīng)用 課件 10.服務(wù)機(jī)器人綜合應(yīng)用實(shí)例_第3頁
移動(dòng)機(jī)器人技術(shù)開發(fā)與應(yīng)用 課件 10.服務(wù)機(jī)器人綜合應(yīng)用實(shí)例_第4頁
移動(dòng)機(jī)器人技術(shù)開發(fā)與應(yīng)用 課件 10.服務(wù)機(jī)器人綜合應(yīng)用實(shí)例_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第十章服務(wù)機(jī)器人綜合應(yīng)用目錄SCIENCEANDTECHNOLOGY01引言02多人辨識項(xiàng)目03GPSR項(xiàng)目04超市購物項(xiàng)目引言0110.1.1服務(wù)機(jī)器人發(fā)展背景技術(shù)融合驅(qū)動(dòng)創(chuàng)新服務(wù)機(jī)器人的快速發(fā)展得益于人工智能、物聯(lián)網(wǎng)、5G通信等多項(xiàng)前沿技術(shù)的深度融合,例如計(jì)算機(jī)視覺技術(shù)使機(jī)器人能夠識別復(fù)雜環(huán)境,自然語言處理技術(shù)實(shí)現(xiàn)人機(jī)無障礙交互,為服務(wù)場景落地奠定基礎(chǔ)。市場需求持續(xù)爆發(fā)隨著人口老齡化加劇和勞動(dòng)力成本上升,餐飲、醫(yī)療、物流等領(lǐng)域?qū)ψ詣?dòng)化服務(wù)的需求激增,2023年全球服務(wù)機(jī)器人市場規(guī)模已突破200億美元,年復(fù)合增長率超過25%。政策支持加速普及中國"十四五"機(jī)器人產(chǎn)業(yè)發(fā)展規(guī)劃明確提出重點(diǎn)發(fā)展服務(wù)機(jī)器人,各地政府通過補(bǔ)貼政策推動(dòng)機(jī)器人在社區(qū)養(yǎng)老、智慧醫(yī)院等場景的規(guī)?;瘧?yīng)用,形成良性發(fā)展生態(tài)。10.1.2機(jī)器人競賽推動(dòng)技術(shù)進(jìn)步算法優(yōu)化迭代平臺人才培育重要渠道硬件創(chuàng)新試驗(yàn)場如RoboCopen等國際賽事通過設(shè)置家庭服務(wù)、醫(yī)療救援等實(shí)戰(zhàn)場景,推動(dòng)SLAM(同步定位與建圖)算法精度從厘米級提升至毫米級,路徑規(guī)劃效率提高40%以上。競賽中涌現(xiàn)出柔性機(jī)械臂、多模態(tài)傳感器融合等突破性技術(shù),DARPA機(jī)器人挑戰(zhàn)賽促使抗干擾通信模塊的傳輸穩(wěn)定性達(dá)到99.99%。清華大學(xué)團(tuán)隊(duì)通過參加服務(wù)機(jī)器人競賽,開發(fā)出具有自主知識產(chǎn)權(quán)的室內(nèi)導(dǎo)航系統(tǒng),其動(dòng)態(tài)避障響應(yīng)時(shí)間縮短至0.3秒,培養(yǎng)出20余名專業(yè)研發(fā)人才。多人辨識項(xiàng)目0210.2.1任務(wù)目標(biāo)技術(shù)需求多人辨識項(xiàng)目是測試居家服務(wù)機(jī)器人能夠在陌生環(huán)境中自主地識別人。不可以手動(dòng)校準(zhǔn),機(jī)器人必須向一組人自我介紹,問他們的名字,記住他們,當(dāng)再次遇見的時(shí)候能夠認(rèn)出他們。關(guān)鍵步驟該測試的關(guān)鍵是人的檢測/識別,臉部的檢測/識別,安全導(dǎo)航,與陌生人的人機(jī)互動(dòng)。需具備功能該項(xiàng)目需要實(shí)現(xiàn)機(jī)器人基礎(chǔ)移動(dòng)功能、語音識別功能、人臉識別功能、建圖功能、導(dǎo)航功能、物品抓取功能,并將這些功能整合到ROS中。10.2.2任務(wù)、場景、硬件架構(gòu)任務(wù)列表理解名字理解所需物品拿到所需物品判斷出一個(gè)人辨別人的名字識別出人將物品給予對應(yīng)的人在指定時(shí)間內(nèi)完成所有任務(wù)10.2.3多人辨識各項(xiàng)功能(1)基礎(chǔ)移動(dòng)功能:啟動(dòng)底盤驅(qū)動(dòng):#!/bin/bash

cd

/home/robot/catkin_ws/src/dashgo/src/dashgo_driver/launch

source

~/catkin_ws/devel_isolated/setup.bash

roslaunch

driver.launch

(2)語音識別功能:使用科大訊飛的語音聽寫(iat)和語音合成(tts)功能,啟動(dòng)語音聽寫:ros::Subscriber

sub_sr

=

n.subscribe("/xfyun/iat",

10,

KeywordCB);

static

xfyun_waterplus::IATSwitch

srvIAT;

srvIAT.request.active

=

true;

srvIAT.request.duration

=

6;

clientIAT.call(srvIAT);

啟動(dòng)語音合成:sound_play::SoundClient

sc;

sc.say(inStr);

10.2.3多人辨識各項(xiàng)功能(3)人臉識別功能:

使用華為云人臉識別,由于華為云人臉識別使用python語言編寫,故在ROS中使用腳本進(jìn)行調(diào)用。

char

order[100];

sprintf(order,

"cd

~/HWFace

&&

python3

face_reco.py");

n

=

system(order);

(4)建圖功能:多人辨識項(xiàng)目需要提前構(gòu)建好地圖,啟動(dòng)建圖:#!

/bin/bash

source

~/catkin_ws/devel_isolated/setup.bash

roslaunch

cartographer_ros

demo_revo_lds.launch

(5)導(dǎo)航功能:多人辨識項(xiàng)目需要在運(yùn)行主程序前啟動(dòng)導(dǎo)航并校正自身位姿,啟動(dòng)導(dǎo)航:#!

/bin/bash

cd

/home/robot/bash

source

~/catkin_ws/devel_isolated/setup.bash

gnome-terminal

--

bash

imu.sh

sleep

1

gnome-terminal

--

bash

lidar.sh

sleep

1

gnome-terminal

--

bash

3to2.sh

sleep

1

gnome-terminal

--

bash

start_navigation.sh

sleep

1

gnome-terminal

--

bash

add_waypoint.sh

sleep

1

標(biāo)定航點(diǎn),啟動(dòng)導(dǎo)航后,使用Addwaypoints標(biāo)定一個(gè)或幾個(gè)航點(diǎn),完成后使用如下腳本保存航點(diǎn)至waypoints.xml文件:#!

/bin/bash

source

~/catkin_ws/devel_isolated/setup.bash

rosrun

waterplus_map_tools

wp_saver

10.2.3多人辨識各項(xiàng)功能(6)程序的運(yùn)行由有限狀態(tài)機(jī)判斷當(dāng)前狀態(tài),并進(jìn)行切換://有限狀態(tài)機(jī)

#define

STATE_READY

0

#define

STATE_WAIT_ENTR

1

#define

STATE_WAIT_RECO

2

#define

STATE_CONFIRM

3

#define

STATE_GOTO_EXIT

4

#define

STATE_GOTO_LOCATION

5

#define

STATE_GOTO_CMD

6

#define

STATE_WAIT_FACE

7

#define

STATE_CATCH

8

#define

STATE_PHOTO

9

#define

STATE_GOTO_BACK

10

(7)設(shè)置人名和物品關(guān)鍵詞://識別關(guān)鍵詞

static

vector<string>

arKWPerson;

static

vector<string>

arKWConfirm;

static

vector<string>

arKWObject;

static

void

Init_keywords()

{

//人名關(guān)鍵詞

arKWPerson.push_back("Alex");

arKWPerson.push_back("Angel");

arKWPerson.push_back("Edward");

//物品關(guān)鍵詞

arKWObject.push_back("herbal

tea");

arKWObject.push_back("water");

arKWObject.push_back("cola");

//yes

or

no

arKWConfirm.push_back("yes");

arKWConfirm.push_back("Yes");

arKWConfirm.push_back("Yeah");

arKWConfirm.push_back("year");

arKWConfirm.push_back("no");

arKWConfirm.push_back("No");

}

(1)進(jìn)門并介紹自己:bool

aArrived

=

Goto("start");

Speak("Please

tell

me

your

name

and

what

you

want");

10.2.4多人辨識流程切換狀態(tài),等待語音識別:nState

=

STATE_WAIT_RECO;

獲取客人說的物品和人名信息并將其保存在內(nèi)存中,等待客人確認(rèn):string

person

=

FindWord(strListen,

arKWPerson);

string

object

=

FindWord(strListen,

arKWObject);

string

strRepeat

=

"your

name

is

"

+

person

+

","

+

"you

want

"

+

object;

strcpy(obj[objnum],

object.c_str());

strcpy(per[pernum],

person.c_str());

Speak(strRepeat);

string

where

=

"please

confirm";

nState

=

STATE_CONFIRM;

10.2.4多人辨識流程(2)客人確認(rèn)后進(jìn)入拍照狀態(tài):nState

=

STATE_PHOTO;

(3)啟動(dòng)攝像頭拍照,并上傳到華為云人臉庫中:Speak("Please

don't

move");

sprintf(order,

"cd

~/HWFace

&&

python3

photo.py

%s",

per[pernum

-

1]);

//格式化命令,替換

n

=

system(order);

如此,依次識別三個(gè)客人,切換狀態(tài):nState

=

STATE_GOTO_LOCATION;

到達(dá)物品所在的地點(diǎn)并抓取物品:fArrived

=

Goto(placestr);

if

(fArrived

==

true)

{

Speak("I

am

in

the"

+

placestr);

nState

=

STATE_CATCH;

}

10.2.4多人辨識流程(4)返回指定地點(diǎn),啟動(dòng)人臉識別,識別客人:bool

fArrived;

fArrived

=

Goto("back");

char

order[100];

sprintf(order,

"cd

~/HWFace

&&

python3

face_reco.py");

n

=

system(order);

nState

=

STATE_WAIT_FACE;

(5)依次將拿到的物品給相應(yīng)的客人后,離開場地:if

(times

==

3)

nState

=

STATE_GOTO_EXIT;

GPSR項(xiàng)目0310.3.1任務(wù)目標(biāo)技術(shù)需求該項(xiàng)目是為了測試機(jī)器人的綜合能力,測試重點(diǎn)包括跟隨、定位、導(dǎo)航、抓取、人的探測以及識別、物體的探測以及識別等。在這個(gè)測試中機(jī)器人需要解決被要求的多個(gè)任務(wù)。技術(shù)難點(diǎn)是,在這個(gè)測試中,沒有預(yù)定義場景和預(yù)定義的可以由確定的基本動(dòng)作序列完成的任務(wù)。完成這個(gè)測試需要的動(dòng)作和任務(wù)都是由裁判現(xiàn)場抽取的。關(guān)鍵步驟(1)沒有特定順序的動(dòng)作集(因此這個(gè)任務(wù)不能由預(yù)先定義好的狀態(tài)機(jī)編程來完成)。(2)增強(qiáng)的語音識別、處理能力(由于任務(wù)是不確定的,因此語音也是不確定的,任務(wù)不是單純的動(dòng)作或單個(gè)物體,可能包含多個(gè)物體和動(dòng)作,例如:“將杯子放在廚房的桌子上(putthecuponthekitchentable)”。需具備功能通常來說,機(jī)器人開展業(yè)務(wù)工作需要從行動(dòng)類、物體類和位置類的集合中生成具體能力:(1)行動(dòng)集合A,例如尋找特定人、跟隨等,抓取和運(yùn)送物體等。(2)物體集合B,該集合由放在場地中的10個(gè)物體構(gòu)成。(3)位置集合L,該集合根據(jù)測試場地條件確定,如果涉及到抓取任務(wù),那么抓取的位置需在機(jī)器人的可達(dá)高度范圍內(nèi)。10.3.2任務(wù)、硬件架構(gòu)、軟件流程任務(wù)列表理解部分命令完成部分任務(wù)理解全部命令完成全部任務(wù)由陌生人下達(dá)指令10.3.3GPSR項(xiàng)目功能(1)程序啟動(dòng)時(shí)開啟語音識別、地圖導(dǎo)航功能typedef

actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction>

MoveBaseClient;

static

ros::Publisher

spk_pub;

static

ros::ServiceClient

clientIAT;

static

xfyun_waterplus::IATSwitch

srvIAT;

static

ros::ServiceClient

cliGetWPName;

static

waterplus_map_tools::GetWaypointByName

srvName;

static

int

nPersonCount

=

0;

(2)定義有限狀態(tài)機(jī)#define

STATE_WAIT_ENTR

0

//初始狀態(tài)

#define

STATE_WAIT_RECO

1

//從任務(wù)語句中判斷需要到達(dá)的位置

#define

STATE_GOTO_LOCATION

2

//到某一地點(diǎn)

#define

STATE_WAIT_ASK

3

//等待詢問

#define

STATE_CONFIRM

4

//記錄任務(wù)到txt文件中,并執(zhí)行小任務(wù)

#define

STATE_GOTO_EXIT

5

//到出口

#define

STATE_GOTO_LOCATION2

6

//到第二個(gè)地點(diǎn)

10.3.3GPSR項(xiàng)目功能(3)定義全局變量int

taskflag

=

0;//任務(wù)標(biāo)志

1-回答問題

2-回答小問題3-follow4-抓取物品

5-找東西char

strOrder[100];//記錄聽到的命令

char

obj[20];//記錄物品

char

pla[20];//記錄地點(diǎn)

char

pla2[20];//記錄拆分地點(diǎn)2

static

int

nState

=

STATE_WAIT_ENTR;

//程序啟動(dòng)時(shí)初始狀態(tài)

(4)存儲指令關(guān)鍵詞的結(jié)構(gòu)體static

vector<string>

arKWPerson;//人名關(guān)鍵詞

static

vector<string>

arKWConfirm;//回應(yīng)關(guān)鍵詞

static

vector<string>

arKWPlacement;//大地點(diǎn)(房間)關(guān)鍵詞

static

vector<string>

arKWPlacement2;//大地點(diǎn)中包含的小地點(diǎn)關(guān)鍵詞

static

vector<string>

arKWObject;//物品關(guān)鍵詞

static

vector<string>

arKWAction1;//行為關(guān)鍵詞1,對應(yīng)大地點(diǎn)

static

vector<string>

arKWAction2;//行為關(guān)鍵詞2,對應(yīng)小地點(diǎn)

static

vector<string>

arKWQuestion;//大問題關(guān)鍵詞(需要單獨(dú)詢問的問題)

static

vector<string>

arKWSmallQuestion;//小問題關(guān)鍵詞(包含在指令中的問題)

10.3.4GPSR項(xiàng)目流程程序運(yùn)行過程以機(jī)器人收到指令“grasptheHerbalteafromthediningtableanddeliverittotheleftcookingbench,將涼茶從餐桌帶到左邊灶臺”為例,進(jìn)行接下來的程序執(zhí)行。10.3.4GPSR項(xiàng)目流程起始狀態(tài):機(jī)器人自行移動(dòng)到發(fā)令點(diǎn)me,等待發(fā)令人發(fā)出指令。bool

bArrived

=

Goto("me");

Speak("Tell

me

the

command.");

nState

=

STATE_WAIT_RECO;

10.3.4GPSR項(xiàng)目流程(2)機(jī)器人接到發(fā)令人發(fā)送的指令后,從聽到的句子里尋找指令關(guān)鍵詞,并確定機(jī)器人接下來的任務(wù)(到哪些地點(diǎn),找什么人或物品,回答什么問題),播報(bào)聽到的指令,等待語音確認(rèn)。string

location

=

FindWord(strListen,

arKWPlacement);

string

location2

=

FindWord(strListen,

arKWPlacement2);

string

action1

=

FindWord(strListen,

arKWAction1);

string

action2

=

FindWord(strListen,

arKWAction2);

string

object

=

FindWord(strListen,

arKWObject);

Speak("Please

confirm!");

nState

=

STATE_CONFIRM;

10.3.4GPSR項(xiàng)目流程(3)發(fā)令人反饋語音確認(rèn)指令后,機(jī)器人對收到的確認(rèn)語句進(jìn)行判斷。如果確認(rèn)語句是yes、yeah等,則解析第一個(gè)任務(wù)關(guān)鍵詞,確定taskflag(此處taskflag為4-拿東西),并導(dǎo)航到第一個(gè)目標(biāo)點(diǎn)(此處為diningtable);如果語句是no,則要求重新下發(fā)指令。10.3.4GPSR項(xiàng)目流程if

(confirm

==

"yes"

||

confirm

==

"Yes"

||

confirm

==

"Yeah")

{

if

(strstr(strOrder,

"answer")

!=

NULL)

{

taskflag

=

1;

//回答大問題

}

else

if

(strstr(strOrder,

"say")

!=

NULL

||

strstr(strOrder,

"tell")

!=

NULL

||

strstr(strOrder,

"speak")

!=

NULL)

{

taskflag

=

2;

//回答小問題

}

else

if

(action2

==

"follow"

||

action2

==

"followed")

{

taskflag

=

3;

//follow

}

else

if

(action2

==

"take"

||

action2

==

"Take"

||

action2

==

"carry"

||

action2

==

"Carry"

||

action2

==

"get"

||

action2

==

"Get"

||

action2

==

"grasp"

||

action2

==

"Grasp")

{

taskflag

=

4;

//拿東西

}

else

if

(strstr(strOrder,

"look

for")

!=

NULL

||

strstr(strOrder,

"find")

!=

NULL

||

strstr(strOrder,

"Get

into")

!=

NULL)

{

taskflag

=

5;

//找東西

}

nState

=

STATE_GOTO_LOCATION;

}

if

(confirm

==

"no"

||

confirm

==

"No")

{

Speak("ok,tell

me

the

command

again");

nState

=

STATE_WAIT_RECO;

}

(4)從發(fā)令點(diǎn)導(dǎo)航到第一個(gè)目標(biāo)點(diǎn)dinningtable10.3.4GPSR項(xiàng)目流程(5)機(jī)器人導(dǎo)航到目標(biāo)點(diǎn)后,根據(jù)taskflag的值完成相應(yīng)的小任務(wù)(此處任務(wù)為將涼茶帶到下一目標(biāo)點(diǎn)leftcookingbench,taskflag為4:抓取涼茶),切換狀態(tài)為STATE_GOTO_LOCATION2。

if

(fArrived1

==

true)

{

fArrived2

=

Goto(placestr);

if

(fArrived2

==

true)

{

Speak("I

am

in

the

"

+

placestr);

usleep(1

*

1000

*

1000);

if

(taskflag

==

1)

{

//大問題

Speak("I

have

found

you");

usleep(1

*

1000

*

1000);

Speak("Please

tell

me

the

question");

nState

=

STATE_WAIT_ASK;

bGotoExit

=

true;

}

else

if

(taskflag

==

2)

{

//小問題

if

(smallQ

==

"your

team")

{

Speak("SDJU

team");

printf("SDJU

team");

m

=

fprintf(fp1,

"answer:

%s\n",

"SDJU

team");

}

nState

=

STATE_GOTO_LOCATION2;

}

}10.3.4GPSR項(xiàng)目流程(6)機(jī)器人完成任務(wù)后,如果指令中需要去到另一個(gè)地點(diǎn),則導(dǎo)航到該點(diǎn),如果機(jī)械爪抓取了一個(gè)物品,則到達(dá)導(dǎo)航點(diǎn)后運(yùn)行fang.sh腳本將機(jī)械爪上的物品放下,切換狀態(tài)為STATE_GOTO_EXIT。if

(nState

==

STATE_GOTO_LOCATION2)

{

int

n;

bool

fArrived;

string

placestr2

=

pla2;

printf("pla2:%s\n",

pla2);

fArrived

=

Goto(placestr2);

if

(fArrived

==

true)

{

Speak("Here

you

are!");

n

=

system("bash

/home/robot/fang.sh");

nState

=

STATE_GOTO_EXIT;

bGotoExit

=

true;

}

}

10.3.4GPSR項(xiàng)目流程(7)程序判別如果狀態(tài)為STATE_GOTO_EXIT,則離場if

(nState

==

STATE_GOTO_EXIT

&&

bGotoExit

==

true)

{

bGotoExit

=

false;

bool

fArrived;

//識別完畢,關(guān)閉語音識別

srvIAT.request.active

=

false;

clientIAT.call(srvIAT);

Speak("I

am

leaving

to

exit.");

system("cd

/home/robot/gpsrorder

&&

sh

gpsr_pdf.sh");

fArrived

=

Goto("exit");

}

超市購物項(xiàng)目0410.4.1任務(wù)目標(biāo)引導(dǎo)階段機(jī)器人通過引導(dǎo)穿過商店(為確保比賽的順利進(jìn)行,允許引導(dǎo)者為其中一名隊(duì)員)。起點(diǎn)為一些固定的入口,比如超市的主入口,引導(dǎo)者向機(jī)器人介紹3個(gè)地點(diǎn)。在每個(gè)地點(diǎn),引導(dǎo)者引導(dǎo)機(jī)器人到一個(gè)特定的貨架處,告訴機(jī)器人需要獲取貨架上的哪一個(gè)物體。該物體取自機(jī)器人可操作的物品欄(由該隊(duì)伍自行指定)。引導(dǎo)者需要在至少50cm處告知機(jī)器人可操作的物體。至于引導(dǎo)者使用何種方式告知機(jī)器人是沒有限制的,比如,可以用手指指向物體或者僅僅是看向物體,機(jī)器人也需要有明確的反應(yīng),語音方式回復(fù),如果回復(fù)不清楚,可以查看PDF記錄文件。3個(gè)地點(diǎn)都到達(dá)后,引導(dǎo)者引導(dǎo)機(jī)器人去(預(yù)先指定的)收銀臺。操作和導(dǎo)航階段該階段,由2位在收銀臺附近位置的志愿者告知機(jī)器人去貨架拿取物體。但機(jī)器人要求走到這2位志愿者面前詢問所需的物品。機(jī)器人需要從相應(yīng)的貨架處取回裁判指定的2個(gè)物體,并且將它交給在收銀臺等候的志愿者。設(shè)想一下,比如你忘了一些東西,想要機(jī)器人去幫你拿過來。2個(gè)物體都取回后,機(jī)器人到達(dá)收銀臺區(qū)域,結(jié)束。其他引導(dǎo)者應(yīng)該以自然的方式行走,例如:不能往回走。該比賽可以安排在任何真正的商店或超市進(jìn)行。如果后者沒有可能的話,可在任意一個(gè)包含多個(gè)貨架的房間進(jìn)行測試。唯一的要求是,這個(gè)房間不是其他項(xiàng)目比賽場地的一部分,在該項(xiàng)比賽開始前所有隊(duì)伍應(yīng)該不知道該比賽場地。比賽用的場地將會(huì)由組織委員會(huì)決定,如貨架位置,收銀臺位置,比賽開始和結(jié)束位置。出于安全原因,參賽隊(duì)?wèi)?yīng)該派出第二個(gè)成員需要跟著機(jī)器人及其引導(dǎo)者。10.4.2原理分析環(huán)境地圖構(gòu)建機(jī)器人來到未知環(huán)境中的未知位置,需跟隨引導(dǎo)人邊移動(dòng)邊描繪出環(huán)境的完全地圖,所謂完全的地圖是指不受障礙行進(jìn)到房間可進(jìn)入的每個(gè)角落。在此項(xiàng)目的跟隨引導(dǎo)階段,機(jī)器人需開啟slam功能對周圍環(huán)境進(jìn)行掃描并將場景保存為二維柵格地圖,期間需要開啟激光雷達(dá)產(chǎn)生掃描點(diǎn)云生成地圖,同時(shí)還需要輪式里程計(jì)、IMU等相對位姿推估傳感器進(jìn)行位移測量,以及開啟輪式底盤移動(dòng)機(jī)器人。導(dǎo)航機(jī)器人需要通過語音交互獲取導(dǎo)航點(diǎn)的信息,待導(dǎo)航點(diǎn)的坐標(biāo)獲取完成,需要找到一條最合適的路徑,這屬于路徑規(guī)劃的內(nèi)容,主要包括全局路徑規(guī)劃與局部規(guī)劃。人體跟隨機(jī)器人人體跟隨功能包含了兩個(gè)步驟:1.知道目標(biāo)在哪2.能跟著目標(biāo)運(yùn)動(dòng)。在跟隨的過程中,需要處理障礙物的躲避,因此需要添加兩個(gè)模塊,識別障礙,躲避障礙。10.4.3硬件及軟件流程10.4.4超市購物項(xiàng)目功能(1)人體跟隨在比賽開始階段,機(jī)器人模仿在超市購物的場景,跟隨人體并開啟語音交互。這個(gè)階段主要完成以下兩個(gè)任務(wù):1)在跟隨的同時(shí)對場景進(jìn)行二維平面建圖;2)通過語音交互,記錄下“超市”貨架上的物品在地圖上的坐標(biāo)。ros::init(argc,

argv,

"wpb_home_shopping");

ros::NodeHandle

n;

ros::Subscriber

sub_sr

=

n.subscribe("/xfyun/iat",

10,

KeywordCB);

cliGetWPName

=

n.serviceClient<waterplus_map_tools::GetWaypointByName>("/waterplus/get_waypoint_name");

add_waypoint_pub

=

n.advertise<waterplus_map_tools::Waypoint>("/waterplus/add_waypoint",

1);

spk_pub

=

n.advertise<sound_play::SoundRequest>("/robotsound",

20);

spk_msg.sound

=

sound_play::SoundRequest::SAY;

spk_mand

=

sound_play::SoundRequest::PLAY_ONCE;

vel_pub

=

n.advertise<geometry_msgs::Twist>("/cmd_vel",

10);

10.4.4超市購物項(xiàng)目功能follow.sh腳本中包含兩部分腳本,它們分別是video1.sh和follower.sh。video1.sh是kinectV1驅(qū)動(dòng)程序,它的主要功能是使能kinect攝像頭。video1.sh

#!

/bin/bash

cd

/home/robot/batkin/src/freenect_stack

source

~/batkin/devel_isolated/setup.bash

roslaunch

freenect_launch

freenect.launch

跟隨:這部分主要通過腳本follow.sh運(yùn)行,腳本內(nèi)容如下:follow.sh

#!

/bin/bash

gnome-terminal

--

bash

video1.sh

sleep

1

gnome-terminal

--

bash

follower.sh

sleep

1

follower.sh腳本的主要功能是啟動(dòng)follow跟隨功能。follower.sh

#!

/bin/bash

cd

/home/robot/batkin/src/turtlebot_apps/turtlebot_follower/launch

source

~/batkin/devel/setup.bash

roslaunch

follower.launch

10.4.4超市購物項(xiàng)目功能(2)建圖階段在此階段,機(jī)器人在跟隨人的同時(shí)完成同步定位與建圖slam,此功能主要包括激光雷達(dá)、慣性測量單元IMU與機(jī)器人底盤輪式里程計(jì)互相協(xié)同完成。其中激光雷達(dá)用到的腳本包括lidar.sh、imu.sh和mapping.sh三個(gè)文件。運(yùn)行l(wèi)idar.sh腳本文件的代碼如下:

#!

/bin/bash

source

~/batkin/devel_isolated/setup.bash

roslaunch

/home/robot/batkin/src/ros_rslidar/rslidar_pointcloud/launch/rs_lidar_16.launch

運(yùn)行imu.sh腳本文件的代碼如下:

#!

/bin/bash

source

~/batkin/devel_isolated/setup.bash

roslaunch

stim

stim.launch

10.4.4超市購物項(xiàng)目功能(2)建圖階段在此階段,機(jī)器人在跟隨人的同時(shí)完成同步定位與建圖slam,此功能主要包括激光雷達(dá)、慣性測量單元IMU與機(jī)器人底盤輪式里程計(jì)互相協(xié)同完成。其中激光雷達(dá)用到的腳本包括lidar.sh、imu.sh和mapping.sh三個(gè)文件。運(yùn)行l(wèi)idar.sh腳本文件的代碼如下:

#!

/bin/bash

source

~/batkin/devel_isolated/setup.bash

roslaunch

/home/robot/batkin/src/ros_rslidar/rslidar_pointcloud/launch/rs_lidar_16.launch

運(yùn)行imu.sh腳本文件的代碼如下:

#!

/bin/bash

source

~/batkin/devel_isolated/setup.bash

roslaunch

stim

stim.launch

運(yùn)行建圖包mapping.sh腳本文件的代碼如下:

#!

/bin/bash

gnome-terminal

--

bash

imu.sh

sleep

1

gnome-terminal

--

bash

lidar.sh

sleep

1

gnome-terminal

--

bash

3to2.sh

sleep

1

gnome-terminal

--

bash

creat_map.sh

10.4.4超市購物項(xiàng)目功能(2)建圖階段在此階段,機(jī)器人在跟隨人的同時(shí)完成同步定位與建圖slam,此功能主要包括激光雷達(dá)、慣性測量單元IMU與機(jī)器人底盤輪式里程計(jì)互相協(xié)同完成。在建圖階段,還需要通過語音交互的方式對特定點(diǎn)進(jìn)行記錄,其中監(jiān)聽語音的主要函數(shù)是FindWord(stringinSentence,vector<string>&arWord),主要功能為監(jiān)聽語音中的關(guān)鍵語句,通過識別關(guān)鍵詞進(jìn)行語義識別,函數(shù)定義為:

//

從句子里找arKeyword里存在的關(guān)鍵詞

voidFindWord(stringinSentence,vector<string>&arWord)

static

string

FindKeyword(string

inSentence)

{

string

res

=

"";

int

nSize

=

arKeyword.size();

for

(int

i

=

0;

i

<

nSize;

i++)

{

int

nFindIndex

=

inSentence.find(arKeyword[i]);

if

(nFindIndex

>=

0)

{

res

=

arKeyword[i];

break;

}

}

return

res;

}

10.4.4超市購物項(xiàng)目功能當(dāng)機(jī)器人獲取到相應(yīng)語音信息,需要將當(dāng)前位置保存為新航點(diǎn),主要核心函數(shù)為AddNewWaypoint(stringinStr),其主要功能為記錄下當(dāng)前坐標(biāo),

并與語音中的地名相匹配。函數(shù)定義如下:

//

將機(jī)器人當(dāng)前位置保存為新航點(diǎn)

void

AddNewWaypoint(string

inStr)

{

tf::TransformListener

listener;

tf::StampedTransform

transform;

try

{

listener.waitForTransform("/map",

"/base_link",

ros::Time(0),

ros::Duration(10.0));

listener.lookupTransform("/map",

"/base_link",

ros::Time(0),

transform);

}

catch

(tf::TransformException

&ex)

{

ROS_ERROR("[lookupTransform]

%s",

ex.what());

return;

}

float

tx

=

transform.getOrigin().x();

float

ty

=

transform.getOrigin().y();

tf::Stamped<tf::Pose>

p

=

tf::Stamped<tf::Pose>(tf::Pose(transform.getRotation(),

tf::Point(tx,

ty,

0.0)),

ros::Time::now(),

"map");

geometry_msgs::PoseStamped

new_pos;

tf::poseStampedTFToMsg(p,

new_pos);

waterplus_map_tools::Waypoint

new_waypoint;

new_

=

inStr;

new_waypoint.pose

=

new_pos.pose;

add_waypoint_pub.publish(new_waypoint);

ROS_WARN("[New

Waypoint]

%s

(

%.2f

,

%.2f

)",

new_.c_str(),

tx,

ty);

}

10.4.4超市購物項(xiàng)目功能(3)語音播報(bào) 語音播報(bào)是指機(jī)器人獲取人的語音指令之后,需要做出的語音反饋,如“ok”、”Whatdoyouwant?”、”O(jiān)K.Iwillgotogetitforyou.”等等,通常需要用到語音播放函數(shù)speak,函數(shù)體為staticvoidSpeak(stringinStr)。以下是函數(shù)定義:

static

void

Speak(string

inStr)

int

tmp;

char

order[100];

sprintf(order,

"rosrun

sound_play

say.py

'%s'",

inStr.c_str());

printf("order:%s\n",

order);

int

n

=

system(order);

通常需要調(diào)用say.py腳本來播報(bào)相應(yīng)order指令。10.4.4超市購物項(xiàng)目功能(4)定點(diǎn)導(dǎo)航待機(jī)器人到達(dá)收銀臺,完成建圖與保存相應(yīng)點(diǎn)的任務(wù),此時(shí)需要獲取志愿者的指令,并從指令中提取關(guān)鍵地點(diǎn)(如apple,lemontea),隨后返回這些導(dǎo)航點(diǎn)取回相應(yīng)物品。定點(diǎn)導(dǎo)航主要用到了Goto函數(shù)。定義如下:

static

bool

Goto(string

inStr)

string

strGoto

=

inStr;

srvN

=

strGoto;

if

(cliGetWPName.call(srvName))

{

std::string

name

=

srvN;

float

x

=

srvName.response.pose.position.x;

float

y

=

srvName.response.pose.position.y;

ROS_INFO("Get_wp_name:

name

=

%s

(%.2f,%.2f)",

strGoto.c_str(),

x,

y);

MoveBaseClient

ac("move_base",

true);

if

(!ac.waitForServer(ros::Duration(5.0)))

{

ROS_INFO("The

move_base

action

server

is

no

running.

action

abort...");

return

false;

}

else

{

move_base_msgs::MoveBaseGoal

goal;

goal.target_pose.header.frame_id

=

"map";

goal.target_pose.header.stamp

=

ros::Time::now();

goal.target_pose.pose

=

srvName.response.pose;

ac.sendGoal(goal);

ac.waitForResult();

if

(ac.getState()

==

actionlib::SimpleClientGoalState::SUCCEEDED)

{

ROS_INFO("Arrived

at

%s!",

strGoto.c_str());

return

true;

}

else

{

ROS_INFO("Failed

to

get

to

%s

...",

strGoto.c_str());

return

false;

}

}

}

else

{

ROS_ERROR("Failed

to

call

service

GetWaypointByName");

return

false;

}

10.4.4超市購物項(xiàng)目功能待機(jī)器人獲取到這些導(dǎo)航點(diǎn),需要自主導(dǎo)航到這些點(diǎn):

//

從識別結(jié)果句子中查找物品(航點(diǎn))關(guān)鍵詞

string

strKeyword

=

FindKeyword(msg->data);

int

nLenOfKW

=

strlen(strKeyword.c_str());

if

(nLenOfKW

>

0)

{

//

發(fā)現(xiàn)物品(航點(diǎn))關(guān)鍵詞

strGoto

=

strKeyword;

string

strSpeak

=

strKeyword

+

"

.

OK.

I

will

go

to

get

it

for

you.";

Speak(strSpeak);

printf("

OK.

I

will

go

to

get

it

for

you.\n");

nState

=

STATE_GOTO;

}

然后返回到收銀臺:if

(ac.getState()

==

actionlib::SimpleClientGoalState::SUCCEEDED)

{

ROS_INFO("Arrived

at

%s!",

strGoto.c_str());

Speak("Hi,master.

This

is

what

you

wanted.");

nState

=

STATE_PASS;

//nDelay

=

0;

}

else

{

ROS_INFO("Failed

to

get

to

%s

...",

strGoto.c_str());

Speak("Failed

to

go

to

the

master.");

//nState

=

STATE_ASK;

}

10.4.4超市購物項(xiàng)目功能離場:待導(dǎo)航任務(wù)完成,結(jié)束任務(wù),機(jī)器人離場GPSR項(xiàng)目0510.5.1技術(shù)需求項(xiàng)目概要該項(xiàng)目是為了測試機(jī)器人的綜合能力,測試重點(diǎn)包括跟隨、定位、導(dǎo)航、抓取、人的探測以及識別、物體的探測以及識別等。在這個(gè)測試中機(jī)器人需要解決被要求的多個(gè)任務(wù)。技術(shù)難點(diǎn)是,在這個(gè)測試中,沒有預(yù)定義場景和預(yù)定義的可以由確定的基本動(dòng)作序列完成的任務(wù)。完成這個(gè)測試需要的動(dòng)作和任務(wù)都是由裁判現(xiàn)場抽取的。重點(diǎn)考察(1)沒有特定順序的動(dòng)作集(因此這個(gè)任務(wù)不能由預(yù)先定義好的狀態(tài)機(jī)編程來完成)。(2)增強(qiáng)的語音識別、處理能力(由于任務(wù)是不確定的,因此語音也是不確定的,任務(wù)不是單純的動(dòng)作或單個(gè)物體,可能包含多個(gè)物體和動(dòng)作,例如:“將杯子放在廚房的桌子上(putthecuponthekitchentable)”。所有機(jī)器人的能力形成通常來說,機(jī)器人開展業(yè)務(wù)工作需要從行動(dòng)類、物體類和位置類的集合中生成具體能力:(1)行動(dòng)集合A,例如尋找特定人、跟隨等,抓取和運(yùn)送物體等。(2)物體集合B,該集合由放在場地中的10個(gè)物體構(gòu)成。(3)位置集合L,該集合根據(jù)測試場地條件確定,如果涉及到抓取任務(wù),那么抓取的位置需在機(jī)器人的可達(dá)高度范圍內(nèi)。10.5.2原理分析自主進(jìn)場機(jī)器人需自主進(jìn)場,其任務(wù)可以由測試人員對機(jī)器人下達(dá),可以考慮相應(yīng)加分。任務(wù)是由一個(gè)標(biāo)準(zhǔn)的生成器生成的。下達(dá)任務(wù)要求完全按照給定的任務(wù)一字不漏地下達(dá)給機(jī)器人,向機(jī)器人提出的問題不能是類似“第一個(gè)任務(wù)是什么?”“第二個(gè)任務(wù)是什么?”,所有給定的任務(wù)都是一個(gè)基本任務(wù)的組合。開門為啟動(dòng)信號。過程在下達(dá)任務(wù)過程中,如果沒有按照給定的句子一字不漏的下達(dá),視為失敗。如果重復(fù)下達(dá)任務(wù)3次之后,機(jī)器人依然沒有正確理解,則視為本次測試失敗。機(jī)器人首先自主到達(dá)場內(nèi)的指定位置。到達(dá)指定地點(diǎn)之后,機(jī)器人被給予包含中文或者英文的指令,該句子包含2-3個(gè)任務(wù)。獲取任務(wù)機(jī)器人識別整個(gè)句子之后,應(yīng)該完整的將其復(fù)述(意思一樣就可以)出來才能被認(rèn)為是理解了命令。機(jī)器人理解的任務(wù)則記錄到pdf文件中供實(shí)驗(yàn)者查看。10.5.3硬件及軟件流程10.5.4GPSR項(xiàng)目初始化(1)程序啟動(dòng)時(shí)開啟語音識別、地圖導(dǎo)航功能typedef

actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction>

MoveBaseClient;

static

ros::Publisher

spk_pub;

static

ros::ServiceClient

clientIAT;

static

xfyun_waterplus::IATSwitch

srvIAT;

static

ros::ServiceClient

cliGetWPName;

static

waterplus_map_tools::GetWaypointByName

srvName;

static

int

nPersonCount

=

0;

(2)定義有限狀態(tài)機(jī)#define

STATE_WAIT_ENTR

0

//初始狀態(tài)

#define

STATE_WAIT_RECO

1

//從任務(wù)語句中判斷需要到達(dá)的位置

#define

STATE_GOTO_LOCATION

2

//到某一地點(diǎn)

#define

STATE_WAIT_ASK

3

//等待詢問

#define

STATE_CONFIRM

4

//記錄任務(wù)到txt文件中,并執(zhí)行小任務(wù)

#define

STATE_GOTO_EXIT

5

//到出口

#define

STATE_GOTO_LOCATION2

6

//到第二個(gè)地點(diǎn)

10.5.4GPSR項(xiàng)目初始化(3)定義全局變量int

taskflag

=

0;//任務(wù)標(biāo)志

1-回答問題

2-回答小問題3-follow4-抓取物品

5-找東西char

strOrder[100];//記錄聽到的命令

char

obj[20];//記錄物品

char

pla[20];//記錄地點(diǎn)

char

pla2[20];//記錄拆分地點(diǎn)2

static

int

nState

=

STATE_WAIT_ENTR;

//程序啟動(dòng)時(shí)初始狀態(tài)

(4)存儲指令關(guān)鍵詞的結(jié)構(gòu)體static

vector<string>

arKWPerson;//人名關(guān)鍵詞

static

vector<string>

arKWConfirm;//回應(yīng)關(guān)鍵詞

static

vector<string>

arKWPlacement;//大地點(diǎn)(房間)關(guān)鍵詞

static

vector<string>

arKWPlacement2;//大地點(diǎn)中包含的小地點(diǎn)關(guān)鍵詞

static

vector<string>

arKWObject;//物品關(guān)鍵詞

static

vector<string>

arKWAction1;//行為關(guān)鍵詞1,對應(yīng)大地點(diǎn)

static

vector<string>

arKWAction2;//行為關(guān)鍵詞2,對應(yīng)小地點(diǎn)

static

vector<string>

arKWQuestion;//大問題關(guān)鍵詞(需要單獨(dú)詢問的問題)

static

vector<string>

arKWSmallQuestion;//小問題關(guān)鍵詞(包含在指令中的問題)

10.5.5GPSR項(xiàng)目流程程序運(yùn)行過程以機(jī)器人收到指令“grasptheHerbalteafromthediningtableanddeliverittotheleftcookingbench,將涼茶從餐桌帶到左邊灶臺”為例,進(jìn)行接下來的程序執(zhí)行。10.5.5GPSR項(xiàng)目流程起始狀態(tài):機(jī)器人自行移動(dòng)到發(fā)令點(diǎn)me,等待發(fā)令人發(fā)出指令。bool

bArrived

=

Goto("me");

Speak("Tell

me

the

command.");

nState

=

STATE_WAIT_RECO;

10.5.5GPSR項(xiàng)目流程(2)機(jī)器人接到發(fā)令人發(fā)送的指令后,從聽到的句子里尋找指令關(guān)鍵詞,并確定機(jī)器人接下來的任務(wù)(到哪些地點(diǎn),找什么人或物品,回答什么問題),播報(bào)聽到的指令,等待語音確認(rèn)。string

location

=

FindWord(strListen,

arKWPlacement);

string

location2

=

FindWord(strListen,

arKWPlacement2);

string

action1

=

FindWord(strListen,

arKWAction1);

string

action2

=

FindWord(strListen,

arKWAction2);

string

object

=

FindWord(strListen,

arKWObject);

Speak("Please

confirm!");

nState

=

STATE_CONFIRM;

10.5.5GPSR項(xiàng)目流程(3)發(fā)令人反饋語音確認(rèn)指令后,機(jī)器人對收到的確認(rèn)語句進(jìn)行判斷。如果確認(rèn)語句是yes、yeah等,則解析第一個(gè)任務(wù)關(guān)鍵詞,確定taskflag(此處taskflag為4-拿東西),并導(dǎo)航到第一個(gè)目標(biāo)點(diǎn)(此處為diningtable);如果語句是no,則要求重新下發(fā)指令。10.5.5GPSR項(xiàng)目流程if

(confirm

==

"yes"

||

confirm

==

"Yes"

||

confirm

==

"Yeah")

{

if

(strstr(strOrder,

"answer")

!=

NULL)

{

taskflag

=

1;

//回答大問題

}

else

if

(strstr(strOrder,

"say")

!=

NULL

||

strstr(strOrder,

"tell")

!=

NULL

||

strstr(strOrder,

"speak")

!=

NULL)

{

taskflag

=

2;

//回答小問題

}

else

if

(action2

==

"follow"

||

action2

==

"followed")

{

taskflag

=

3;

//follow

}

else

i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論