{"id":46802,"date":"2024-05-24T00:00:00","date_gmt":"2024-05-24T07:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/3d-motion-tracker\/"},"modified":"2026-03-30T11:57:16","modified_gmt":"2026-03-30T18:57:16","slug":"3d-motion-tracker","status":"publish","type":"post","link":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/","title":{"rendered":"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected from an IMU sensor and Arduino Uno, processed in Node.js and visualized in Babylon.js. The GridDB is used for data storage for future analysis.<\/p>\n<h2>Project Source Code<\/h2>\n<p>The source code for this project can be found in the following GitHub <a href=\"https:\/\/github.com\/junwatu\/3d-motion-tracking\">repository<\/a>. This project requires  <a href=\"#hardware-requirements\">hardware<\/a> and <a href=\"#software-requirements\">software<\/a> components.<\/p>\n<p>To run the server, you need to install the dependencies first by running the following command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">cd app\/server\nnpm install<\/code><\/pre>\n<\/div>\n<p>Then run the server using the following command:<\/p>\n<div class=\"clipboard\">\n<pre><code>npm start<\/code><\/pre>\n<\/div>\n<p>The system will run on the demo version by default using recorded actual sensor data. Go to the URL <code>http:\/\/localhost:3000<\/code>, and the demo data will be fed to the browser every second.<\/p>\n<p>The Arduino source code or sketch can be found in the <code>app\/hardware<\/code> directory. First, you need to program the Arduino Uno. Please read <a href=\"#upload-sketch-to-arduino\">here<\/a>. Then, to import the necessary libraries, please read the <a href=\"#setting-up-the-development-environment\">setup the development environment<\/a> section.<\/p>\n<p>Please note: It would be best to restart the Node.js server every time you plug the Arduino into a new USB port, as the server cannot detect it automatically.<\/p>\n<h2>System Architecture<\/h2>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/3d-system-tracking.png\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/3d-system-tracking.png\" alt=\"\" width=\"1448\" height=\"844\" class=\"aligncenter size-full wp-image-30122\" srcset=\"\/wp-content\/uploads\/2024\/05\/3d-system-tracking.png 1448w, \/wp-content\/uploads\/2024\/05\/3d-system-tracking-300x175.png 300w, \/wp-content\/uploads\/2024\/05\/3d-system-tracking-1024x597.png 1024w, \/wp-content\/uploads\/2024\/05\/3d-system-tracking-768x448.png 768w, \/wp-content\/uploads\/2024\/05\/3d-system-tracking-600x350.png 600w\" sizes=\"(max-width: 1448px) 100vw, 1448px\" \/><\/a><\/p>\n<p>The architecture illustrates a real-time 3D tracking system involving hardware interfacing and data management. An Arduino Uno with an MPU-9250 sensor collects motion data and sends it to a Node.js server via a serial port connection. Node.js processes the data, performing tasks such as filtering, parsing, and real-time communication. It then interfaces with GridDB, a database used for storing and analyzing the data.<\/p>\n<p>Additionally, Node.js serves as a front-end displaying a 3D cube, which represents the real-time orientation captured by the MPU-9250 sensor. This frontend is a web application that visualizes the sensor data in real-time.<\/p>\n<h2>Hardware Requirements<\/h2>\n<h3>IMU sensor<\/h3>\n<p>An IMU sensor, or Inertial Measurement Unit sensor, is a device that measures the motion, orientation, and environmental conditions of an object. It consists of an <strong>accelerometer<\/strong>, <strong>gyroscope<\/strong>, and <strong>magnetometer<\/strong>. The accelerometer measures the acceleration of the object, the gyroscope measures the angular velocity, and the magnetometer measures the magnetic field. The IMU sensor used in this project is the <a href=\"https:\/\/invensense.tdk.com\/download-pdf\/mpu-9250-datasheet\/\">MPU-9250<\/a>. We will use the GY-91 module that contains the MPU-9250 sensor.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/GY-91.png\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/GY-91.png\" alt=\"\" width=\"1539\" height=\"822\" class=\"aligncenter size-full wp-image-30129\" srcset=\"\/wp-content\/uploads\/2024\/05\/GY-91.png 1539w, \/wp-content\/uploads\/2024\/05\/GY-91-300x160.png 300w, \/wp-content\/uploads\/2024\/05\/GY-91-1024x547.png 1024w, \/wp-content\/uploads\/2024\/05\/GY-91-768x410.png 768w, \/wp-content\/uploads\/2024\/05\/GY-91-1536x820.png 1536w, \/wp-content\/uploads\/2024\/05\/GY-91-600x320.png 600w\" sizes=\"(max-width: 1539px) 100vw, 1539px\" \/><\/a><\/p>\n<h3>Arduino board<\/h3>\n<p>In this project, we use <a href=\"https:\/\/docs.arduino.cc\/hardware\/uno-rev3\/\">Arduino Uno<\/a> to read the sensor data from the IMU sensor. The Arduino Uno is a microcontroller board based on the ATmega328P. It has 14 digital input\/output pins, 6 analog inputs, a 16 MHz quartz crystal, a USB connection, a power jack, an ICSP header, and a reset button.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/arduino-uno.jpg\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/arduino-uno.jpg\" alt=\"\" width=\"2048\" height=\"1603\" class=\"aligncenter size-full wp-image-30126\" srcset=\"\/wp-content\/uploads\/2024\/05\/arduino-uno.jpg 2048w, \/wp-content\/uploads\/2024\/05\/arduino-uno-300x235.jpg 300w, \/wp-content\/uploads\/2024\/05\/arduino-uno-1024x802.jpg 1024w, \/wp-content\/uploads\/2024\/05\/arduino-uno-768x601.jpg 768w, \/wp-content\/uploads\/2024\/05\/arduino-uno-1536x1202.jpg 1536w, \/wp-content\/uploads\/2024\/05\/arduino-uno-600x470.jpg 600w\" sizes=\"(max-width: 2048px) 100vw, 2048px\" \/><\/a><\/p>\n<h2>Software Requirements<\/h2>\n<p>These are the main software components used in this project:<\/p>\n<h3>Arduino IDE<\/h3>\n<p>The Arduino Uno is programmed using the <a href=\"https:\/\/docs.arduino.cc\/software\/ide-v2\/tutorials\/getting-started-ide-v2\/\">Arduino Software (IDE)<\/a>. Please follow the <a href=\"https:\/\/docs.arduino.cc\/software\/ide-v2\/tutorials\/getting-started\/ide-v2-downloading-and-installing\/\">official guide<\/a> to install the Arduino IDE on your computer.<\/p>\n<h3>Node.js<\/h3>\n<p>Node.js is an open-source, cross-platform, JavaScript runtime environment that executes JavaScript code outside a web browser. It is used to build scalable network applications. Please follow the <a href=\"https:\/\/nodejs.org\/en\/download\/\">official guide<\/a> to install Node.js on your computer.<\/p>\n<p>Node.js is used as a server to process the motion data from the IMU sensor, store to database and send it to the web browser.<\/p>\n<h3>GridDB<\/h3>\n<p>GridDB is an open-source, in-memory NoSQL database for IoT and big data applications. It is optimized for time-series data and geospatial data. Please follow the <a href=\"https:\/\/griddb.org\/docs\/2_quickstart_guide\/2.md_ce_quickstart_guide\/md_quickstart_guide\/\">official guide<\/a> to install GridDB on your computer.<\/p>\n<p>GridDB is used to store the motion data from the IMU sensor for future analysis.<\/p>\n<h2>Initial Setup Instructions<\/h2>\n<h3>Setting up the hardware<\/h3>\n<p>These are the Bill of Materials (BOM) for this project:<\/p>\n<table>\n<thead>\n<tr>\n<th>Item<\/th>\n<th>Quantity<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Arduino Uno Board<\/td>\n<td>1<\/td>\n<td>Microcontroller platform for the project.<\/td>\n<\/tr>\n<tr>\n<td>GY-91 IMU Sensor Module<\/td>\n<td>1<\/td>\n<td>Provides inertial measurement data.<\/td>\n<\/tr>\n<tr>\n<td>USB Cable<\/td>\n<td>1<\/td>\n<td>Connects Arduino to a computer for power and programming.<\/td>\n<\/tr>\n<tr>\n<td>Jumper Wires<\/td>\n<td>4<\/td>\n<td>2 for power, 2 for I2C communication.<\/td>\n<\/tr>\n<tr>\n<td>Breadboard<\/td>\n<td>1<\/td>\n<td>Platform for prototyping and testing circuits.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote><p>\n  Depending on your IMU sensor module, you may need to solder header pins to the module. You&#8217;ll need a soldering iron and lead or lead-free solder for this task.\n<\/p><\/blockquote>\n<p>There is no need to provide stand-alone power supply because the IMU sensor module and Arduino Uno will be powered by the USB cable from the computer. The interconnection between the IMU sensor module and Arduino Uno will be done using the jumper wires.<\/p>\n<h3>Setting up the development environment<\/h3>\n<p>Open the Arduino IDE and import the <code>MPU9250.zip<\/code> library package into the IDE. The package can be downloaded from <a href=\"https:\/\/github.com\/junwatu\/3d-motion-tracking\/raw\/main\/app\/hardware\/MPU9250.zip\">here<\/a>.<\/p>\n<p>To import the library, go to <code>Sketch &gt; Include Library &gt; Add ZIP Library...<\/code> and select the <code>MPU9250.zip<\/code> file.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip.png\" alt=\"\" width=\"1216\" height=\"745\" class=\"aligncenter size-full wp-image-30124\" srcset=\"\/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip.png 1216w, \/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip-300x184.png 300w, \/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip-1024x627.png 1024w, \/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip-768x471.png 768w, \/wp-content\/uploads\/2024\/05\/add-library-mpu9250-zip-600x368.png 600w\" sizes=\"(max-width: 1216px) 100vw, 1216px\" \/><\/a><\/p>\n<h2>IMU and Arduino Integration<\/h2>\n<h3>Connecting the IMU sensor with Arduino<\/h3>\n<p>The IMU sensor is connected to the Arduino Uno using the I2C interface. The device interconnection is shown in the following diagram:<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/imu-arduino-uno.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/imu-arduino-uno.png\" alt=\"\" width=\"939\" height=\"528\" class=\"aligncenter size-full wp-image-30130\" srcset=\"\/wp-content\/uploads\/2024\/05\/imu-arduino-uno.png 939w, \/wp-content\/uploads\/2024\/05\/imu-arduino-uno-300x169.png 300w, \/wp-content\/uploads\/2024\/05\/imu-arduino-uno-768x432.png 768w, \/wp-content\/uploads\/2024\/05\/imu-arduino-uno-150x85.png 150w, \/wp-content\/uploads\/2024\/05\/imu-arduino-uno-600x337.png 600w\" sizes=\"(max-width: 939px) 100vw, 939px\" \/><\/a><\/p>\n<p>The connections are as follows:<\/p>\n<table>\n<thead>\n<tr>\n<th>Arduino Uno Pin<\/th>\n<th>GY-91 IMU Sensor Pin<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>3.3V<\/td>\n<td>VCC<\/td>\n<\/tr>\n<tr>\n<td>GND<\/td>\n<td>GND<\/td>\n<\/tr>\n<tr>\n<td>A4 (SDA)<\/td>\n<td>SDA<\/td>\n<\/tr>\n<tr>\n<td>A5 (SCL)<\/td>\n<td>SCL<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>To program the Arduino Uno, you need to connect it to the computer using the USB cable.<\/p>\n<h3>Reading sensor data using Arduino<\/h3>\n<p>To read sensor data using Arduino, we need to program the Arduino first. Create a new sketch, then copy and paste the following code into the sketch:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-c\">#include \"MPU9250.h\"\n\n\/\/ an MPU9250 object with the MPU-9250 sensor on I2C bus 0 with address 0x68\nMPU9250 IMU(Wire,0x68);\nint status;\n\nvoid setup() {\n  \/\/ serial to display data\n  Serial.begin(115200);\n  while(!Serial) {}\n\n  \/\/ start communication with IMU \n  status = IMU.begin();\n  if (status < 0) {\n    Serial.println(\"IMU initialization unsuccessful\");\n    Serial.println(\"Check IMU wiring or try cycling power\");\n    Serial.print(\"Status: \");\n    Serial.println(status);\n    while(1) {}\n  }\n}\n\nvoid loop() {\n  \/\/ read the sensor\n  IMU.readSensor();\n  \/\/ display the data\n  Serial.print(\"ax:\");\n  Serial.print(IMU.getAccelX_mss(),6);\n  Serial.print(\"t\");\n  Serial.print(\"ay:\");\n  Serial.print(IMU.getAccelY_mss(),6);\n  Serial.print(\"t\");\n  Serial.print(\"az:\");\n  Serial.print(IMU.getAccelZ_mss(),6);\n  Serial.print(\"t\");\n  Serial.print(\"gx:\");\n  Serial.print(IMU.getGyroX_rads(),6);\n  Serial.print(\"t\");\n  Serial.print(\"gy:\");\n  Serial.print(IMU.getGyroY_rads(),6);\n  Serial.print(\"t\");\n  Serial.print(\"gz:\");\n  Serial.print(IMU.getGyroZ_rads(),6);\n  Serial.print(\"t\");\n  Serial.print(\"mx:\");\n  Serial.print(IMU.getMagX_uT(),6);\n  Serial.print(\"t\");\n  Serial.print(\"my:\");\n  Serial.print(IMU.getMagY_uT(),6);\n  Serial.print(\"t\");\n  Serial.print(\"my:\");\n  Serial.print(IMU.getMagZ_uT(),6);\n  Serial.print(\"t\");\n  Serial.print(\"s:\");\n  Serial.println(IMU.getTemperature_C(),6);\n  delay(100);\n}<\/code><\/pre>\n<\/div>\n<p>The code tells us to read the sensor data via the I2C bus (<code>Wire<\/code>) at address <code>0x68<\/code> for every 100 milliseconds. The data is sent to the serial port at a baud rate of <code>115200<\/code>and it is in the form of a comma-separated string. The first 9 values are the <strong>accelerometer<\/strong>, <strong>gyroscope<\/strong>, and <strong>magnetometer<\/strong> data. The last value is the <strong>temperature<\/strong> in Celsius.<\/p>\n<h3>Upload Sketch to Arduino<\/h3>\n<p>To program the Arduino Uno, upload the sketch by clicking the <strong>Upload<\/strong> button at the top left corner of the Arduino IDE (Arrow icon).<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/3D-Tracking-System.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/3D-Tracking-System.gif\" alt=\"\" width=\"640\" height=\"360\" class=\"aligncenter size-full wp-image-30123\" \/><\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/upload-sketch.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/upload-sketch.png\" alt=\"\" width=\"971\" height=\"384\" class=\"aligncenter size-full wp-image-30132\" srcset=\"\/wp-content\/uploads\/2024\/05\/upload-sketch.png 971w, \/wp-content\/uploads\/2024\/05\/upload-sketch-300x119.png 300w, \/wp-content\/uploads\/2024\/05\/upload-sketch-768x304.png 768w, \/wp-content\/uploads\/2024\/05\/upload-sketch-600x237.png 600w\" sizes=\"(max-width: 971px) 100vw, 971px\" \/><\/a><\/p>\n<p>It is recommended that you verify the sketch program before uploading it to the Arduino Uno. You can verify the sketch by clicking the tick mark icon.<\/p>\n<h3>Monitor Sensor Data<\/h3>\n<p>Open the serial monitor to see the sensor data. The serial monitor can be opened by clicking the magnifying glass icon on the top right corner of the Arduino IDE.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/arduino-serial-monitor.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/arduino-serial-monitor.png\" alt=\"\" width=\"1216\" height=\"745\" class=\"aligncenter size-full wp-image-30125\" srcset=\"\/wp-content\/uploads\/2024\/05\/arduino-serial-monitor.png 1216w, \/wp-content\/uploads\/2024\/05\/arduino-serial-monitor-300x184.png 300w, \/wp-content\/uploads\/2024\/05\/arduino-serial-monitor-1024x627.png 1024w, \/wp-content\/uploads\/2024\/05\/arduino-serial-monitor-768x471.png 768w, \/wp-content\/uploads\/2024\/05\/arduino-serial-monitor-600x368.png 600w\" sizes=\"(max-width: 1216px) 100vw, 1216px\" \/><\/a><\/p>\n<p>In the serial monitor, you should see the sensor data in the following format:<\/p>\n<div class=\"clipboard\">\n<pre><code>ax:0 ay:0 az:-9.1 gx:0 gy:0 gz:0 mx:13.0 my:57.1 my:-105.3 s:27.4<\/code><\/pre>\n<\/div>\n<p>You can also use CLI serial communication tools such as <a href=\"https:\/\/www.man7.org\/linux\/man-pages\/man1\/minicom.1.html\">minicom<\/a> to read the sensor data.<\/p>\n<p>Using Ubuntu Linux, you can install minicom using the following command:<\/p>\n<div class=\"clipboard\">\n<pre><code>sudo apt install minicom<\/code><\/pre>\n<\/div>\n<p>Then run the following command to read the sensor data:<\/p>\n<div class=\"clipboard\">\n<pre><code>minicom -D \/dev\/ttyACM0 -b 115200<\/code><\/pre>\n<\/div>\n<p>Just make sure to close the Arduino IDE serial monitor before running the command above.<\/p>\n<h2>Node.js and WebSocket Integration<\/h2>\n<h3>Read sensor data from Arduino<\/h3>\n<p>Node.js reads the sensor data from the Arduino Uno via the serial port. In this project, we use the <a href=\"https:\/\/serialport.io\/\">serialport<\/a> library to read the data.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">import { SerialPort } from 'serialport';\nimport { ReadlineParser } from '@serialport\/parser-readline';\nimport { saveData, getAllData, getDatabyID, info } from '.\/griddbservices.js';\n\n\/\/ Serial port setup\nconst port = new SerialPort({ path: 'COM5', baudRate: 115200 });\nconst parser = port.pipe(new ReadlineParser({ delimiter: 'n' }));\n\nparser.on('data', (data) => {\n console.log(data);\n const parsedData = parseSensorData(data);\n await saveData({ sensorData: JSON.stringify(parsedData) });\n broadcastData(JSON.stringify(parsedData));\n});<\/code><\/pre>\n<\/div>\n<p>The data is then <code>broadcasted<\/code> to the web browser via WebSocket and also stored in GridDB for future analysis.<\/p>\n<div class=\"clipboard\">\n<pre><code>await saveData({ sensorData: JSON.stringify(parsedData) });<\/code><\/pre>\n<\/div>\n<p>As previously mentioned, you need to close the existing serial port connection, such as the Arduino IDE serial monitor or any program that uses the serial port, such as minicom, so the Node.js server will be able to read the sensor data.<\/p>\n<h3>Websocket<\/h3>\n<p>WebSocket is a communication protocol that provides full-duplex communication channels over a single TCP connection. It is used in this project to send the sensor data from Node.js to the web browser in real-time. We use the <a href=\"https:\/\/www.npmjs.com\/package\/ws\">ws<\/a> library to implement the WebSocket server in Node.js.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">import express from 'express';\nimport { createServer } from 'http';\nimport { WebSocketServer, WebSocket } from 'ws';\n\nconst app = express();\nconst server = createServer(app);\nconst wss = new WebSocketServer({ server });\n\nwss.on('connection', (ws) => {\n  console.log('WebSocket client connected');\n  ws.on('close', () => console.log('WebSocket client disconnected'));\n});\n\nconst broadcastData = (data) => {\n wss.clients.forEach((client) => {\n  if (client.readyState === WebSocket.OPEN) {\n   client.send(data);\n  }\n });\n};<\/code><\/pre>\n<\/div>\n<h2>Processing and Visualizing Data<\/h2>\n<h3>Data Processing<\/h3>\n<p>The data is parsed and then processed for adjusting the coordinate system and converting the units. Make sure to read the sensor data sheet before to understand the units of the sensor data.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">function parseSensorData(data) {\n \/\/ Parse the data string\n const sensorValues = data.split('t').map(val => parseFloat(val.split(':')[1]));\n\n \/\/ The order of the data is ax, ay, az, gx, gy, gz, mx, my, mz\n const [ax, ay, az, gx, gy, gz, mx, my, mz, s] = sensorValues;\n\n \/\/ Normalize accelerometer data if needed (currently in m\/s\u00c2\u00b2, convert to g's if necessary)\n const accel = {\n  x: ax \/ 1000,\n  y: ay \/ 1000,\n  z: az \/ 1000\n };\n\n \/\/ Gyroscope data is in rad\/s, which is what the Madgwick filter expects, so no conversion needed\n const gyro = { x: gx, y: gy, z: gz };\n\n \/\/ Magnetometer data is in microteslas (uT), convert to Teslas by dividing by 1,000,000 if necessary\n const mag = {\n  x: mx \/ 1000000,\n  y: my \/ 1000000,\n  z: mz \/ 1000000\n };\n\n const temp = { s }\n\n return { accel, gyro, mag, s };\n}<\/code><\/pre>\n<\/div>\n<p>This parsed data is then sent to the web browser via WebSocket.<\/p>\n<h3>Visualizing with Babylon.js<\/h3>\n<p>To visualize the motion data, we use <a href=\"https:\/\/www.babylonjs.com\/\">Babylon.js<\/a>, a JavaScript framework for building 3D games and applications with WebGL and WebVR. The HTML is as follows:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;meta charset=\"utf-8\" \/&gt;\n    &lt;title&gt;3D Sensor Visualization&lt;\/title&gt;\n    &lt;script src=\"https:\/\/cdn.babylonjs.com\/babylon.js\"&gt;&lt;\/script&gt;\n    &lt;style&gt;\n        #renderCanvas {\n            width: 100%;\n            height: 100vh;\n            touch-action: none;\n        }\n    &lt;\/style&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n    &lt;canvas id=\"renderCanvas\"&gt;&lt;\/canvas&gt;\n    &lt;script&gt;\n        window.addEventListener('DOMContentLoaded', () =&gt; {\n            const canvas = document.getElementById('renderCanvas');\n            const engine = new BABYLON.Engine(canvas, true);\n\n            const createScene = () =&gt; {\n                const scene = new BABYLON.Scene(engine);\n                const camera = new BABYLON.ArcRotateCamera(\"camera\", -Math.PI \/ 2, Math.PI \/ 2.5, 10, new BABYLON.Vector3(0, 0, 0), scene);\n                camera.attachControl(canvas, true);\n                new BABYLON.HemisphericLight(\"light\", new BABYLON.Vector3(1, 1, 0), scene);\n                const box = BABYLON.MeshBuilder.CreateBox(\"box\", { size: 2 }, scene);\n                return { scene, box };\n            };\n\n            const { scene, box } = createScene();\n\n            const ws = new WebSocket('ws:\/\/localhost:3000');\n            ws.onmessage = (event) =&gt; {\n                const sensorData = JSON.parse(event.data);\n                const { gyro } = sensorData;\n\n                \/\/ Update cube rotation with gyro data in radians\/s\n                \/\/ Assume you're receiving data at a rate of 60Hz (or adjust as per your rate)\n                box.rotation.x += gyro.x \/ 10; \/\/ Update rotation based on gyro data\n                box.rotation.y += gyro.y \/ 10;\n                box.rotation.z += gyro.z \/ 10;\n            };\n\n            engine.runRenderLoop(() =&gt; {\n                scene.render();\n            });\n\n            window.addEventListener('resize', () =&gt; {\n                engine.resize();\n            });\n        });\n    &lt;\/script&gt;\n&lt;\/body&gt;\n\n&lt;\/html&gt;<\/code><\/pre>\n<\/div>\n<p>The code above creates a scene with a camera, a light, and a box. The box will be rotated based on the gyroscope data from the IMU sensor. The gyroscope data is received via WebSocket from Node.js.<\/p>\n<p>&lt;div align=\"center\"&gt;<br \/>\n    &lt;img src=\"images\/3D-Tracking-System.gif\"\/&gt;<br \/>\n    &lt;br\/&gt;<br \/>\n &lt;\/div&gt;<\/p>\n<p>By default, the WebSocket URL runs on <code>localhost<\/code> with the port <code>3000<\/code>. You need to change the WebSocket URL to match your Node.js server URL and change the code in this line:<\/p>\n<div class=\"clipboard\">\n<pre><code>const ws = new WebSocket('ws:\/\/localhost:3000');<\/code><\/pre>\n<\/div>\n<h2>Storing Data with GridDB<\/h2>\n<p>The GridDB stores the motion data from the IMU sensor for future analysis. The file <code>app\/server\/griddbservices.js<\/code> is a wrapper for <code>libs\/griddb.js<\/code> that contains the GridDB functions.<\/p>\n<p>To save parsed sensor data to GridDB, the code is as follows:<\/p>\n<div class=\"clipboard\">\n<pre><code>await saveData({ sensorData: JSON.stringify(parsedData) });<\/code><\/pre>\n<\/div>\n<p>The data is stored in the form of a JSON string. You can look at the <code>libs\/griddb.js<\/code> file to see how the data is stored in GridDB.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">function initContainer() {\n    const conInfo = new griddb.ContainerInfo({\n        name: containerName,\n        columnInfoList: [\n            ['id', griddb.Type.INTEGER],\n            ['data', griddb.Type.STRING],\n        ],\n        type: griddb.ContainerType.COLLECTION,\n        rowKey: true,\n    });\n\n    return conInfo;\n}<\/code><\/pre>\n<\/div>\n<h2>Data Retrieval from GridDB<\/h2>\n<p>To retrieve all data from GridDB, the code is as follows:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">app.get('\/data', async (req, res) => {\n    log.info('Getting all data from GridDB');\n    try {\n        const result = await getAllData();\n        res.json(result);\n    } catch (error) {\n        res.status(500).send('Error getting all data');\n    }\n})<\/code><\/pre>\n<\/div>\n<p>You can retrieve the data from the browser by accessing the URL <code>http:\/\/localhost:3000\/data<\/code>.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/griddb-data.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/griddb-data.png\" alt=\"\" width=\"1071\" height=\"585\" class=\"aligncenter size-full wp-image-30128\" srcset=\"\/wp-content\/uploads\/2024\/05\/griddb-data.png 1071w, \/wp-content\/uploads\/2024\/05\/griddb-data-300x164.png 300w, \/wp-content\/uploads\/2024\/05\/griddb-data-1024x559.png 1024w, \/wp-content\/uploads\/2024\/05\/griddb-data-768x419.png 768w, \/wp-content\/uploads\/2024\/05\/griddb-data-600x328.png 600w\" sizes=\"(max-width: 1071px) 100vw, 1071px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected from an IMU sensor and Arduino Uno, processed in Node.js and visualized in Babylon.js. The GridDB is used for data storage for future analysis. Project Source Code The [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":30127,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-46802","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-24T07:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-30T18:57:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/cover-1024x585.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"585\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB\",\"datePublished\":\"2024-05-24T07:00:00+00:00\",\"dateModified\":\"2026-03-30T18:57:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\"},\"wordCount\":1490,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2024\/05\/cover.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\",\"url\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\",\"name\":\"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2024\/05\/cover.png\",\"datePublished\":\"2024-05-24T07:00:00+00:00\",\"dateModified\":\"2026-03-30T18:57:16+00:00\",\"description\":\"Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2024\/05\/cover.png\",\"contentUrl\":\"\/wp-content\/uploads\/2024\/05\/cover.png\",\"width\":1792,\"height\":1024},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB | GridDB: Open Source Time Series Database for IoT","description":"Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/","og_locale":"en_US","og_type":"article","og_title":"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB | GridDB: Open Source Time Series Database for IoT","og_description":"Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected","og_url":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2024-05-24T07:00:00+00:00","article_modified_time":"2026-03-30T18:57:16+00:00","og_image":[{"width":1024,"height":585,"url":"https:\/\/griddb.net\/wp-content\/uploads\/2024\/05\/cover-1024x585.png","type":"image\/png"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#article","isPartOf":{"@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/"},"author":{"name":"griddb-admin","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB","datePublished":"2024-05-24T07:00:00+00:00","dateModified":"2026-03-30T18:57:16+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/"},"wordCount":1490,"commentCount":0,"publisher":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2024\/05\/cover.png","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/","url":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/","name":"Building a 3D Motion Tracker: Integrating IMU, Arduino, Babylon.js, and GridDB | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2024\/05\/cover.png","datePublished":"2024-05-24T07:00:00+00:00","dateModified":"2026-03-30T18:57:16+00:00","description":"Introduction In this tutorial, we will build a 3D motion tracker that can visualize the motion of an object in real time. The motion data is collected","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/blog\/3d-motion-tracker\/#primaryimage","url":"\/wp-content\/uploads\/2024\/05\/cover.png","contentUrl":"\/wp-content\/uploads\/2024\/05\/cover.png","width":1792,"height":1024},{"@type":"WebSite","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#website","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#organization","name":"Fixstars","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/46802","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/comments?post=46802"}],"version-history":[{"count":2,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/46802\/revisions"}],"predecessor-version":[{"id":55106,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/posts\/46802\/revisions\/55106"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media\/30127"}],"wp:attachment":[{"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/media?parent=46802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/categories?post=46802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/griddb.net\/en\/wp-json\/wp\/v2\/tags?post=46802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}