SerialTest.java
import com.fazecast.jSerialComm.SerialPort; 
import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.PerspectiveCamera; 
import javafx.scene.Scene; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.PhongMaterial; 
import javafx.scene.shape.Cylinder; 
import javafx.scene.transform.Rotate; 
import javafx.stage.Stage; 
import java.util.Scanner; 
 
 
public class SerialTest extends Application  { 
 
    public static SerialPort myComPort = null;   // Serial port 
    String deviceConnected;                      // Device connected 
 
    double roll;                                 // Variable for roll, pitch, yaw 
    double pitch; 
    double yaw; 
 
    double w, x, y, z;                           // Variables for quaternion 
 
 
    // add a primitive cylinder 
    final Cylinder cylinder = new Cylinder(50, 100);  // cyliner construction, specify radis, height 
 
 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
 
        Group sceneRoot = new Group(); 
        Scene scene = new Scene(sceneRoot, 500, 500); 
        scene.setFill(Color.WHITE); 
 
        // create 3d camera node 
        PerspectiveCamera camera = new PerspectiveCamera(true); 
        camera.setNearClip(0.1); 
        camera.setFarClip(100000.0); 
        camera.setTranslateZ(-1000); 
        scene.setCamera(camera); 
 
        // set cylinder properties 
        final PhongMaterial blueMaterial = new PhongMaterial();   // paint for 3d interpolation 
        blueMaterial.setDiffuseColor(Color.DEEPSKYBLUE); 
        blueMaterial.setSpecularColor(Color.BLUE); 
        cylinder.setMaterial(blueMaterial); 
 
        sceneRoot.getChildren().add(cylinder);   // add shape to scene 
 
        primaryStage.setTitle("3DScene"); 
        primaryStage.setScene(scene); 
        primaryStage.show(); 
 
 
        // Start background thread 
        new Thread() { 
            @Override 
            public void run() 
            { 
                readimu(); 
            } 
 
            ; 
        }.start(); 
 
        } 
 
        private void readimu() { 
 
            // get serial ports 
            int len = SerialPort.getCommPorts().length; 
            SerialPort serialPorts[] = new SerialPort[len]; 
            serialPorts = SerialPort.getCommPorts(); 
 
            // take first serial port 
            String portName = serialPorts[0].getDescriptivePortName(); 
            System.out.println(serialPorts[0].getSystemPortName() + ": " + portName + ": " + 0); 
            myComPort = serialPorts[0]; 
 
            // connect to opened serial port 
            myComPort.setComPortParameters(9600, 8, 1, SerialPort.NO_PARITY); 
            myComPort.openPort(); 
 
            // set timeout as scanner timeout 
            myComPort.setComPortTimeouts(SerialPort.TIMEOUT_SCANNER, 100, 0); 
 
            // double to store quaternion values 
            Double[] ar = new Double[4]; 
            Scanner scanner = new Scanner(myComPort.getInputStream()); 
 
            // 
            while (scanner.hasNextLine()) { 
                try { 
 
                    String line = scanner.nextLine(); 
                    String[] tokens = line.split(","); 
 
                    // extract quaternion from csv 
                    ar[0] = Double.parseDouble(tokens[0]); 
                    ar[1] = Double.parseDouble(tokens[1]); 
                    ar[2] = Double.parseDouble(tokens[2]); 
                    ar[3] = Double.parseDouble(tokens[3]); 
 
                    w = ar[0]; 
                    x = ar[1]; 
                    y = ar[2]; 
                    z = ar[3]; 
 
 
                    // convert Eular angles 
                    roll  =   Math.atan2(2 * y * w - 2 * x * z, 1 - 2 * y * y - 2 * z * z); 
                    pitch =   Math.atan2(2 * x * w - 2 * y * z, 1 - 2 * x * x - 2 * z * z); 
                    yaw   =   Math.asin(2 * x * y + 2 * z * w); 
 
                    // convert to degrees 
                    roll  *= 57.295779513; 
                    pitch *= 57.295779513; 
                    yaw   *= 57.295779513; 
 
                    // rotate cylinder according to roll, pitch yaw values 
                    cylinder.setRotationAxis(Rotate.X_AXIS); 
                    cylinder.setRotate(roll); 
 
                    System.out.println(ar[0] + " " + ar[1] + " " + ar[2] + " " + ar[3]); 
                } 
 
                catch (Exception e) 
                { 
                    System.out.println("An error occurred"); 
                } 
            } 
        } 
 
 
 
    public static void main(String[] args) 
    { 
        // Launch application 
        Application.launch(args); 
    } 
}