#author("2021-12-15T04:08:27+00:00","","") #author("2021-12-15T04:08:43+00:00","","") [[技術資料]] *目次 [#e890b3d5] #CONTENTS **1. 目標 [#i67428c5] ターゲット・トラッキングタスクでなぞり運動における内部モデルのモデル化と習熟メカニズムを解明するため,なぞり時のズレ,時間のデータを取得して,腕の慣性行列,粘性行列,剛性行列を導出する. **2. Psycho Pyのインストール [#e321d51d] 以下のサイトでインストール https://github.com/psychopy/psychopy/releases インストールしたら,スタート画面を開き「PsychoPy3」というフォルダをクリックし,「PsychoPy3」をクリックすると,実行できる. >&color(red){注意}; >&color(red){''new!''};:PsychoPy最新バージョンでも動きました.バージョンが違うので画像と違うところはありますが,問題なし. >古いほうです→Windowsの場合,「StandalonePsychoPy3-3.0.3-win32.exe」をインストール→p.5くらいにある >インストールの際に,「WindowsによってPCが保護されました」と表示されるが,左下にある「詳細情報」をクリックし,表示される「実行」をクリックする. **3. Psycho Pyの設定[#k5b71d50] 以下のサイトを参考に進める http://www.s12600.net/psy/python/ppb/html/index.html #ref(exp08d.psyexp,,設定してあるpsychopyファイルです。) #ref(Builder1.png,,40%) 上の画像が「Builder」という実験を作成するためのツール この画像の右側にある様々なアイコンを配置することで実験を作成していく. Builderの画像の赤丸部分をクリックすると,「Corder」といわれる「Builder」で作成した実験をプログラミングコードに変換して表示してくれるものが表示される. #ref(Corder1.png,,50%) 上の画像が「Corder」 実験の細かい部分は「Corder」か「Builder」の「Codeコンポーネント」に書き込むことで変更できる. 主に「Builder」を使って作成していく. >&color(red){注意}; >インストールしたばかりの状態だと言語が設定されていないので,日本語に設定する. >上のBuilder画像の紫丸をクリックすると下の画像の左側が表示されるので,アプリケーションをクリックし,画像の通りに設定する. #ref(lang.png,,70%) **4. 実験の作成[#k5b71d50] 以下のサイトを参考に作成していく http://www.s12600.net/psy/python/ppb/html/chapter08.html Builderのウィンドウを開き,実験に必要なコンポーネントをそれぞれ配置していく. 新規の実験を作るときは最初「trial」というRoutineだけなので,この実験においてはもう一つのRoutineを作る必要がある. #ref(設定1.png,,70%) #ref(set1.png,,70%) readyとtrialのそれぞれのRoutineにコンポーネントを配置していく. #ref(set2.png,,70%) コンポーネントを配置する際に名前を変更できるので( )内の名前に変更しておくとわかりやすい. **4.1 ''「ready」 Routineに配置するコンポーネント'' [#kd2fa174] >&color(red){注意}; >コンポーネントは下記の順番で配置していく~ (順番が違うと実行時に上手く表示されない)~ ①mouseコンポーネント(mouseTrial)~ ②codeコンポーネント(codeTrial)~ ③polygonコンポーネント×4(path1~path4)~ ④polygonコンポーネント×3(way1~way3)~ ⑤polygonコンポーネント(goalDisc)~ ⑥polygonコンポーネント(probe)~ 以下にそれぞれのコンポーネントの変更点を示す. ***①:mouseコンポーネント~ [#r33f74bd] [終了] の時間を 1.0 から 空白 に変更する.~ [ボタン押しでRoutineを終了] を 全てのクリック から なし に変更する~ [マウスの状態を保存] を 最終 から なし に変更する~ ***②:codeコンポーネント~ [#d0b7426a] (ctl+aで全選択→ctl+cコピー→ctl+vで貼り付けできます)~ ''実験開始'' #memo(mouseTrial.setVisible(False)\nmouseReady.setVisible(False)\n) ''Routine開始時'' #memo(\nif expInfo['Direction'] == 'UpDown':\n mouseTrial.setPos([startPos[0], -startPos[1]])\n\nif expInfo['Direction'] == 'Normal':\n mouseTrial.setPos([startPos[0], startPos[1]])\n\nif expInfo['Direction'] == 'LeftRight':\n mouseTrial.setPos([-startPos[0], startPos[1]])\n\nif expInfo['Direction'] == 'All':\n mouseTrial.setPos([-startPos[0], -startPos[1]])\n\n\n\ncoll = 'black'\n\ncol1 = 'green'\ncol2 = 'green'\ncol3 = 'green'\n\nprobeX_list = [ ]\nprobeX2_list = [ ]\nprobeX3_list = [ ]\nprobeX4_list = [ ]\n\nprobeY_list = [ ]\nprobeY2_list = [ ]\nprobeY3_list = [ ]\nprobeY4_list = [ ]\n\nonPath_list = [ ]\n\ntime_list = [ ]\ntime2_list = [ ]\ntime3_list = [ ]\ntime4_list = [ ]) ''フレーム毎'' #memo(if expInfo['Direction'] == 'UpDown':\n mousePos = mouseTrial.getPos()\n px = mousePos[0]\n py = -mousePos[1]\n\nif expInfo['Direction'] == 'Normal':\n mousePos = mouseTrial.getPos()\n px = mousePos[0]\n py = mousePos[1]\n\nif expInfo['Direction'] == 'LeftRight':\n mousePos = mouseTrial.getPos()\n px = -mousePos[0]\n py = mousePos[1]\n\nif expInfo['Direction'] == 'All':\n mousePos = mouseTrial.getPos()\n px = -mousePos[0]\n py = -mousePos[1]\n\n\n\nif path1.contains([px,py]) or path2.contains([px,py]) or path3.contains([px,py]) or path4.contains([px,py]):\n coll = 'black'\nelse:\n coll = 'red'\n\nif way1.contains([px,py]):\n col1 = 'red'\n\nif way2.contains([px,py]) and col1 == 'red':\n col2 = 'red'\n\nif way3.contains([px,py]) and col2 == 'red':\n col3 = 'red'\n\n\nif goalDisc.contains([px, py]) and col3 == 'red':\n continueRoutine = False\n\n\n\nonPath = False\nfor path in [path1, path2, path3, path4]:\n if path.contains([px, py]):\n onPath = True\n\n\n#if frameN % 3 == 0:\n# probeX_list.append(px)\n# probeY_list.append(py)\n# onPath_list.append(onPath)\n# time_list.append(t)\n\nprobeX_list.append(px)\nprobeY_list.append(py)\nonPath_list.append(onPath)\ntime_list.append(t)\n\n\n#if col1 == 'green':\n# probeX_list.append(px)\n# probeY_list.append(py)\n# time_list.append(t)\n# trials.addData('probe_x1', probeX_list)\n# trials.addData('probe_y1', probeY_list)\n# trials.addData('time_1',time_list)\n\n\n\n#if col1 == 'red' and col2 == 'green':\n# probeX2_list.append(px)\n# probeY2_list.append(py)\n# time2_list.append(t)\n# trials.addData('probe_x2', probeX2_list)\n# trials.addData('probe_y2', probeY2_list)\n# trials.addData('time_2',time2_list)\n\n#if col2 == 'red' and col3 == 'green':\n# probeX3_list.append(px)\n# probeY3_list.append(py)\n# time3_list.append(t)\n# trials.addData('probe_x3', probeX3_list)\n# trials.addData('probe_y3', probeY3_list)\n# trials.addData('time_3',time3_list)\n\n#if col3 == 'red':\n# probeX4_list.append(px)\n# probeY4_list.append(py)\n# time4_list.append(t)\n# trials.addData('probe_x4', probeX4_list)\n# trials.addData('probe_y4', probeY4_list)\n# trials.addData('time_4',time4_list)) ''Routine終了時'' #memo #memo(trials.addData('probe_x',probeX_list)\ntrials.addData('probe_y',probeY_list)\n\ntrials.addData('on_path', onPath_list)\ntrials.addData('time',time_list)\n) ''実験終了時''は何も入力なし ***③:polygoneコンポーネント(path1~path4)~ [#pc20d453] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] をそれぞれ path1,path2,path3,path4 に変更する.~ [形状] を 三角形 から 長方形 に変更する.~ [位置[x,y]] を (0,0) から pathNpos に変更する.~ (pathNpos の N には path1,path2,path3,path4 のそれぞれに対応する数字を入力する.)~ (例: path1 だと path1pos を入力する. つまり,この場合だと N=1 となる.)~ 「更新しない」を「繰り返しごとに更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (240,20) に変更する.~ path1~ [回転角度] を 0 に変更する.~ path2~ [回転角度] を 90 に変更する.~ path3~ [回転角度] を 0 に変更する.~ path4~ [回転角度] を 90 に変更する.~ ***④:polygonコンポーネント(way1~way3)~ [#d3975a58] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] をそれぞれ way1,way2,way3 に変更する.~ [形状] を 三角形 から 多角形 に変更する.~ [頂点数] を 32 に変更する.~ [位置[x,y]] を (0,0) から wayNpos に変更する.~ (N の部分は path1~path4 のときと同様に対応する数字を入力する.)~ 「更新しない」を「繰り返しごとに更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (30,30) に変更する.~ way1~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から $col1 に変更する.~ 「更新しない」を「フレーム毎に更新」に変更する.~ way2~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から $col2 に変更する.~ 「更新しない」を「フレーム毎に更新」に変更する.~ way3~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から $col3 に変更する.~ 「更新しない」を「フレーム毎に更新」に変更する.~ ***⑤:polygonコンポーネント(goalDisc)~ [#r4e79cb5] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] を goalDisc に変更する.~ [形状] を 三角形 から 多角形 に変更する.~ [頂点数] を 32 に変更する.~ [位置[x,y]] を (0,0) から goalPos に変更する.~ 「更新しない」を「繰り返しごとに更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (30,30) に変更する.~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から green に変更する.~ ***⑥:polygonコンポーネント(probe)~ [#y375c62f] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] を probe に変更する.~ [形状] を 三角形 から 多角形 に変更する.~ [頂点数] を 32 に変更する.~ [位置[x,y]] を (0,0) から [px,py] に変更する.~ 「更新しない」を「フレーム毎に更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (10,10) に変更する.~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から $coll に変更する.~ 「更新しない」を「フレーム毎に更新」に変更する.~ #ref(ready1.png,,70%) //***''②:codeコンポーネント'' [#pc7e2a8e] // codeコンポーネントには「実験開始時」「Routine開始時」「フレーム毎」「Routine終了時」「実験終了時」の5つのタブを含んでおり,タブによっていつ実行されるかが変わってくる. // 下の画像のようにコードを入力する. // 実験終了時の部分には何も入力しなくて大丈夫. //#ref(code1.png,,70%) //#ref(code5.png,,100%) //#ref(code6.png,,100%) **4.2 ''「trial」 Routineに配置するコンポーネント'' [#z55c486e] >&color(red){注意}; >コンポーネントは下記の順番で配置していく~ (順番が違うと実行時に上手く表示されない)~ ①mouseコンポーネント(mouseReady)~ ②polygonコンポーネント×4(path1_2~path4_2)~ ③polygonコンポーネント×3(way1_2~way3_2)~ ④polygonコンポーネント(startDisc)~ ⑤polygonコンポーネント(probeReady)~ 以下にそれぞれのコンポーネントの変更点を示す. ***①:mouseコンポーネント~ [#r33f74bd] [終了] の時間を 1.0 から 空白 に変更する.~ [マウスの状態を保存] を 最終 から なし に変更する~ ***②:polygoneコンポーネント(path1_2~path4_2)~ [#pc20d453] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] をそれぞれ path1,path2,path3,path4 に変更する.~ [形状] を 三角形 から 長方形 に変更する.~ [位置[x,y]] を (0,0) から pathNpos に変更する.~ (pathNpos の N には path1,path2,path3,path4 のそれぞれに対応する数字を入力する.)~ (例: path1 だと path1pos を入力する. つまり,この場合だと N=1 となる.)~ 「更新しない」を「繰り返しごとに更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (240,20) に変更する.~ path1_2~ [回転角度] を 0 に変更する.~ path2_2~ [回転角度] を 90 に変更する.~ path3_2~ [回転角度] を 0 に変更する.~ path4_2~ [回転角度] を 90 に変更する.~ ***④:polygonコンポーネント(way1_2~way3_2)~ [#d3975a58] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] をそれぞれ way1,way2,way3 に変更する.~ [形状] を 三角形 から 多角形 に変更する.~ [頂点数] を 32 に変更する.~ [位置[x,y]] を (0,0) から wayNpos に変更する.~ (N の部分は path1~path4 のときと同様に対応する数字を入力する.)~ 「更新しない」を「繰り返しごとに更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (30,30) に変更する.~ way1_2~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から green に変更する.~ way2~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から green に変更する.~ way3~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から green に変更する.~ ***⑤:polygonコンポーネント(startDisc)~ [#r4e79cb5] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] を startDisc に変更する.~ [形状] を 三角形 から 多角形 に変更する.~ [頂点数] を 32 に変更する.~ [位置[x,y]] を (0,0) から startPos に変更する.~ 「更新しない」を「繰り返しごとに更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (30,30) に変更する.~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から green に変更する.~ ***⑥:polygonコンポーネント(probeReady)~ [#y375c62f] [終了] の時間を 1.0 から 空白 に変更する.~ [名前] を probeReady に変更する.~ [形状] を 三角形 から 多角形 に変更する.~ [頂点数] を 32 に変更する.~ [位置[x,y]] を (0,0) から startPos に変更する.~ 「更新しない」を「繰り返し毎に更新」に変更する.~ [サイズ[w,h]] を (0.5,0.5) から (10,10) に変更する.~ 「高度」タブの[塗りつぶしの色] を $[1,1,1] から red に変更する.~ **5.Loopの作成とcsvの設定 [#qcfac01a] ここでは,繰り返しを設定するLoopを作成する. この実験では,Loopを2回設定する. 左下にある「Loopを挿入」を押すと,Flow上に黒点が表示される. 1つ目の黒点はLoopのスタートを表し,2つ目の黒点はLoopの終わりの位置を表している. 1個目のLoopはスタートが trial の前で,ゴールが ready の後ろに設置するようにする.~ 1個目のLoopの名前を「trials1」とする. 2個目のLoopはスタートが ready の前で,ゴールが ready の後ろに設置するようにする.~ 2個目のLoopの名前を「trials_2」とする. #ref(example1.xlsx,,) このエクセルファイルはLoopを設定する際に必要になってくる.~ Loopを設置する際に,下の画像のようなものが出てくるので,これも設定する必要がある. #ref(Loop1.png,,) ***''1:「trials」Loop'' [#t975ef69] ①:名前を変更する. ②:繰り返し回数を 1 に設定する. ③:繰り返し条件に,「example1.xlsx」をいれる. ***''2:「trials_2」Loop'' [#x5568df6] ①:名前を変更する. ②:繰り返し回数の部分に自分が繰り返す分の数を設定する. ③:繰り返し条件に,「example1.xlsx」をいれる. 以上のように設定すると,Flow の部分が以下の画像のようになる. #ref(Loop2.png,,) **6.各種設定 [#j67605b8] ここでは,実験を行う際の上下反転以外の条件を付けくわえていく. 下の画像にある赤丸部分をクリックしてすると,2つ目の画像にある設定画面がでてくる. #ref(settei.png,,) #ref(settei2.png,,) ここで,「実験情報ダイアログ」の右側にある「+」ボタンを押すと,新しいダイアログが追加される. 新しく追加されたダイアログの フィールドを「Direction」, 初期値を「['UpDown', 'Normal', 'LeftRight', 'All']」と設定する. 次に,「データ」のタブに移動し,「csv形式のデータを保存」の部分にチェックをいれる. 「ログレベル」を 「data」 に変更する. 次に,「スクリーン」のタブに移動し,「単位」を「pix」に変更する. **7.実行 [#g469661e] ここでは,実際に実験を行う流れを説明する. #ref(zikkou.png,,) 上の画像の赤丸部分をクリックする. すると,下の画像のやつがでてくる. #ref(zikkou2.png,,) 「Direction」では,6で設定したものが選択できるようになっている.~ 「Updown」が上下反転 「Normal」が反転なし 「LeftRight」が左右反転 「All」が上下左右反転 となっている. 「partcipant」で保存するファイルの名前をわかりやすくできる. 「session」は 1 のままで無視してよい. 以上の3つを設定したら,「OK」を押すと実験の画面が起動する. 実験の画面が起動したら,マウスの左をクリックするとスタートする. 設定した繰り返し回数に達したら,勝手に終わるようになっている. また, Escキー を押すと実験を中断できる. **8.プログラム [#c768f4f3] 「sk.py」を用いて取得したcsvファイルを使って速度,加速度をを求める. #ref(sk.py,,) まずは,sk.pyと自分が取得したcsvファイルを同じフォルダにいれる. この際,取得したcsvファイルを短い名前に変更した方がコードにいれやすくなる. sk.py を以下に示すように自分用に変更する.~ コメントアウトは無視して良い. #ref(gazou1.png,,40%) #ref(gazou2.png,,40%) ①:8行目の range(10) の 10 の部分を繰り返しの回数に変更する.~ (例:繰り返し回数が5回だったら, range(5) にする.) ②:10行目の aiueo.csv を自分で取得したcsvファイルに変更する. ③:68行目の aiueo の部分を変更することで保存先のフォルダの名前を変更できる. ④:70行目の aiueo の部分を変更することで,出力するcsvファイルの名前を変更できる. 以上の変更を施し,実際にプログラムを起動する.~~ すると,③で設定した名前のフォルダ内に④で設定した名前のcsvファイルが繰り返し分だけ生成される. #ref(gazou3.png,,40%) 上の画像が④で出力されるcsvファイルである. A列はx座標の推移~ B列はx座標の速度の推移~ C列はx座標の加速度の推移 D列はy座標の推移~ E列はy座標の速度の推移~ F列はy座標の加速度の推移~ #ref(kawaguti2.csv,,)