本格的に寒くなり、冬服を新しく購入しました。
今日も引き続き、論文作成をしました。
順調...?
各自、目標をもって計画的に取り組んでいます。
来週は祝日のためお休みです。
残り一か月頑張りましょう~‼
本格的に寒くなり、冬服を新しく購入しました。
今日も引き続き、論文作成をしました。
順調...?
各自、目標をもって計画的に取り組んでいます。
来週は祝日のためお休みです。
残り一か月頑張りましょう~‼
最近、気温の変化で体調を崩しがちです。
今日は、論文のタイトルの副題を考えました。
・高齢者の健康管理支援に有効なデバイスの比較
・LINE公式アカウントを用いた情報共有
・チャットボット作成サービスDialogflowの特徴と活用
次週は、各自で進めていく予定です。
【先行研究】
視覚機能を用いた服薬支援システムについての論文です。
【Google Home班】
卒論を書くにあたって、先行研究をまとめ発表しました【動画】。
①水野 智喜, 田胡 和哉:音声認識を利用した介護予防・日常生活支援総合事業改善の試み.情報処理学会, 第82回全国大会講演論文集 2020(1), 463-464, 2020.
②高見 惇平, 藤岡 憧, 大須賀 美恵子:スマートスピーカを用いた離れて過ごす高齢者の入浴見守りシステムの開発と評価.人間工学, 57, 2021.
引き続き”#7血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにすることに取り組もうと思います。
①スマートスピーカーでお薬の時間を早めたときと、LINE公式アカウントでQRコードを登録したとき、コントローラーをreloadしてお薬の時間を再読み込みするようプログラムを修正しました。
②お薬を飲まず服薬時間が過ぎた場合、LINE公式アカウントへ「お薬を飲むように〇回催促しましたが応答がありません」のメッセージのあと、緊急連絡先をメッセージで表示するプログラムを作成しました。
次回、緊急連絡先をLINEで登録できるよう、プログラムを作成したいです。
// 未服用でかつ催促の回数が5回になったらタイトルに「(応答無)」に変更し、色を黄色に変える
if(response.taiking_status == '0' && num_reminder == 5){
result = event.getTitle().indexOf("(");
//"("以降の文字を切り取る。
results = event.getTitle().substr(0,result);
//タイトルを○○の薬(応答無)に変更する。
event.setTitle(results+'(応答無)');
//色を黄に変更する。
event.setColor(CalendarApp.EventColor.YELLOW);
// LINEにメッセージを送る
Drug_LINE_notify('お薬を飲むように' + num_reminder + '回催促しましたが応答がありません。');
}
今回、2行目のif文を次のように変更した。
if(response.taiking_status == '0' && isNoResponse(event)){
ここで、関数isNoResponseは応答無を判定する関数で、次のような関数である。
/**
* 2021.9.10 応答無の判定条件
* 従来は「num_reminder == 5」だったが、これを
* 「event.getEndTime() < current_time」
* にする(current_time = new Date())。
*/
function isNoResponse(event) {
var current_time = new Date();
var result = (event.getEndTime() < current_time) ? true : false;
return result;
}
この関数は現在時刻が終了時刻event.getEndTime()を過ぎていたらtrueを返す。
9月に入りました。朝起きると、肌寒く布団からすぐに出れないのが悩みです。
【Google Home班】
今日はグラフの線を直線にするか曲線にするか決めました。
直線だと1か月・半年のグラフが見にくいため、曲線で表示することにしました。
来週は、#7 血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにすることに取り組もうと思います。
【LINE班】
①LINE公式アカウント「薬シェア」のリッチメニューの1つ「使い方ガイド」を一通り作成完了しました。ブログにもリンクを張っております。
②リッチメニューの1つ「薬の情報を見る」にて、薬の一覧を表示する際、薬の種類が11個以上ある場合でも、カルーセルメニューを2つ表示してすべての薬が閲覧できるようにしました。
来週は、「お薬を登録する際や服薬時間を早める際にコントローラーをreloadするプログラム」と「高齢者が応答しなかった際緊急連絡先を表示する機能」を実装するべく頑張りたいと思います。
早いもので8月も最終日となりました。
【全体】
学会提出用の 詳細抄録をみんなで完成させました!
次回からは、卒業論文に向けての準備を進めていきます。
システムの問題点も改善しつつ、計画的に頑張っていきましょう!
【Google Home班】
今日は前回の問題点であったところを改善していただいたので、その確認をまずしました。
次にグラフの線を曲線から直線に変更しました。が、曲線のほうが見やすいような...
次週、皆さんの意見をきいてみたいと思うので、ご協力よろしくお願いします。
学会の詳細抄録が完成し、一息つきました。実証実験も順調に進み、あとは定量評価に向けてデータを蓄積し、実証実験で出てきた課題を解決してシステムの改善をしていくばかりとなりました。
それと並行して卒業論文の準備を進めていきたいと思います。まずは先行研究の調査です。システム開発を開始する前に先行研究の論文は読みましたが、読みっぱなしでまとめてきませんでした。しかし、卒論では先行研究について関連する研究の要約と今回の研究との違いについて触れなくてはなりません。
そこで、次回から先行研究の論文を読んでスライド5枚程度にまとめ(緒論、方法、結果、考察、結論)10分ほどの発表をしてはどうでしょうか。
今回の研究のコンセプトに「家族健康記録(FHR)」があります。そこで、家族で高齢者を見守るというコンセプトの研究について調べてはどうでしょうか。例えば、「第四次産業革命時代におけるヘルスケアサービス分野のデジタルトランスフォーメーション等に関する調査研究」なんかどうでしょうか。
また、スマートデバイスで高齢者のバイタルをモニタリングする試みとしてスマートウォッチによる心電図の計測が最近話題を集めています。先進的な取り組みとして調べておくとよいかもしれません。例えば「腕時計型脈波モニタリングデバイスによる心房細動の検出の妥当性に関する研究」というのがあります。
これは、研究ではありませんがタカラトミーという玩具メーカーから「あみちゃん」という高齢者をターゲットとしたAI人形が出ています。モニタリングではありませんが、スマートスピーカーのチャットボットと通じるところがあり、将来的にはこうしたAI人形が高齢者の健康管理のユーザーインターフェースになるのではないかと思います。そこで、このAI人形について調べてみるのも面白いかもしれません。
8/24のGoogle Home班の報告にある血圧記録のトラブルについて原因を究明して解決したので報告します。
8/24以降に入力した血圧データが壊れている。最初は収縮期血圧のみが壊れていたが、その後確認すると拡張期血圧も壊れている。
薬シェア健康記録のスプレッドシート「血圧」に記録されたデータが下記のようになっている(血圧の数値が入るべきところが Ljava.lang.Object になっている)。
2021/08/27 20:04:14,[Ljava.lang.Object;@2570d431,[Ljava.lang.Object;@3e48722a
Action consoleでテストしてREQUESTデータを入手した(下記)。
{
"responseId": "17678248-26ed-4c5c-a581-65b716413a8f-b9889856",
"queryResult": {
"queryText": "上が129で、下が70です",
"parameters": {
"systole": [
129
],
"diastolic": [
70
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
]
},
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
""
]
}
}
],
"outputContexts": [
{
"name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_media_response_audio",
"parameters": {
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
},
{
"name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_screen_output",
"parameters": {
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
},
{
"name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_account_linking",
"parameters": {
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
},
{
"name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/actions_capability_audio_output",
"parameters": {
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
},
{
"name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/google_assistant_input_type_voice",
"parameters": {
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
},
{
"name": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP/contexts/__system_counters__",
"parameters": {
"no-input": 0,
"no-match": 0,
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
}
],
"intent": {
"name": "projects/kusuri-141ad/agent/intents/a27fc1b7-5ddc-40c7-8c38-cbe1c79bafe4",
"displayName": "ketsuatsu"
},
"intentDetectionConfidence": 1,
"languageCode": "ja"
},
"originalDetectIntentRequest": {
"source": "google",
"version": "2",
"payload": {
"user": {
"locale": "ja-JP",
"lastSeen": "2021-08-27T23:23:51Z",
"userVerificationStatus": "VERIFIED"
},
"conversation": {
"conversationId": "ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP",
"type": "ACTIVE",
"conversationToken": "[]"
},
"inputs": [
{
"intent": "actions.intent.TEXT",
"rawInputs": [
{
"inputType": "VOICE",
"query": "上が129で、下が70です"
}
],
"arguments": [
{
"name": "text",
"rawText": "上が129で、下が70です",
"textValue": "上が129で、下が70です"
}
]
}
],
"surface": {
"capabilities": [
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.ACCOUNT_LINKING"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
}
]
},
"isInSandbox": true,
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
},
{
"name": "actions.capability.WEB_BROWSER"
}
]
}
],
"requestType": "SIMULATOR"
}
},
"session": "projects/kusuri-141ad/agent/sessions/ABwppHGn1M9qnMcRD7Nut4wAt7mBfE0xTyUfQAHnGuhxNzWnq5nemI-Hb1w8H9PwoR0SK9SvaUIc5fFP"
}
リスト1.Action consoleで取得したリクエストデータ
これをDialogflowとGoogle Assistantの統合のリスト2と比較すると、outputTexts[0].parameters内のパラメタが、以前はスカラーだったのに対して今はベクトル(配列)になっている(下記へ抜粋)。
"parameters": {
"systole": [
129
],
"systole.original": [
"129"
],
"diastolic": [
70
],
"diastolic.original": [
"70"
],
"ketsuatsu": [
"最高血圧",
"最低血圧"
],
"ketsuatsu.original": [
"上",
"下"
]
}
そのため、下記プログラムでスプレッドシートに血圧を書き込むとLjava.lang.Objectとなるようだ。
function handleWebhook(req) {
const parameters = req.queryResult.outputContexts[0].parameters;
const intent = req.queryResult.intent;
var text = '';
if (req.queryResult.intent.displayName == 'ketsuatsu'){
text = '今日の最高血圧' + parameters['systole.original'] + '、最低血圧' + parameters['diastolic.original'] + 'を記録しました。';
recordBloodPressure(parameters['systole.original'], parameters['diastolic.original']);
}
...(中略)...
return res;
}
リスト2.関数handleWebhookの抜粋(血圧処理部分)
この中でparameters['systole.original']などが配列になっているために起きるトラブルである。
この問題を解決するために、以下のように、パラメタの配列要素のうち先頭要素のみを取り出すように修正した。
function handleWebhook(req) {
debug('handleWebhook:req=\n' + JSON.stringify(req, null, ' '));
const parameters = req.queryResult.outputContexts[0].parameters;
const intent = req.queryResult.intent;
var text = '';
if (req.queryResult.intent.displayName == 'ketsuatsu'){
const systole = parameters['systole.original'][0]; // ←修正!
const diastolic = parameters['diastolic.original'][0]; // ←修正!
text = '今日の最高血圧' + systole + '、最低血圧' + diastolic + 'を記録しました。';
recordBloodPressure(systole, diastolic);
}
...(中略)...
return res;
}
リスト3.修正したプログラム
すなわち、最高血圧は parameters['systole.original'] を取り出してスプレッドシートへ書き込んでいたが、parameters['systole.original'] は配列になっていたので parameters['systole.original'][0] のように[0]を付けて先頭要素を取り出した。この修正で血圧データが記録されないという問題は解消した。
【全体】
本日は作成途中の詳細抄録に関するお話をしました。
未完成の部分をゼミメンバーで分担し、作業を行います。
次回のゼミは 27日(金)です。それまでに抄録の8割方完成を目指します。
【Google Home班】
今日は、まず#2 脈拍の記録機能 を追加しようとしました。
スピーカーに記録する際は、最高血圧、最低血圧の後に続けて伝えます。
ですが、色々しているうちに最高血圧がスプレッドシートに記録されずLjava.lang.Object;
が表示されます。調べてみてもどこを改善すればいいのか分かりません。
次回はここから進めたいと思います。
【Google Home班】
お盆が明けて、久しぶりの活動でした。
今日は、To Doリストの把握をしました。”#4 血圧のグラフを折れ線グラフに”を来週進めていくことにしました。また、140と90に赤い線を引くことも同時に進めていきたいと思います。
また、”#7 血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにすることに取り組む予定です。
【LINE班】
現在、学会用の詳細抄録を作成中です。
先生によるシステムの検証により、様々な課題も見つかりました。優先順位を決め、1つずつ課題をこなしていきたいです。