// @file sns_pose_6dof.proto
//
// Defines the API for Pose Six Degrees of Freedom sensors.
//
// Copyright (c) 2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.

syntax = "proto2";
import "sns_std_sensor.proto";

// A pose 6dof sensor events consists of a rotation expressed as a quaternion
// and a translation expressed in SI units.  Pose of the device is defined as
// the orientation of the device from a Earth Centered Earth Fixed frame and
// the translation from an arbitrary point at subscription.
//
// ## Pose 6DOF sensor attributes:
// SNS_STD_SENSOR_ATTRID_TYPE is "pose_6dof"
//
// ## Request Message: sns_std_sensor_config
// sns_std_sensor_config::sample_rate is used to specify the sampling rate (Hz)
// of the Pose 6DOF sensor. Sensor will generate data events at this rate.
//
// ## Event Message: sns_std_sensor_event
// Output of the Pose 6DOF sensor will be populated in sns_std_sensor_event
//
// A Pose 6DOF sensor reports the orientation of the device relative
// to the East-North-Up coordinates frame. It is obtained by
// integration of accelerometer and gyroscope readings.
// The East-North-Up coordinate system is defined as a direct
// orthonormal basis where:
//
// - X points east and is tangential to the ground.
// - Y points north and is tangential to the ground.
// - Z points towards the sky and is perpendicular to the ground.
//
// The orientation is represented by the rotation necessary to align
// the East-North-Up coordinates with the device's coordinates. That is,
// applying the rotation to the world frame (X,Y,Z) would align them with
// the device coordinates (x,y,z).
//
// The rotation can be seen as rotating the device by an angle theta around an
// axis rot_axis to go from the reference (East-North-Up aligned) device
// orientation to the current device orientation. The rotation is encoded
// as the four unitless x, y, z, w components of a unit quaternion:
//
// sns_std_sensor_event::data[0] = x*sin(theta/2)
// sns_std_sensor_event::data[1] = y*sin(theta/2)
// sns_std_sensor_event::data[2] = z*sin(theta/2)
// sns_std_sensor_event::data[3] = cos(theta/2)
// sns_std_sensor_event::data[4] = Translation along x axis from an arbitrary origin.
// sns_std_sensor_event::data[5] = Translation along y axis from an arbitrary origin.
// sns_std_sensor_event::data[6] = Translation along z axis from an arbitrary origin.
// sns_std_sensor_event::data[7] = Delta quaternion rotation x*sin(theta/2)
// sns_std_sensor_event::data[8] = Delta quaternion rotation y*sin(theta/2)
// sns_std_sensor_event::data[9] = Delta quaternion rotation z*sin(theta/2)
// sns_std_sensor_event::data[10] = Delta quaternion rotation cos(theta/2)
// sns_std_sensor_event::data[11] = Delta translation along x axis.
// sns_std_sensor_event::data[12] = Delta translation along y axis.
// sns_std_sensor_event::data[13] = Delta translation along z axis.
// sns_std_sensor_event::data[14] = Sequence number; ascending sequentially from 0

// Where:
// - the x, y and z fields of rot_axis are the East-North-Up coordinates
// of a unit length vector representing the rotation axis
// - theta is the rotation angle
//
// sns_std_sensor_event::status specifies the reliability of the sample value
// value is of type sns_std_sensor_sample_status. see sns_std_sensor.proto for
// details.
