Animeation (YouTube 0:41-0:54 Left side)
segway_anime.plt
# Setting -------------------- reset set nokey set origin -0.25,0.0 unset grid L = 1.0 x = 2.0 y = 4.0 set size ratio y/(2.0*x) set xr[-x*L:x*L] set yr[-0.5:3.5] set xtics 2 set ytics 1 set xl "{/Times:Italic=24 x} {/Times:Normal=24 [m]}" set yl "{/Times:Italic=24 y} {/Times:Normal=24 [m]}" set tics font 'Times, 20' # Parametr -------------------- ww = 0.1 # Width of wheel [m] pw = 0.1 # Width of pendulum [m] wg = 1000 # Density of wheel [kg/m3] pg = 1000 # Density of pendulum [kg/m3] r = 0.5 # Radius of wheel [m] rsen = 0.03 # Radius of sensor [m] l = 2.5 # Length of pendulum [m] m = pw*2*l*pg # Weight of pendulum [kg] M = pi*r**2*ww*wg # Weight of wheel [kg] a = 1.0 # Distance from Center of pendulum to Center of rotation [m] g = 9.81 # Gravitational acceleration [m/s2] dt = 0.002 # Time step [s] # Proportional gain kp1 = 5000.0 # pendulum [Nm/rad] kp2 = 100.0 # wheel [Nm/rad] # Differential gain kd1 = 100.0 # pendulum [Nms/rad] kd2 = 100.0 # wheel [Nms/rad] lim1 = 120 # Stop time lim2 = 6000 # Loop limit cut = 10 # Decimation # coefficient dx = dt/6 apl = a+l/2 lma = l/2-a # Set filename and output filename = sprintf("anime %04d-%04d-%04d-%04d.gif", kp1, kp2, kd1, kd2) set term gif animate delay 2 size 600,480 set output filename # Function -------------------- # Coefficient matrix A = m * (a**2 + (l**2)/12) # (1,1) B = m*a*r # (1,2) (2, 1) C = (m + 3/2*M) * r**2 # (2, 2) D = A * C # Coefficient E = B**2 F = m * g * a # Torque # Torque generated by motor installed in wheel Tr(s, t, u, v) = kp1*s + kd1*t + kp2*u + kd2*v # theta' (pendulum angular velocity) f1(s, t, u, v) = t # theta'' (pendulum angular acceleration) f2(s, t, u, v) = \ ( C*(F*sin(s)-Tr(s, t, u, v)) - B*cos(s)*( Tr(s, t, u, v)+B*(t**2)*sin(s) ) ) / (D-E*(cos(s))**2) # phi' (wheel angular velocity) f3(s, t, u, v) = v # phi'' (wheel angular acceleration) f4(s, t, u, v) = \ ( A*(F*sin(s)-Tr(s, t, u, v)) - B*cos(s)*( Tr(s, t, u, v)+B*(t**2)*sin(s) ) ) / (D-E*(cos(s))**2) # Label displaying gains gain(a, b, c, d) = sprintf("\ {/Times:Italic K_{/Times:Normal p1}} = %d\n\ {/Times:Italic K_{/Times:Normal p2}} = %d\n\ {/Times:Italic K_{/Times:Normal d1}} = %d\n\ {/Times:Italic K_{/Times:Normal d2}} = %d", \ a, b, c, d) # Time time(t) = sprintf("{/Times:Italic t} = %.2f [s]", t) # Plot -------------------- # Initiate value x1 = pi/180*10 # theta (pendulum) x2 = pi/180*100 # theta' x3 = 0.0 # phi (wheel) x4 = 0.0 # phi' t = 0.0 # time # Draw initiate state (t = 0) for lim1 steps do for [i = 1:lim1] { # Gain and time set label 1 left at graph 1.02, 0.9 gain(kp1, kp2, kd1, kd2) font 'Times:Normal, 18' set label 2 center at graph 0.5, 0.93 time(t) font 'Times:Normal, 18' # Center of wheel G (x-coordinate) xg =r*x3 # Wheel set object 1 circle at xg, r fc rgb 'grey50' size r fs solid # Sensor set object 2 circle at xg+r*sin(x3), r+r*cos(x3) fc rgb 'black' size rsen+0.03 fs solid set object 3 circle at xg+r*sin(x3), r+r*cos(x3) fc rgb 'white' size rsen fs solid # Pendulum set arrow 1 nohead lw 7 from xg-lma*sin(x1), r-lma*cos(x1) to xg+apl*sin(x1), r+apl*cos(x1) lc 6 # Center of wheel set object 4 circle at xg, r fc rgb 'black' size rsen fs solid front set arrow 2 nohead lw 4 from -x*L, 0 to x*L, 0 lc -1 plot 1/0 } # Update for lim2 steps do for [i = 1:lim2] { t = t + dt # Calculate using Runge-Kutta 4th k11 = f1(x1, x2, x3, x4) k12 = f2(x1, x2, x3, x4) k13 = f3(x1, x2, x3, x4) k14 = f4(x1, x2, x3, x4) k21 = f1(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k22 = f2(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k23 = f3(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k24 = f4(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k31 = f1(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k32 = f2(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k33 = f3(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k34 = f4(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k41 = f1(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) k42 = f2(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) k43 = f3(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) k44 = f4(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) x1 = x1 + dx * (k11 + 2*k21 + 2*k31 + k41) x2 = x2 + dx * (k12 + 2*k22 + 2*k32 + k42) x3 = x3 + dx * (k13 + 2*k23 + 2*k33 + k43) x4 = x4 + dx * (k14 + 2*k24 + 2*k34 + k44) # Center of wheel G (x-coordinate) xg = r * x3 # Wheel set object 1 at xg, r # Sensor set object 2 at xg+r*sin(x3), r+r*cos(x3) set object 3 at xg+r*sin(x3), r+r*cos(x3) # Pendulum set arrow 1 from xg-lma*sin(x1), r-lma*cos(x1) to xg+(a+l/2)*sin(x1), r+(a+l/2)*cos(x1) # Center of wheel set object 4 circle at xg, r # Title set label 4 center at graph 0.5, 0.93 time(t) font 'Times:Normal, 18' # Decimate and draw if(i%cut==0){ frx = xg-x*L # Set x-range tox = xg+x*L set arrow 2 nohead lw 4 from frx, 0 to tox, 0 lc -1 # Draw ground plot [frx:tox] [-0.5:3.5] 1/0 } } set out
sanime 5000-0100-0100-0100.gif
Graph (YouTube 0:41-0:54 Right side)
segway_graph.plt
# Setting -------------------- reset set key right top set size ratio 1.0 set grid set xl "{/Times:Italic=24 t} {/Times:Normal=24 [rad]}" set yl "{/symbol:Italic=24 q f} {/Times:Normal=24 [s]}" set xtics 2 set ytics 1 set tics font 'Times, 20' # Patameter-------------------- ww = 0.1 # Width of wheel [m] pw = 0.1 # Width of pendulum [m] wg = 1000 # Density of wheel [kg/m3] pg = 1000 # Density of pendulum [kg/m3] r = 0.5 # Radius of wheel [m] rsen = 0.03 # Radius of sensor [m] l = 2.5 # Length of pendulum [m] m = pw*2*l*pg # Weight of pendulum [kg] M = pi*r**2*ww*wg # Weight of wheel [kg] a = 1.0 # Distance from Center of pendulum to Center of rotation [m] g = 9.81 # Gravitational acceleration [m/s2] dt = 0.002 # Time step [s] dx = dt/6 # Proportional gain kp1 = 5000.0 # pendulum [Nm/rad] kp2 = 100.0 # wheel [Nm/rad] # Differential gain kd1 = 100.0 # pendulum [Nms/rad] kd2 = 100.0 # wheel [Nms/rad] lim1 = 120 # Stop time lim2 = 6000 # Time limit cut = 10 # Decimation graphr = 0.5 # Radius of point plot # Set filename and output filename = sprintf("graph %04d-%04d-%04d-%04d.gif", kp1, kp2, kd1, kd2) set term gif animate delay 2 size 1280,480 set output filename # Function -------------------- # Coefficient matrix A = m * (a**2 + (l**2)/12) # (1,1) B = m*a*r # (1,2) (2, 1) C = (m + 3/2*M) * r**2 # (2, 2) D = A * C # Coefficient E = B**2 F = m * g * a # Torque # Torque generated by motor installed in wheel Tr(s, t, u, v) = kp1*s + kd1*t + kp2*u + kd2*v # theta' (pendulum angular velocity) f1(s, t, u, v) = t # theta'' (pendulum angular acceleration) f2(s, t, u, v) = \ ( C*(F*sin(s)-Tr(s, t, u, v)) - B*cos(s)*( Tr(s, t, u, v)+B*(t**2)*sin(s) ) ) / (D-E*(cos(s))**2) # phi' (wheel angular velocity) f3(s, t, u, v) = v # phi'' (wheel angular acceleration) f4(s, t, u, v) = \ ( A*(F*sin(s)-Tr(s, t, u, v)) - B*cos(s)*( Tr(s, t, u, v)+B*(t**2)*sin(s) ) ) / (D-E*(cos(s))**2) # Label displaying gains gain(a, b, c, d) = sprintf("\ {/Times:Italic K_{/Times:Normal p1}} = %d\n\ {/Times:Italic K_{/Times:Normal p2}} = %d\n\ {/Times:Italic K_{/Times:Normal d1}} = %d\n\ {/Times:Italic K_{/Times:Normal d2}} = %d", \ a, b, c, d) # Plot -------------------- # Initiate value x1 = pi/180*10 # theta (pendulum) x2 = pi/180*100 # theta' x3 = 0.0 # phi (wheel) x4 = 0.0 # phi' t = 0.0 # time # Draw initiate state (t = 0) for lim1 steps do for [i = 1:lim1] { set xr[0:dt*lim2] set yr[-3:3] # Point plot set label 1 at t, x1 point lc 6 ps graphr pt 7 set label 2 at t, x3 point lc 0 ps graphr pt 7 # X-Axis (t:time) set arrow 1 nohead from 0, 0 to 12, 0 lc -1 lw 2 # Set key plot 1/0 lw 0 lc rgb 'white' t " ",\ 1/0 lw 4 lc 6 t "{/symbol:italic=24 q} ",\ 1/0 lw 0 lc rgb 'white' t " ",\ 1/0 lw 4 lc 0 t "{/symbol:italic=24 f} " } # Update for lim2 steps do for [i = 1:lim2] { t = t + dt # Calculate using Runge-Kutta 4th k11 = f1(x1, x2, x3, x4) k12 = f2(x1, x2, x3, x4) k13 = f3(x1, x2, x3, x4) k14 = f4(x1, x2, x3, x4) k21 = f1(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k22 = f2(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k23 = f3(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k24 = f4(x1+dt/2*k11, x2+dt/2*k12, x3+dt/2*k13, x4+dt/2*k14 ) k31 = f1(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k32 = f2(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k33 = f3(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k34 = f4(x1+dt/2*k21, x2+dt/2*k22, x3+dt/2*k23, x4+dt/2*k24 ) k41 = f1(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) k42 = f2(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) k43 = f3(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) k44 = f4(x1+dt*k31, x2+dt*k32, x3+dt*k33, x4+dt*k34 ) x1 = x1 + dx * (k11 + 2*k21 + 2*k31 + k41) x2 = x2 + dx * (k12 + 2*k22 + 2*k32 + k42) x3 = x3 + dx * (k13 + 2*k23 + 2*k33 + k43) x4 = x4 + dx * (k14 + 2*k24 + 2*k34 + k44) # Point plot set label 2*i+3 at t, x1 point lc 6 ps grar pt 7 set label 2*i+4 at t, x3 point lc 0 ps grar pt 7 # Decimate and draw if(i%cut==0){ plot 1/0 lw 0 lc rgb 'white' t " ",\ 1/0 lw 4 lc 6 t "{/symbol:italic=24 q} ",\ 1/0 lw 0 lc rgb 'white' t " ",\ 1/0 lw 4 lc 0 t "{/symbol:italic=24 f} " } } set out
graph 5000-0100-0100-0100.gif
Reference
WikipediaSegway
こんにちは。親愛なるサー私はあなたが元気になることを願っています。車輪付き倒立振子のMファイルが必要です。気にしないのであれば。私は親愛なるサーに非常に感謝するでしょう。
ReplyDelete