肖家立, 劉俊華, 陳東偉, 周肖樹, 黃哲
(北京理工大學 珠海學院, 珠海 519088)
隨著社會的發展,我國人口結構逐漸快速老化,且子女因學習工作忙碌而無暇照顧老人,因此如何保障老人的生理和心理需求值得人們研究。雖然機器人的發展迅速,但是對于家庭服務方面仍然不足以滿足人們的需求,特別是在生理健康指標的監測和情感識別方面,具有情感交互的服務型機器人是一個突破口。將健康監測與情感交互結合在機器人身上可以成為實現空巢老人監護的工具,并結合云平臺、網絡可以有效解決空巢老人的生理以及心理需求[1-2]。機器人本身的計算能力有限,而人工智能技術往往需要大數據和分布式運算的支持,云平臺的存在, 大大提高了機器人的運行處理速度,很大程度上降低了機器人的壓力。為此,我們研發了面向空巢老人的健康情感服務云端機器人原型系統。通過面向空巢老人的健康情感服務云端機器人原型系統能夠實現語言交互使其能夠成為家庭的成員陪伴老人聊天、玩游戲、聽音樂等,同時它能夠服務于老人,能夠幫助老人搬運簡單的物品。
面向空巢老人的健康情感服務云端機器人原型系統機器人端,項目基于ROS (Robot Operating System)框架,ROS是一種分布式的處理框架,并集成了很多軟件和算法,提高了機器人代碼的復用率,是現今發展最快,應用最廣的主流機器人操作系統[3]。基于 ROS 框架的機器人可以通過其豐富的社區資源加快開發的速度,并且憑借其松耦合的特點可以使更多傳感器可以被使用在其中,豐富其功能,而且也不用過于擔心因開發語言而帶來的編碼轉換問題。
整個機器人系統包括以下幾個部分、1.機器人、2.生理數據采集設備、3.技能家電設備、4.后臺數據轉發及管理。機器人利用攝像頭、生理數據采集傳感器等來采集老人的心情、血氧、呼吸等生理數據,然后通過進一步的處理判定生理數據的范圍,再根據這些生理數據做出相應的反饋例如語音播報采集結果,匯報通知親人,溫馨提醒等。同時機器人可以接入智能家居控制模塊。機器人通過監聽環境中的語音控制進行判斷,當接收到控制家電命令后將控制命令發送到后臺服務器。服務器接收到控制命令再轉發至目標智能設備中。整個系統的整體框架圖,如圖1所示。

圖1 系統框架圖
系統硬件部分:本項目中機器人底盤使用了成形的ROS機器人底盤Kobuki,實現基本的機器人運動。機器視覺則使用Kinect來獲取圖像信息進而實現避障、構建地圖、物體識別等[4]。機器人控制部分則使用筆記本來進行數據處理以及轉發等。理療數據采集方面使用的是低成本醫療設備,實現對相關數據的采集,同時實現將數據傳送至后臺服務器上,或者傳輸至移動終端。設備圖,如圖2所示。

圖2 設備圖
服務機器人系統是基于Linux下的ROS(Robot Operating System)來實現的。其中機器人內部則由以下幾個模塊組成:底盤運動及定位導航模塊、機器視覺模塊、語音交互模塊、界面交互模塊。機器人的各個模塊獨立運行,但卻又相互相成,每個模塊將各種的環境信息進行采集然后再通過發送給控制模塊,控制模塊通過各種環境信息進行最終判斷做出反應,如圖3所示。
語音交互模塊結合科大訊飛的語言功能包技術,本項目中使用了語音識別、以及圖靈機器人的語義識別、語音合成等功能模塊。配合了ROS機器人操作系統,將3個功能結合起來,并且使用離線與在線功能結合使整個語音交互系統更加靈活,以及可控性更加方便。整個語音系統的框架圖如圖4所示。
連續語音聽寫節點,使用ALSA編程調用系統麥克風設備監聽環境聲音,在監聽過程中會判斷會話斷點。當檢測到斷點,即在連續說話過程中停止說話,程序會結束監聽,并上傳監聽得到的音頻文件,等待服務器返回結果。服務器返回音頻文件轉換成文字的結果(字符串)。最后把結果通過 ROS的話題節點功能,送往下一個對應圖靈語義理解節點的話題[5]。
關鍵函數:
調用麥克風實現錄音、斷點檢測、上傳音頻和得到服務器返回結果的功能函數
static void demo_mic(const char* session_begin_params){}
對系統麥克風設備初始化,涉及 alsa 編程內容
errcode = sr_init(&iat, session_begin_params, SR_MIC, &recnotifier);
啟動系統麥克風設備,開始錄音,觸發回調函數 on_speech_begin() 顯示并記錄當前狀態為開始會話階段
errcode = sr_start_listening(&iat);
圖靈語義理解節點 ( nlu 節點)
當接收到 asr 節點往本節點的話題發消息時,會觸發本節點的回調函數,開啟該節點的功能----向服務器發送 HTTPPOST 請求,上傳話題收到的結果。然后等待服務器返回 JSON 結果。收到返回內容后,對 JSON 字符串進行解析,取得結果,達到理解句意或得到固定問題的答案。
關鍵函數
//回調函數 nluCallback(),顯示收到內容并調用自定義函數 HttpPostRequest()進行 HttpPost 請求void nluCall-back(const std_msgs::String::ConstPtr& msg)

圖3 軟件框架圖

圖4 語音模塊框架圖
訊飛語音合成節點 (tts 節點)
當接收到 nlu 節點往本節點的話題發消息時,會觸發本節點的回調函數 topicCallback(),實現語音合成并報讀合成好的 wav 音頻文件
關鍵函數
void makeTextToWav( const char* text , const char* filename )
傳入合成文本內容和文件目錄,設定訊飛開發文檔提供的合成音頻的參數(合成發音人、音頻采樣率、語速、音量、音調等)
傳入合成文本內容、文件合成到的目標目錄和合成參數來合成音頻
int text_to_speech(const char* src_text, const char* des_path, const char* params)如圖5所示。

圖5 語音模塊測試圖
該模塊使用了Kinect作為圖像采集基礎。使用OpenNI接口提取攝像頭中捕獲的彩色圖像信息、點云數據、灰度圖等,然后將這些圖像信息打包成消息通過話題發布到ROS中為其他節點模塊提供數據源。然而在ROS中圖片的傳輸并不是簡單的將圖片直接發送出去,而是利用ROS中的cv_bridge來講圖片轉化成消息類型之后再發布到話題中。其他節點便可以接收該話題,同樣的再用cv_bridge轉化回圖片格式之后就可以進行顯示或者是處理了。
/*圖像發布函數*/
int img_publish()
//將CV_bridge轉化為ROS圖像消息
void toImageMsg(sensor_msgs :: Image&ros_image)const ;
人臉檢測節點獲取到圖片之后進行人臉檢測,檢測圖片中是否存在人臉,然后將人臉保存起來并將其與系統中的人臉進行比對實現人臉識別。同時利用Face++中的人臉特征信息來獲取老人的微笑值進而根據老人的心情來做出相應的回應。
//人臉檢測, 將圖片與人臉特征進行對比獲取圖片中人臉在圖標的坐標
def detect(img, cascade):
路徑規劃及定位導航實現地圖構建,通過利用構建完成的地圖進行避障、定位導航、路徑規劃功能。其中,構建地圖以及避障功能需要機械視覺模塊提供的PLC點云數據。該模塊接收到的PCL數據后將數據進行轉換得到坐標數據。然后再通過TF轉換通知機器人現實中的物體與機器人之間的距離[6]。再根據實際情況進行構建地圖、避障等。而路徑規劃和定位導航則是利用建立好的地圖來獲取地圖中環境情況,然后再通過給定地圖中的點進行路徑規劃以及定位到航。
在構建地圖的過程中,使用了TF進行傳感器坐標的轉換。因為機器人的控制中心不一定是在傳感器上,所以要把傳感器的數據轉換成在控制中心上的坐標信息,從而實現數據通信[7-8]。如圖6所示。

傳感器獲取的數據是在Kinect的坐標系統中的,但是系統控制時只能以base_link為中心,所以要根據兩者的位置關心進行坐標變換,并使用MOVE_BASE路徑規劃功能包進行實現[9]。
人家交互界面模塊主要負責機器人與用戶之間的進行交互信息。同時還可集成各種游戲提供用戶體驗例如象棋、俄羅斯方塊、連連看等簡單游戲。通過人機交互模塊還可以實現將老人的生理數據顯示給老人查看。同時還可以捕獲攝像頭的信息進行拍照、互動等。
在人機界面交互模塊中,我們使用了移植性較高的Qt進行開發,配合ROS插件能夠自由的接收機器人發布的各種消息[10]。同時利用Qt中成熟的發展技術可以簡單的融合各種軟件如音樂播放器、游戲等等,如圖7所示。

圖7 界面設計-查看攝像頭
本項目將機器人開發技術、物聯網技術、人工智能技術、圖像處理技術等多項前沿的IT技術進行整合,綜合實現信息之間的高效地連接,進而為人們提供多樣化的生活類的綜合服務。由于本項目定位為家庭類服務機器人的設計與實現,因此在項目最終成果及主要研究力量都放在機器人終端交與及硬件開發上。因此,在多機器人交互調度、智能學習、行為大數據分析等問題將在下一次迭代中修正和完善,并引入Big Data及Deep Learning等技術實現智能學習,從而為老人提供更多服務和幫助。