




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行從業(yè)資格考試和初會(huì)及答案解析
- 大專中醫(yī)護(hù)理題庫及答案解析
- 城鄉(xiāng)建設(shè)安全考試題庫及答案解析
- 回轉(zhuǎn)窯安全月培訓(xùn)試題及答案解析
- 本科電大護(hù)理倫理題庫及答案解析
- 八年級生物上冊教學(xué)計(jì)劃范文
- 教師樓購房合同(標(biāo)準(zhǔn)版)
- 防疫防控安全員培訓(xùn)試題及答案解析
- 放射工作人員檔案管理流程
- 重點(diǎn)高中理科模擬考試試卷匯編
- 公安矛盾糾紛化解課件
- 廉政風(fēng)險(xiǎn)防控知識講座
- 感染性休克診治流程
- 2025年恒豐銀行筆試題庫及答案
- 2025年國企財(cái)務(wù)崗位筆試題目及答案
- 2025年金控集團(tuán)筆試試題及答案
- 冠心病人飲食健康管理
- 學(xué)堂在線 海權(quán)與制海權(quán) 章節(jié)測試答案
- 2025年陜西省中考數(shù)學(xué)試題卷(含答案詳解)
- 《檢驗(yàn)檢測機(jī)構(gòu)資質(zhì)認(rèn)定評審準(zhǔn)則》試題(附答案)
- 六年級數(shù)學(xué)考試技能提升教學(xué)措施
評論
0/150
提交評論