{"id":575,"date":"2023-08-01T19:43:34","date_gmt":"2023-08-01T10:43:34","guid":{"rendered":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/?page_id=575"},"modified":"2023-08-19T20:25:12","modified_gmt":"2023-08-19T11:25:12","slug":"icc2023ws","status":"publish","type":"page","link":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/research\/icc2023ws\/","title":{"rendered":"ICC2023-Workshop: Control a motor by your motion!"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Goal<\/h2>\n\n\n\n<p>To build a wireless device with servo-motor and ESP32, make a software to controll the servo by your motion.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Preparation<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Check hardware components<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ESP32<\/li>\n\n\n\n<li>SG90 type servo motor<\/li>\n\n\n\n<li>Mini bread board<\/li>\n\n\n\n<li>Battery box (3 x AAA)<\/li>\n\n\n\n<li>Jumper wires<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/image-25.png\" alt=\"ESP32, SG90, Mini Bread Board, Batery Box, Jumper Pins.\" class=\"wp-image-589\" srcset=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/image-25.png 800w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/image-25-300x188.png 300w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/image-25-768x480.png 768w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/image-25-676x423.png 676w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Install software<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.python.org\/ftp\/python\/3.10.11\/python-3.10.11-amd64.exe\">python 3.10 <\/a>\n<ul class=\"wp-block-list\">\n<li>run the installer<\/li>\n\n\n\n<li>check on the  &#8220;Add Python to PATH&#8221; checkbox.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>opencv for python\n<ul class=\"wp-block-list\">\n<li>Run command promt by Win+R, &#8220;cmd&#8221;<\/li>\n\n\n\n<li>Type &#8220;pip install opencv-python&#8221;<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>mediapipe\n<ul class=\"wp-block-list\">\n<li>run the command prompt and type &#8220;pip install mediapipe&#8221;<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/downloads.arduino.cc\/arduino-ide\/arduino-ide_2.1.0_Windows_64bit.msi\">Arduino.exe<\/a>\n<ul class=\"wp-block-list\">\n<li>you don&#8217;t have to install at WS, it prepares already.<\/li>\n\n\n\n<li>if you want to use it a tyour home, just download zip and extract it OR download installer. (it takes long time to extract\/install, please wait when you will try.)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/jp.silabs.com\/documents\/public\/software\/CP210x_Universal_Windows_Driver.zip\">Driver fo CH210<\/a>\n<ul class=\"wp-block-list\">\n<li>you also don&#8217;t have to install it(and you don&#8217;t have right to install in the ICC, if it will not work properly, I will call technical staff).<\/li>\n\n\n\n<li>if you want to install the driver, open the device manager(Win+x,m) and find the CH210 device and install the new driver. <\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Check the installed python environment<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run command promt by Win+R, &#8220;cmd&#8221;<\/li>\n\n\n\n<li>type &#8220;python &#8211;version&#8221; and check the version.<\/li>\n\n\n\n<li>type &#8220;python&#8221; to run the interactive python, and type\n<ul class=\"wp-block-list\">\n<li>&gt;&gt;&gt;import cv2<\/li>\n\n\n\n<li>>>> import mediapipe<br>if there are no error, libraries have been successfully installed. congrat!<\/li>\n\n\n\n<li>&gt;&gt;&gt;exit()<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Set the configuration of Arduino.exe<\/h3>\n\n\n\n<p>Go to File Menu -&gt; Preferences -&gt; [Additional board managers], input the URL:<br>https:\/\/raw.githubusercontent.com\/espressif\/arduino-esp32\/gh-pages\/package_esp32_index.json<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"643\" src=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board01-1024x643.jpg\" alt=\"Arduino preferences\" class=\"wp-image-577\" srcset=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board01-1024x643.jpg 1024w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board01-300x188.jpg 300w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board01-768x482.jpg 768w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board01-676x425.jpg 676w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board01.jpg 1430w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Select Tools Menu -&gt; Board -&gt; Board Manager (Ctrl+Shift+B) , input &#8220;esp&#8221; to find ESP32 and press the install button. (Below picture has only &#8220;remove&#8221; because it is after installed.)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"882\" src=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board02-1-1024x882.jpg\" alt=\"Arduino exe, after imput &quot;esp&quot;\n\" class=\"wp-image-578\" srcset=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board02-1-1024x882.jpg 1024w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board02-1-300x259.jpg 300w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board02-1-768x662.jpg 768w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board02-1-676x583.jpg 676w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/06\/Arduino-board02-1.jpg 1042w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Servo Library<\/h3>\n\n\n\n<p>Go to &#8220;<a href=\"https:\/\/github.com\/RoboticsBrno\/ServoESP32\">https:\/\/github.com\/RoboticsBrno\/ServoESP32<\/a>&#8221; and Download. Move these files to (user)  -&gt; Documents -&gt; Arduino -&gt; libraries folder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Build a Hardware device<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Insert ESP32 to the bread board<\/li>\n\n\n\n<li>Insert battery cables to the bread board to connect them to Vcc and GND.<\/li>\n\n\n\n<li>Insert servo motor pins to the bread board to connect Vcc, GND, and control pin of GPIO(in this case, G12).<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"537\" src=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u63a5\u7d9a.jpg\" alt=\"after jumper pins are connected.\" class=\"wp-image-590\" srcset=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u63a5\u7d9a.jpg 800w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u63a5\u7d9a-300x201.jpg 300w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u63a5\u7d9a-768x516.jpg 768w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u63a5\u7d9a-676x454.jpg 676w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"548\" src=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u30d4\u30f3.jpg\" alt=\"points to insert the jumper wires.\" class=\"wp-image-591\" srcset=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u30d4\u30f3.jpg 800w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u30d4\u30f3-300x206.jpg 300w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u30d4\u30f3-768x526.jpg 768w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/07\/\u30d4\u30f3-676x463.jpg 676w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Sample code for checking the servo motor<\/h2>\n\n\n\n<p>To check the function of ESP32, run the code below with Arduiono.exe. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Copy &amp; Paste codes, save with appropreate file name.<\/li>\n\n\n\n<li>Check COM port number by Tools menu -&gt; Port.<\/li>\n\n\n\n<li>Check CPU Model by Tools menu -&gt;Board -&gt; esp32 -&gt; ESP32 Dev Module<\/li>\n\n\n\n<li>Ctrl+U(pload). <\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Write an arbitraly degree<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Servo.h&gt;\n\nServo myservo;        \/\/make a servo object.\n\nvoid setup() {\n  myservo.attach(12); \/\/attach G12 as a servo control pin.\n}\n\nvoid loop() {\n  myservo.write(180); \/\/rotete to 180 degree. \n  delay(1000);        \/\/wait 1000 mili second = 1 second.\n  myservo.write(0);   \/\/rotate to 0 degree.\n  delay(1000);        \/\/wait 1000 mili second = 1 second.\n}<\/code><\/pre>\n\n\n\n<p>just after uploaded the sample code, the servo motor will move 180 deg &#8212;0 deg.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Control by a message via serial port<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Servo.h&gt;\nServo myservo;        \/\/make a servo object.\nString data=\"\";       \/\/prepare a variable for receiving strings.\nchar tmp;             \/\/prepare a temporal variable.\n\nvoid setup() {\n  myservo.attach(12); \/\/attach G12 as a servo control pin.\n  Serial.begin(115200);\/\/start serial communication.\n}\n\nvoid loop() {\n  while(Serial.available()){\/\/continue during received data is remained...\n    tmp=(char)Serial.read();\/\/capture one character data from the buffer.\n    data+=tmp;              \/\/add it to the variable 'data'\n     if(tmp == '\\n'){       \/\/if the buffer is vacant,\n      myservo.write(data.toInt());\/\/change the \"data\" to integer and write to the servo motor.\n      delay(10);            \/\/wait until the servo motor moved\n      data =\"\";             \/\/clear the valiable 'data'\n     }\n  }\n}<\/code><\/pre>\n\n\n\n<p>Upload this sample to the ESP32 and run. Then, Serial monitor should be woke up and input some numbers and press the send button.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Control via Bluetooth Serial<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;Servo.h&gt;\n#include \"BluetoothSerial.h\"\nBluetoothSerial SerialBT;\/\/make a BlueTooth object\nServo myservo; \nString data=\"\";\nchar tmp;\n\nvoid setup() {\n  myservo.attach(12); \n  SerialBT.begin(\"ICC-ESP\");\/\/name an arbitrary strings.\n}\n\nvoid loop() {\n  while(SerialBT.available()){\n    tmp=(char)SerialBT.read();\n    data+=tmp;\n     if(tmp == '\\n'){\n      myservo.write(data.toInt());\n      delay(10);\n      data =\"\";\n     }\n  }\n}<\/code><\/pre>\n\n\n\n<p>Upload this sample to the ESP32 and run.<\/p>\n\n\n\n<p>Try to find the Bluetooth name (in this case, &#8220;ICC-ESP.&#8221; But please name another one because all participants should name different one.), and connect it. You can find new COM as a BT-Serial.<\/p>\n\n\n\n<p>Send some number as string via the BT-COM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Try to make a Mediapipe code<\/h2>\n\n\n\n<p>Make a new python file(arbitrary_name.py) and open it by notepad, copy the source below, paste it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2\nimport math\nimport mediapipe as mp\n\nmp_drawing = mp.solutions.drawing_utils\nmp_drawing_styles = mp.solutions.drawing_styles\nmp_pose = mp.solutions.pose\npre_angle_s = 0 #Previous Angle of Shoulder\n\ncap = cv2.VideoCapture(0)\nwith mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:\n  while cap.isOpened():\n    success, image = cap.read()\n    if not success:\n      print(\"Ignoring empty camera frame.\")\n      continue\n    image.flags.writeable = False\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    results = pose.process(image)\n\n    image.flags.writeable = True\n    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n    mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())\n    if results.pose_landmarks:\n      x1=results.pose_landmarks.landmark&#91;12].x #x1,y1 = shoulder\n      x2=results.pose_landmarks.landmark&#91;14].x #x2,y2 = elbow\n      y1=results.pose_landmarks.landmark&#91;12].y\n      y2=results.pose_landmarks.landmark&#91;14].y\n      \n      if x2&lt;x1:\n        angle_s = int(math.degrees(math.atan((y2-y1)\/(x1-x2))))\n      else:# x2&gt;=x1\n        angle_s = int(180+math.degrees(math.atan((y2-y1)\/(x1-x2))))\n\n      if angle_s &lt; 0:\n        angle_s = 0\n      elif angle_s &gt; 180:\n        angle_s = 180\n\n      print(\"\\r\"+str(angle_s))\n\n    cv2.imshow('ICC23-WS', cv2.flip(image, 1))\n    if cv2.waitKey(5) &amp; 0xFF == 27: #press ESC to exit\n      break\ncap.release()<\/code><\/pre>\n\n\n\n<p>Insert codes concerns to BlueTooth Serial.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import cv2\nimport math\nimport mediapipe as mp\n<mark style=\"background-color:#dd8e18\" class=\"has-inline-color has-dark-gray-color\"><strong>import serial<\/strong><\/mark>\n\nmp_drawing = mp.solutions.drawing_utils\nmp_drawing_styles = mp.solutions.drawing_styles\nmp_pose = mp.solutions.pose\npre_angle_s = 0\n<strong><mark style=\"background-color:#dd8e18\" class=\"has-inline-color\">ser = serial.Serial('COM5', 115200)<\/mark><\/strong>#change the COM number to your device.\n\ncap = cv2.VideoCapture(0)\nwith mp_pose.Pose(\n    min_detection_confidence=0.5,\n    min_tracking_confidence=0.5) as pose:\n  while cap.isOpened():\n    success, image = cap.read()\n    if not success:\n      print(\"Ignoring empty camera frame.\")\n      continue\n\n    image.flags.writeable = False\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    results = pose.process(image)\n\n    image.flags.writeable = True\n    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)\n    mp_drawing.draw_landmarks(\n        image,\n        results.pose_landmarks,\n        mp_pose.POSE_CONNECTIONS,\n        landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style())\n    if results.pose_landmarks:\n      x1=results.pose_landmarks.landmark&#91;12].x #x1,y1 = shoulder\n      x2=results.pose_landmarks.landmark&#91;14].x #x2,y2 = elbow\n      y1=results.pose_landmarks.landmark&#91;12].y\n      y2=results.pose_landmarks.landmark&#91;14].y\n      \n      if x2&lt;x1:\n        angle_s = int(math.degrees(math.atan((y2-y1)\/(x1-x2))))\n      else:# x2&gt;=x1\n        angle_s = int(180+math.degrees(math.atan((y2-y1)\/(x1-x2))))\n\n      if angle_s &lt; 0:\n        angle_s = 0\n      elif angle_s &gt; 180:\n        angle_s = 180\n\n      #print(\"\\r\"+str(angle_s))\n\n      #Send the angle string via Bluetooth\n<mark style=\"background-color:#dd8e18\" class=\"has-inline-color has-dark-gray-color\">     <\/mark><strong><mark style=\"background-color:#dd8e18\" class=\"has-inline-color has-dark-gray-color\"> if abs(angle_s-pre_angle_s)&gt;5:\n        ser.write(str.encode(str(angle_s)+\"\\n\"))\n        pre_angle_s = angle_s<\/mark>\n<\/strong>\n\n    cv2.imshow('ICC23-WS', cv2.flip(image, 1))\n    if cv2.waitKey(5) &amp; 0xFF == 27:\n      break\ncap.release()\n<strong><mark style=\"background-color:#dd8e18\" class=\"has-inline-color has-dark-gray-color\">ser.close()<\/mark><\/strong>#close Serial port.<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Landmarks info<\/h2>\n\n\n\n<p>Landmarks info is shown in the next figure.<\/p>\n\n\n\n<p>to change the measured positions, just change the number of arrays. For example, if you want to measure the angle of your left elbow, change the number of the arrays as below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>x1=results.pose_landmarks.landmark&#91;13].x        x2=results.pose_landmarks.landmark&#91;15].x       y1=results.pose_landmarks.landmark&#91;13].y       y2=results.pose_landmarks.landmark&#91;15].y<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"772\" height=\"438\" src=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/08\/landmarks.png\" alt=\"\" class=\"wp-image-605\" srcset=\"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/08\/landmarks.png 772w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/08\/landmarks-300x170.png 300w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/08\/landmarks-768x436.png 768w, https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-content\/uploads\/2023\/08\/landmarks-676x384.png 676w\" sizes=\"auto, (max-width: 772px) 100vw, 772px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Goal To build a wireless device with servo-motor and ESP32, make a software to controll the servo by your moti [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":45,"menu_order":20,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-575","page","type-page","status-publish","hentry","post-preview"],"_links":{"self":[{"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/pages\/575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/comments?post=575"}],"version-history":[{"count":10,"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/pages\/575\/revisions"}],"predecessor-version":[{"id":606,"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/pages\/575\/revisions\/606"}],"up":[{"embeddable":true,"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/pages\/45"}],"wp:attachment":[{"href":"https:\/\/www.cs.k.tsukuba-tech.ac.jp\/labo\/koba\/wp-json\/wp\/v2\/media?parent=575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}