2021年10月27日水曜日

2021/10/27

 本格的に寒くなり、冬服を新しく購入しました。


今日も引き続き、論文作成をしました。

順調...?

各自、目標をもって計画的に取り組んでいます。


来週は祝日のためお休みです。

残り一か月頑張りましょう~‼

2021年10月20日水曜日

2021/10/20

急に寒くなり布団から出れませんでした。

今日も引き続き論文作成に取り組みました。
頑張りましょう~!!

論文に必要なデータ収集をしました。
また、学会発表に必要なスライドの作成もしました。

来週も論文作成です。

2021年10月13日水曜日

2021/10/13

 最近、気温の変化で体調を崩しがちです。


今日は、論文のタイトルの副題を考えました。

・高齢者の健康管理支援に有効なデバイスの比較

・LINE公式アカウントを用いた情報共有

・チャットボット作成サービスDialogflowの特徴と活用


次週は、各自で進めていく予定です。

2021年10月6日水曜日

2021/10/06

10月に入りました。今日の夕飯はちゃんぽんです。たのしみ~。 

 今日は、久しぶりに対面でゼミを行いました。 まず、論文のテーマ決めをしました。 その後論文の構成を考えました。

 次回までに、”1章 はじめに”をおおむね考えてこようと思います。

2021年9月21日火曜日

2021/09/21

【先行研究】

末岡弓奈, 金井秀明:在宅高齢者を対象とするポートレイトを活用した服薬支援システム. 情報処理学会, 研究報告グループウェアとネットワークサービス(GN), 2019-GN-107, 1, 1-8, 2019-03-11

視覚機能を用いた服薬支援システムについての論文です。

 

【Google Home班】

今日は、#7血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにしました。
削除時には、削除対象日時・値を読み上げるようにしました。
血圧だけでなく、身長と体重の削除もできるようにしたいと思います。
※現在体重の削除に手こずっています。
 
【LINE班】
緊急連絡先の表示と登録を行う機能を追加しました。
連絡先の表示は、高齢者がGoogle Homeへの返答をしなかった際に、LINE公式アカウントから自動で連絡先の一覧を送信するようにしました。登録に関しても、LINE公式アカウントにて「緊急連絡先を登録する」と手入力することで、対話型方式で連絡先情報を登録することができます。
次回は緊急連絡先の変更機能や、服薬時間の変更機能を実装するべく頑張りたいです。

2021年9月14日火曜日

2021/09/14

【卒論に向けて...】

卒論を書くにあたって、先行研究をまとめ発表しました【動画】。

水野 智喜, 田胡 和哉:音声認識を利用した介護予防・日常生活支援総合事業改善の試み.情報処理学会, 第82回全国大会講演論文集 2020(1), 463-464, 2020.







高見 惇平, 藤岡 憧, 大須賀 美恵子:スマートスピーカを用いた離れて過ごす高齢者の入浴見守りシステムの開発と評価.人間工学, 57, 2021.





 【Google Home班】

引き続き”#7血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにすることに取り組もうと思います。

【LINE班】

 ①スマートスピーカーでお薬の時間を早めたときと、LINE公式アカウントでQRコードを登録したとき、コントローラーをreloadしてお薬の時間を再読み込みするようプログラムを修正しました。

②お薬を飲まず服薬時間が過ぎた場合、LINE公式アカウントへ「お薬を飲むように〇回催促しましたが応答がありません」のメッセージのあと、緊急連絡先をメッセージで表示するプログラムを作成しました。

次回、緊急連絡先をLINEで登録できるよう、プログラムを作成したいです。

2021年9月10日金曜日

応答無の判定条件を変更

【経緯】

これまで、スピーカーが「お薬飲んで」と督促しても利用者から5回応答がなかったらカレンダーを「応答無」にして赤色から黄色に変更していた。にもかかわらず服薬イベントの終了時刻に達するまで5分おきに督促し続けていた。
そのため、6回目以降のスピーカーの督促に反応して「お薬飲んだ」と利用者が応答すると、スピーカーは「お薬カレンダーに記録しておきます」と言っておきながら、実際は応答無(黄色)を済(青色)に変更していなかった。

【原因】

この原因は、応答無の判定条件が終了時刻とは無関係に「5回目の督促」にしていたためである。そこで、今回応答無の判定条件を「現在時刻が終了時刻よりも超えていたら」に修正した。

【プログラムの修正】

修正対象のプログラムは「服薬管理システムA3(平松)」で、Googleドライブの「薬シェア」フォルダ内の「服薬管理」フォルダ内にある。
プログラムの修正箇所は、getEventsById関数内の応答無かどうかを判定するロジックである。従来は次のように督促回数(変数:num_reminder)が5回であるとしていた。
// 未服用でかつ催促の回数が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を返す。

2021年9月7日火曜日

2021/09/07

 9月に入りました。朝起きると、肌寒く布団からすぐに出れないのが悩みです。


【Google Home班】

今日はグラフの線を直線にするか曲線にするか決めました。

直線だと1か月・半年のグラフが見にくいため、曲線で表示することにしました。

来週は、#7 血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにすることに取り組もうと思います。

 

【LINE班】

①LINE公式アカウント「薬シェア」のリッチメニューの1つ「使い方ガイド」を一通り作成完了しました。ブログにもリンクを張っております。

②リッチメニューの1つ「薬の情報を見る」にて、薬の一覧を表示する際、薬の種類が11個以上ある場合でも、カルーセルメニューを2つ表示してすべての薬が閲覧できるようにしました。

来週は、「お薬を登録する際や服薬時間を早める際にコントローラーをreloadするプログラム」と「高齢者が応答しなかった際緊急連絡先を表示する機能」を実装するべく頑張りたいと思います。

2021年9月1日水曜日

2021/08/31

 早いもので8月も最終日となりました。

【全体】

学会提出用の 詳細抄録をみんなで完成させました!

次回からは、卒業論文に向けての準備を進めていきます。

システムの問題点も改善しつつ、計画的に頑張っていきましょう!


【Google Home班】

今日は前回の問題点であったところを改善していただいたので、その確認をまずしました。

次にグラフの線を曲線から直線に変更しました。が、曲線のほうが見やすいような...

次週、皆さんの意見をきいてみたいと思うので、ご協力よろしくお願いします。

2021年8月31日火曜日

卒論に向けて

学会の詳細抄録が完成し、一息つきました。実証実験も順調に進み、あとは定量評価に向けてデータを蓄積し、実証実験で出てきた課題を解決してシステムの改善をしていくばかりとなりました。

それと並行して卒業論文の準備を進めていきたいと思います。まずは先行研究の調査です。システム開発を開始する前に先行研究の論文は読みましたが、読みっぱなしでまとめてきませんでした。しかし、卒論では先行研究について関連する研究の要約と今回の研究との違いについて触れなくてはなりません。

そこで、次回から先行研究の論文を読んでスライド5枚程度にまとめ(緒論、方法、結果、考察、結論)10分ほどの発表をしてはどうでしょうか。

今回の研究のコンセプトに「家族健康記録(FHR)」があります。そこで、家族で高齢者を見守るというコンセプトの研究について調べてはどうでしょうか。例えば、「第四次産業革命時代におけるヘルスケアサービス分野のデジタルトランスフォーメーション等に関する調査研究」なんかどうでしょうか。

また、スマートデバイスで高齢者のバイタルをモニタリングする試みとしてスマートウォッチによる心電図の計測が最近話題を集めています。先進的な取り組みとして調べておくとよいかもしれません。例えば「腕時計型脈波モニタリングデバイスによる心房細動の検出の妥当性に関する研究」というのがあります。

これは、研究ではありませんがタカラトミーという玩具メーカーから「あみちゃん」という高齢者をターゲットとしたAI人形が出ています。モニタリングではありませんが、スマートスピーカーのチャットボットと通じるところがあり、将来的にはこうしたAI人形が高齢者の健康管理のユーザーインターフェースになるのではないかと思います。そこで、このAI人形について調べてみるのも面白いかもしれません。

2021年8月28日土曜日

血圧の記録にトラブルが発生!

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]を付けて先頭要素を取り出した。この修正で血圧データが記録されないという問題は解消した。

2021年8月25日水曜日

2021/08/24

【全体】

本日は作成途中の詳細抄録に関するお話をしました。

未完成の部分をゼミメンバーで分担し、作業を行います。

次回のゼミは 27日(金)です。それまでに抄録の8割方完成を目指します。

 

【Google Home班】

今日は、まず#2 脈拍の記録機能 を追加しようとしました。

スピーカーに記録する際は、最高血圧、最低血圧の後に続けて伝えます。

ですが、色々しているうちに最高血圧がスプレッドシートに記録されずLjava.lang.Object;

が表示されます。調べてみてもどこを改善すればいいのか分かりません。

次回はここから進めたいと思います。

2021年8月18日水曜日

2021/08/17

 【Google Home班】

お盆が明けて、久しぶりの活動でした。

今日は、To Doリストの把握をしました。”#4 血圧のグラフを折れ線グラフに”を来週進めていくことにしました。また、140と90に赤い線を引くことも同時に進めていきたいと思います。

また、”#7 血圧の削除時の確認”で削除対象記録の日時・最高血圧・最低血圧を読み上げるようにすることに取り組む予定です。

 

【LINE班】

現在、学会用の詳細抄録を作成中です。

先生によるシステムの検証により、様々な課題も見つかりました。優先順位を決め、1つずつ課題をこなしていきたいです。