#contents
*コースの説明 [#n7caae60]
&ref(2018b/Member/shaymin/Mission3/s_-uwKn4Dt.jpg,100%);
�\屬離棔璽襪鮟Δ�
�∪弔離棔璽襪鮟Δ�
��索敵を行い、目的の缶に近づき赤いボールを乗せる。その後、元の位置に戻り180°回転し�い惴�かう
�ず討唳�敵を行い、目的の缶に近づき青いボールを乗せる。
*ルール [#k75c299e]
**基本ルール [#o22db514]
競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
図のX地点または(および)Y地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
赤いボールを図のピンクのいずれかに置いた缶に、青いボールを図の水色のいずれかに置いた缶に、それぞれ乗せる。
開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない
。
途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
**基本得点の計算方法 [#u4b0bdbf]
ボールを一つ乗せればそれぞれ10点、二つとも乗せればボーナス点としてさらに10点。
ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれさらに6点加点する。
ボールを目的の缶に当てることができれば、それぞれ4点。
ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6点。
ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2点。
ボールを違う領域内の缶に乗せた場合は、それぞれ2点。
ボールを違う領域内の缶に当てた場合は、0点。
目的の缶をもとの位置(直径7cmの円)から少し出してしまった場合は1点減点、半分以上出してしまった場合は2点または取得した得点の半分のいずれか少ないほうを減点、その缶を完全にだしてしまったときは点数を半分にする。
ダミーの缶がもとの位置から移動しても減点はしない。
**技術点の計算方法 [#p7a5e6db]
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。
得点の目安:
ボール探し取りにいくまでの動作 (3点)
ボール掴む動作 (3点)
ボールを運ぶ動作 (2点)
ボールを缶に置く動作 (2点)
2台のNXT、EV3の連携の良さ(2点)
自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
その他 (3点)
*ロボットの説明 [#d696e17a]
**ロボットの外見 [#had9efa4]
&ref(2018b/Member/shaymin/Mission3/s_hdnTaVh2.jpg,100%);
ロボットを横から見た写真
写真左側にロボットの正面があり、写真右側、ロボットの後方にボールを拾いあげるベルトコンベアが取り付けられている。
&ref(2018b/Member/shaymin/Mission3/s_AYmB6K74.jpg,80%);
ロボットを上から見た写真
一枚目の写真の上部、この写真の中央に写っているのがジャイロセンサーで、ロボットが何度回転したか測る役割を持っている。
このジャイロセンサーの下を通っている白いレールのようなものが、ボールを転がすためのレールです。
&ref(2018b/Member/shaymin/Mission3/s_9oPsKB0z.jpg,80%);
ロボットを正面から見た時の写真
ロボット中央についている目のような部品が超音波センサーで、これで缶の位置を特定し近づく。
しかしロボットなので誤差は生じる。
そこでその誤差をカバーし、より確実に缶の上に乗せるため、超音波センサーの両隣には灰色の棒を、上には白い部品を取り付けた。
超音波センサーの両隣の灰色の部品は缶をよりロボットの中心に寄せるため、白い部品は勢いよくEV3の上を転がってくるボールが飛び出さないよう、クッションの代わりとして取り付けた。
**ボールを持ち上げる機構 [#ge0f91ce]
&ref(2018b/Member/shaymin/Mission3/s_8P536Ai6.jpg,100%);
ベルトコンベアに爪のようなものを取り付け、ベルトコンベアを回転させる
詳しくは下記の『ボールを拾いあげる流れ』を参照
**ボールを拾いあげる流れ [#feee1b9f]
&ref(2018b/Member/shaymin/Mission3/s_CFfxxwMg.jpg,100%);ベルトコンベアと車体の間にボールがくるようにする
↓
&ref(2018b/Member/shaymin/Mission3/s_He8G1L6q.jpg,100%);ベルトコンベアを回転させ爪に引っ掛ける
↓
&ref(2018b/Member/shaymin/Mission3/s_rQ0CRyaG.jpg,100%);ボールを本体側にある壁に押し付けながら持ち上げる
↓
&ref(2018b/Member/shaymin/Mission3/s_bCs47u-C.jpg,100%);完了
**ボールを缶に乗せる一連の動き [#t381e9aa]
&ref(2018b/Member/shaymin/Mission3/s_xwclcbeT.jpg,100%);
�ヾ未膨恐伺肇札鵐機爾�接触するところまで近づく
&ref(2018b/Member/shaymin/Mission3/s_MU8g2zoU.jpg,63%);
�▲戰襯肇灰鵐戰△魏鹽召気察�球を射出する
&ref(2018b/Member/shaymin/Mission3/s_1HURzn1T.jpg,100%);
��勢いのついた球を白い可動式の部品が受け止め、缶の上に乗せる
&ref(2018b/Member/shaymin/Mission3/s_70MwRcJd.jpg,100%);
�で鬚ど�分は可動式になっているので缶の上に乗せた球を落とすことなく下がることができる
*プログラム [#gac64291]
**ライントレースのプログラム [#v553580c]
def linetrace_rin():
c1=cs.value()
while c1>13:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*210-30
r=150-l
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_lin():
c1=cs.value()
while c1>13:
c1=cs.value()
x=abs((c1-10)/70)*100
if x>100:
x=100
r=(x/100)*210-30
l=150-r
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_rout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*120-40
r=40-l
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_lout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
r=(x/100)*120-40
l=40-r
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
赤いボールを5,6番の缶に乗せるために、設定した時間で終了するライントレースを作成
def linetrace_ltime(j):
c1=cs.value()
t1=time.time() #プログラムがスタートした時刻を定義
t2=time.time() #プログラムの経過時間を定義
while t2-t1<j: #j秒経った時に止まる。
c1=cs.value()
t2=time.time()
x=abs((c1-10)/70)*100
if x>100:
x=100
r=(x/100)*210-30
l=150-r
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
**ベルトコンベアのプログラム [#u3042d27]
def roll(s):
ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_action='hold')
time.sleep(3)
ベルトコンベアを回転させるプログラム。220°回転させるのが良い
**ボールを射出するプログラム [#lf5f9b4f]
電池の残量などによってモーターの回転数が一定に定まらず安定しなかったので、ジャイロセンサーを利用した。
def discover_l(s,t): #左回りの場合
u1=us.value() #超音波センサーの値を先に定義する
g1=gs.value() #プログラムスタート時の角度を定義
g2=gs.value() #プログラムの途中経過の角度をあらかじめ定義
while g1-g2<s: #g1-g2は回った角度を表していて、それがs度に達した時プログラムが終了する ちなみにジャイロセンサーは右回転するとその値が増加するため、左回転していた場合、g1>g2となるので引く順番に気をつける
u2=us.value() #プログラムの進行中に逐次超音波センサーの値を保存する
ml.run_forever(speed_sp=-70,stop_action='hold')
mr.run_forever(speed_sp=70,stop_action='hold') #車体を左回転させる
g2=gs.value() #ジャイロセンサーの値を逐次更新する
if u2<u1: #超音波センサーを更新した時、その値が最小値だった場合はその値をu1に保存しておく
u1=u2
g3=gs.value() #その時の角度もg3に保存しておく
g4=gs.value() #缶発見後に右回転する時のスタート地点の角度を定義
g5=gs.value() #右回転している時の角度を定義
if u1<=t: #指定した範囲内に缶が存在していた場合
while g5-g4<g3-g2-6: #缶の位置に到達するまで右回りする -6がついているのは、ジャイロセンサーの誤差分を埋めるためにある。
mr.run_forever(speed_sp=-70,stop_action='hold')
ml.run_forever(speed_sp=70,stop_action='hold')
g5=gs.value()
stop()
u3=us.value() #超音波センサーの値をあらかじめ定義
t1=time.time() #この時の時間を保存
while u3<2550: #※1
ml.run_forever(speed_sp=100,stop_action='hold')
mr.run_forever(speed_sp=100,stop_action='hold') #缶に近づくために進む
u3=us.value() #超音波センサーの値を更新していく
t2=time.time() #進んだ経過時間を測定する
stop()
roll(220) #ベルトコンベアを回してボールを射出する
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold') #缶に近づくために進んだ分だけ後退する
time.sleep(t2-t1) #後退している間プログラムを一時停止する
g6=gs.value() #初期位置に戻るためのスタートの時間を定義
g7=gs.value() #初期位置に戻る時の経過時間をあらかじめ定義
while g7-g6<=g1-g3-6: #初期位置に戻るまでループする
mr.run_forever(speed_sp=-70,stop_action='hold')
ml.run_forever(speed_sp=70,stop_action='hold') #右回転
g7=gs.value()
stop()
else: #測定した範囲内で缶が見つからなかった場合
while g5-g4<g1-g2: #測り始めた位置まで戻る
mr.run_forever(speed_sp=-70,stop_action='hold')
ml.run_forever(speed_sp=70,stop_action='hold')
g5=gs.value()
stop()
def discover_r(s,t): #右回転の場合 基本的に左回転の時と変わらないので同じ所は省略
u1=us.value()
g1=gs.value()
g2=gs.value()
while g2-g1<s: #今回は右回転となるためg2>g1となる
u2=us.value()
ml.run_forever(speed_sp=70,stop_action='hold')
mr.run_forever(speed_sp=-70,stop_action='hold')
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g4-g5<g2-g3-6:
mr.run_forever(speed_sp=70,stop_action='hold')
ml.run_forever(speed_sp=-70,stop_action='hold')
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_action='hold')
mr.run_forever(speed_sp=100,stop_action='hold')
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g6-g7<=g3-g1-6:
mr.run_forever(speed_sp=70,stop_action='hold')
ml.run_forever(speed_sp=-70,stop_action='hold')
g7=gs.value()
stop()
else:
while g4-g5<90:
mr.run_forever(speed_sp=70,stop_action='hold')
ml.run_forever(speed_sp=-70,stop_action='hold')
g5=gs.value()
stop()
**プログラムの全体 [#n62ff5fd]
#!/usr/bin/env python3
from ev3dev.ev3 import *
import time
ml=LargeMotor('outA')
mr=LargeMotor('outD')
ma=LargeMotor('outB')
cs=ColorSensor('in3')
us=UltrasonicSensor('in4')
gs=GyroSensor('in1')
def stop(): 車輪を止める
ml.stop()
mr.stop()
def linetrace_rin(): #説明済みのため省略
c1=cs.value()
while c1>13:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*210-30
r=150-l
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_lin():
c1=cs.value()
while c1>13:
c1=cs.value()
x=abs((c1-10)/70)*100
if x>100:
x=100
r=(x/100)*210-30
l=150-r
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_rout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
l=(x/100)*120-40
r=40-l
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_lout():
c1=cs.value()
while c1<40:
c1=cs.value()
x=(abs(c1-10)/70)*100
if x>100:
x=100
r=(x/100)*120-40
l=40-r
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def linetrace_ltime(j): #説明済みのため省略
c1=cs.value()
t1=time.time()
t2=time.time()
while t2-t1<j:
c1=cs.value()
t2=time.time()
x=abs((c1-10)/70)*100
if x>100:
x=100
r=(x/100)*210-30
l=150-r
ml.run_forever(speed_sp=l,stop_action='brake')
mr.run_forever(speed_sp=r,stop_action='brake')
stop()
def runtime(l,r): #指定した時間分タイヤを動かす
ml.run_timed(time_sp=l*1000,speed_sp=70,stop_action='brake')
mr.run_timed(time_sp=r*1000,speed_sp=70,stop_action='brake')
time.sleep((l+r)/2)
def angle(l,r,t): #指定した角度分タイヤを動かす lは左タイヤの角度、rは右タイヤの角度、tはスリープする時間
ml.run_to_rel_pos(position_sp=l,speed_sp=115,stop_action='hold')
mr.run_to_rel_pos(position_sp=r,speed_sp=115,stop_action='hold')
time.sleep(t)
def kaiten_r(s,t): 右回りに回転
g1=gs.value() #ジャイロセンサーの値をあらかじめ定義
g2=gs.value() #ジャイロセンサーの値をあらかじめ別の変数に定義
while g2-g1<s: #g2とg1を比較してg2-g1が指定した角度になったら止まる
ml.run_forever(speed_sp=t,stop_action='hold')
mr.run_forever(speed_sp=-t,stop_action='hold') #指定した速度で右回転する
g2=gs.value() #ループする度にg2の値を更新していく
stop() #止まる
def kaiten_l(s,t): 左回りに回転
g1=gs.value()
g2=gs.value()
while g1-g2<s: #ジャイロセンサーは時計回りだと値が増加していくため、左回りの場合g1-g2にしなければならない
ml.run_forever(speed_sp=-t,stop_action='hold')
mr.run_forever(speed_sp=t,stop_action='hold') #指定した速度で左回転する
g2=gs.value() #ループする度にg2の値を更新していく
stop() #止まる
def roll(s): ベルトコンベアを動かすプログラム
ma.run_to_rel_pos(position_sp=s,speed_sp=80,stop_action='hold')
time.sleep(3)
def discover_l(s,t): #上で説明済みのため省略
u1=us.value()
g1=gs.value()
g2=gs.value()
while g1-g2<s:
u2=us.value()
ml.run_forever(speed_sp=-70,stop_action='hold')
mr.run_forever(speed_sp=70,stop_action='hold')
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g5-g4<g3-g2-6:
mr.run_forever(speed_sp=-70,stop_action='hold')
ml.run_forever(speed_sp=70,stop_action='hold')
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_action='hold')
mr.run_forever(speed_sp=100,stop_action='hold')
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g7-g6<=g1-g3-6:
mr.run_forever(speed_sp=-70,stop_action='hold')
ml.run_forever(speed_sp=70,stop_action='hold')
g7=gs.value()
stop()
else:
while g5-g4<90:
mr.run_forever(speed_sp=-70,stop_action='hold')
ml.run_forever(speed_sp=70,stop_action='hold')
g5=gs.value()
stop()
def discover_r(s,t):
u1=us.value()
g1=gs.value()
g2=gs.value()
while g2-g1<s:
u2=us.value()
ml.run_forever(speed_sp=70,stop_action='hold')
mr.run_forever(speed_sp=-70,stop_action='hold')
g2=gs.value()
if u2<u1:
u1=u2
g3=gs.value()
g4=gs.value()
g5=gs.value()
if u1<=t:
while g4-g5<g2-g3-6:
mr.run_forever(speed_sp=70,stop_action='hold')
ml.run_forever(speed_sp=-70,stop_action='hold')
g5=gs.value()
stop()
u3=us.value()
t1=time.time()
while u3<2550:
ml.run_forever(speed_sp=100,stop_action='hold')
mr.run_forever(speed_sp=100,stop_action='hold')
u3=us.value()
t2=time.time()
stop()
roll(220)
ml.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
mr.run_timed(speed_sp=-100,time_sp=(t2-t1)*1000,stop_action='hold')
time.sleep(t2-t1)
g6=gs.value()
g7=gs.value()
while g6-g7<=g3-g1-6:
mr.run_forever(speed_sp=70,stop_action='hold')
ml.run_forever(speed_sp=-70,stop_action='hold')
g7=gs.value()
stop()
else:
while g4-g5<90:
mr.run_forever(speed_sp=70,stop_action='hold')
ml.run_forever(speed_sp=-70,stop_action='hold')
g5=gs.value()
def Redball(): #スタートから赤ボールを取りに行くプログラム
angle(250,250,3) #赤ボールの位置まで進む
kaiten_r(180,110) #ボールを掬う部分は車体の後ろにあるので180度回転する
roll(220) #ボールを掬う
kaiten_r(195,110) #車体の向きを戻す ライントレースの条件に引っかからないようにすこし余分に回っておく
linetrace_lin() #G地点まで線の右側をライントレースする
def Blueball(): 青ボールを取りに行くまでのプログラム
angle(-20,160,2) #Gの交差点をまたぐために位置を調整する
linetrace_lin() #GからHまで線の右側をライントレースする
angle(-35,-35,1.5) #Hの交差点を認識したら車体を回転した際、ボールとぶつからないように少し下がる
kaiten_r(175,110) #車体を180度回転させる
roll(220) #ボールを掬う
def move(): 青ボールを拾った後、Eの交差点に行くまでのプログラム
kaiten_r(190,110) #車体の向きを元に戻す
angle(-50,-50,1) #ライントレースが安定するように少し下がる
linetrace_lin() #Hまで線の右側をライントレースする
linetrace_lout() #Hを認識後、linetrace_lin()では右に曲がりきれないため、よりゆっくり進むこちらに切り替える
linetrace_lin() #HからI間の線の境界線上まで来たら、こちらに切り替え
linetrace_lout() #Iを認識後、こちらに先ほどと同じ理由でこちらに切り替え
linetrace_lin() #Eを認識するまでライントレース
def BlueZone(): #赤ボールを缶に乗せて分岐から帰ってきた後、青ボールを乗せに行くプログラム
linetrace_rin() #EからI間の線の左側をライントレースする
linetrace_rout() #Iを認識後、linetrace_rin()では左に曲がりきれないため、よりゆっくり進むこちらに切り替える
linetrace_rin() #IからH間の線の境界線上まで来たら、こちらに切り替え、このままHまで進む
angle(70,0,1) #交差点を跨ぐ
linetrace_rin() #HからKまでライントレースする
def discover2(): #青ボールを射出するプログラム
kaiten_l(60,100) #角度を調整しておく
discover_r(90,500) #缶に乗せるプログラム 上で説明済みなので省略
def start():
r=int(input("insert numbera")) #赤は番号の場合分けが容易だったため、赤のみダミーを避けるために分岐を設けた。その際に缶に番号を入力する。
Redball()
Blueball()
move()
if r<=2: #缶1缶2に置く時 Eの位置で缶を探し始める
kaiten_l(90,110) #E地点で上の方向を向く
discover_l(90,250) #缶を乗せるプログラムを作動 範囲は地図のピンク色の部分
kaiten_l(95,100) #E地点で左側を向く
if r==3: #缶3に置く時 Dまで進んで缶3がある範囲のみ探す
angle(-40,180,2) #Eの左下から右上に車体を移す
linetrace_lin() #EからD間の線の右側をライントレースする
discover_r(60,250) #D地点で缶を乗せるプログラムを作動 範囲は地図の青色の部分
angle(-150,-150,2) #後に車体を180度回転させた時、車体が缶3にぶつからないように少し下がる
kaiten_l(195,110) #195度左回転をする
linetrace_rin() #DからEの間を線の左側をライントレースする
angle(230,-40,2) #Eの右上から左下に移動
if r==4: #缶4に置く時 Dまで進んで缶4がある範囲のみ探す
angle(-40,180,2) #Eの左下から右上に車体を移す
linetrace_lin() #EからD間の線の右側をライントレースする
discover_l(60,250) #D地点で缶に乗せるプログラムを作動 範囲は地図の紫色の部分
kaiten_l(195,110) #195度左回転する
linetrace_rin() #DからEの間を線の左側をライントレースする
angle(230,-40,2) #Eの右上から左下に移動
if 5<=r: #缶5缶6に置く時 Uターンの手前まで進み、缶がある範囲を探す
angle(-40,180,2) #Eの左下から右上に車体を移す
linetrace_lin() #EからD間の線の右側をライントレースする
linetrace_lout() #Dの交差点を認識後、linetrace_lin()のままだと右に曲がりきれないのでこちらに切り替える
linetrace_ltime(3) #Dから急カーブ前の間で線の境界線上を認識後、3秒だけライントレースをする
discover_l(60,190) #缶に乗せるプログラムを作動 範囲は地図の緑色の部分
angle(-130,-130,3) #後に車体を180度回転する時に、車体が缶5にぶつからないように少し下がる
kaiten_l(180,110) #車体を左に180度回転する
linetrace_rin() #D地点までライントレース
linetrace_rout() #D地点を認識後、角を曲がり切れるようにこちらに切り替える
linetrace_rin() #E地点までライントレース
angle(230,-40,2) #Eの右上から左下に移動
BlueZone()
discover2()
start() #起動
*結果と振り返りと感想 [#h0d88539]
&ref(2018b/Member/shaymin/Mission3/s_COjGEQdM.jpg,100%);
写真にある通り、私たちE3E4班がボールをひとつ缶の上に乗せることに成功し優勝した
最初の実行でプログラムのミスが見つかり、短時間で修正したのでミスをつぶしきれず、二個目のボールを乗せることはできなかったが、無事にひとつ乗せることができてよかったと思う。
最初の実行でプログラムのミスが見つかり、短時間で修正したのでミスをつぶしきれず、二個目のボールを乗せることはできなかったが、無事にひとつ乗せることができてよかったと思います。
色々なアクシデントが起こりスムーズに進まなかったこともありましたが、プログラムに興味を持つ良い機会になったと思います。ありがとうございました。
&ref(2018b/Member/shaymin/Mission3/xxCGTEuL.jpg,20%);