導航:首頁 > 操作系統 > android陀螺儀滑鼠

android陀螺儀滑鼠

發布時間:2023-02-01 08:29:40

㈠ 安卓的陀螺儀和重力感應是什麼

陀螺儀
又叫角速度感測器,是不同於加速度計(G-sensor)的,他的測量物理量是偏轉,傾斜時的轉動角速度。在手機上,僅用加速度計沒辦法測量或重構出完整的3D動作,測不到轉動的動作的,G-sensor只能檢測軸向的線性動作。但陀螺儀則可以對轉動,偏轉的動作做很好的測量,這樣就可以精確分析判斷出使用者的實際動作。而後根據動作,可以對手機做相應的操作
重力感應,是指手機對地心引力的感應

android如何實現陀螺儀 sensor 在 android 嗎

千鋒扣丁學堂Android開發為您解答:
sensors.h中還定義了其他各種sensor。要實現的就是這兩個:
#define SENSOR_TYPE_MAGNETIC_FIELD 2
#define SENSOR_TYPE_ORIENTATION 3

在/hardware/sensors/sensors.cpp 中添加對MAGNETIC_FIELD和ORIENTATION 的支持
[cpp] view plain
//加入需要的宏定義
#define ID_BASE SENSORS_HANDLE_BASE
#define ID_ACCELERATION (ID_BASE+0)
#define ID_MAGNETIC_FIELD (ID_BASE+1)
#define ID_ORIENTATION (ID_BASE+2)
#define S_HANDLE_ACCELEROMETER (1<<ID_ACCELERATION)
#define S_HANDLE_MAGNETIC_FIELD (1<<ID_MAGNETIC_FIELD)
#define S_HANDLE_ORIENTATION (1<<ID_ORIENTATION)
#define SENSORS_NUM 4
#define SUPPORTED_SENSORS ((1<<NUM_SENSORS)-1)
//在 sensor_t sensors_list[] 中添加兩個sensor的信息,
//這些只是一些Sensor的信息,應用程序可以獲取到。
#ifdef MAGNETIC_FIELD
{
name : "XXX 3-axis Magnetic field sensor",
vendor : "XXX company",
version : 1,
handle : S_HANDLE_MAGNETIC_FIELD,
type : SENSOR_TYPE_MAGNETIC_FIELD,
maxRange : 600.0f,//最大范圍
resolution : 30.0f,//最小解析度
power : 6.7f,//這個不太懂
},
#endif
#ifdef ORIENTATION
{
name: "XXX Orientation sensor",
vendor: "XXX company",
version: 1,
handle: S_HANDLE_ORIENTATION,
type: SENSOR_TYPE_ORIENTATION,
maxRange: 360,
resolution: 0.1,
power: 20,
},
#endif
//定義一個結構來保存orientation的信息
static struct orientation{
float azimuth;
float pitch;
float roll;
}orientation;
//在 control__open_data_source()函數中打開設備
static native_handle_t*
control__open_data_source(struct sensors_control_device_t *dev)
{
SensorControl* ctl = (void*)dev;
native_handle_t* handle;
int fd_m = open (MAGNETIC_DATA_DEVICE, O_RDONLY);
LOGD ("Open Magnetic Data source: %d, %d/n", fd_m, errno);
if (fd_m>= 0)
{
dev->fd[ID_MAGNETIC_FIELD] = p(fd_m);
}
return handle;
}
//實現數據的打開和關閉函數
static int
data__data_open(struct sensors_data_device_t *dev, native_handle_t* handle)
{
struct sensors_data_context_t *dev;
dev = (struct sensors_data_context_t *)device;
for(int i=0 ;i<SENSORS_NUM; i++)
{
dev->fd[i] = p(handle->data[i]);
}
native_handle_close(handle);
native_handle_delete(handle);
return 0;
}
static int
data__data_close(struct sensors_data_device_t *dev)
{
struct sensors_data_context_t *dev;
dev = (struct sensors_data_context_t *)device;

for(int i=0 ;i<SENSORS_NUM; i++)
{
if (dev->fd[i] >= 0)
{
close(dev->fd[i]);
}
dev->fd[i] = -1;
}
return 0;
}
//最關鍵的poll函數
static int
data__poll(struct sensors_data_device_t *dev, sensors_data_t* values)
{
SensorData* data = (void*)dev;
int fd = data->events_fd;
//判斷設備是否打開
if(dev->fd[ID_MAGNETIC_FIELD] < 0)
{
LOGD("In %s dev[%d] is not open!/n",__FUNCTION__ ,ID_MAGNETIC_FIELD);
return -1;
}
pollfd pfd[SENSORS_NUM] =
{
//省略其他sensor代碼
{
fd: dev->fd[ID_MAGNETIC_FIELD],
events: POLLIN,
revents: 0
},
//省略其他sensor代碼
};
int err = poll (pfd, SENSORS_NUM, s_timeout);

unsigned int mask = SUPPORTED_SENSORS;
static unsigned int poll_flag=0;
if(poll_flag==0)
{
poll_flag = mask;
}
//省略其他sensor
if(poll_flag&(1<<ID_MAGNETIC_FIELD))
{
if((pfd[ID_MAGNETIC_FIELD].revents&POLLIN) == POLLIN)
{
char rawData[6];
err = read (dev->fd[ID_MAGNETIC_FIELD], &rawData, sizeof(rawData));
if(err<0)
{
LOGE("read magnetic field ret:%d errno:%d/n", err, errno);
return err;
}
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
data->time = timespec_to_ns(&t);
data->sensor = SENSOR_TYPE_MAGNETIC_FIELD;
data->magnetic.status = SENSOR_STATUS_ACCURACY_HIGH;
//上報的數據單位要轉換成 uTesla
data->magnetic.x = ( (rawData[1] << 8 ) | rawData[0])/ MAGNETIC_CONVERT;
data->magnetic.y = ( (rawData[3] << 8 ) | rawData[2])/ MAGNETIC_CONVERT;
data->magnetic.z = ( (rawData[5] << 8 ) | rawData[4])/ MAGNETIC_CONVERT;

//把陀螺儀需要的數據計算出來,用atan2(),頭文件要加上#include <math.h>
float azimuth = atan2( (float)(data->magnetic.x ),(float)(data->magnetic.y) );
if(azimuth<0)
{
azimuth = 360 - fabs(azimuth*180/PI);
}
else
{
azimuth = azimuth*180/PI;
}
orientation.azimuth = 360-azimuth;

//rotation around the X axis.+180~-180 degree
orientation.pitch = atan2( (float)(data->magnetic.y ),(float)(data->magnetic.z)
)*180/PI;
//rotation around the Y axis +90~-90 degree
float roll = atan2( (float)(data->magnetic.x ),(float)(data->magnetic.z) )
*180/PI;
if (roll > 90)
{
roll = -(180.0-roll);
}
else if (roll < -90)
{
roll = 180 + roll;
}
orientation.roll = roll;
}
return S_HANDLE_MAGNETIC_FIELD;
}
if(poll_flag&(1<<ID_MAGNETIC_FIELD))
{
//數據已經計算好了直接上報就行
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
data->time = timespec_to_ns(&t);
data->sensor = SENSOR_TYPE_ORIENTATION;
data->orientation.azimuth = orientation.azimuth;
data->orientation.pitch = orientation.pitch;
data->orientation.roll = orientation.roll;
poll_flag &= ~(1<<ID_ORIENTATION);
return S_HANDLE_ORIENTATION;
}
}

㈢ android如何實現陀螺儀 sensor 在 android 嗎

設備中的三自由度Orientation
Sensor就是一個可以識別設備相對於地面,繞x、y、z軸轉動角度的感應器(自己的理解,不夠嚴謹)。智能手機,平板電腦有了它,可以實現很多好玩的應用,比如說指南針等。

我們可以用一個磁場感應器(magnetic sensor)來實現。

磁場感應器是用來測量磁場感應強度的。一個3軸的磁sensor
IC可以得到當前環境下X、Y和Z方向上的磁場感應強度,對於Android中間層來說就是讀取該感應器測量到的這3個值。當需要時,上報給上層應用程序。磁感應強度的單位是T(特斯拉)或者是Gs(高斯),1T等於10000Gs。

先來看看android定義的坐標系,在/hardware/libhardware/include/hardware/sensors.h中有個圖。

求z和x的反正切可得到此值。

sensors.h中還定義了其他各種sensor。要實現的就是這兩個:

#define SENSOR_TYPE_MAGNETIC_FIELD 2

#define SENSOR_TYPE_ORIENTATION 3

在/hardware/sensors/sensors.cpp 中添加對MAGNETIC_FIELD和ORIENTATION 的支持

㈣ 手機陀螺儀有什麼用,哪些游戲是要陀螺儀的

手機陀螺儀的功能:

1、動作感應的GUI:通過小幅度的傾斜,偏轉手機,實現菜單,目錄的選擇和操作的執行。(比如前後傾斜手機,實現通訊錄條目的上下滾動;左右傾斜手機,實現瀏覽頁面的左右移動或者頁面的放大或縮小。)

2、轉動,輕輕晃動手機2-3下,實現電話接聽或打開網頁瀏覽器等。

3、拍照時的圖像穩定,防止手的抖動對拍照質量的影響。在按下快門時,記錄手的抖動動作,將手的抖動反饋給圖像處理器,可以抓到更清晰穩定的圖片

4、GPS的慣性導航:當汽車行駛到隧道或城市高大建築物附近,沒有GPS訊號時,可以通過陀螺儀來測量汽車的偏航或直線運動位移,從而繼續導航。

5、通過動作感應控制游戲:這也是Steve重點介紹的,也是可以給APP開發者更多創新空間的地方。開發者可以通過陀螺儀對動作檢測的結果(3D范圍內手機的動作),去實現對游戲的操作。比如,把你的手機當作一個方向盤,你的手機屏幕上是一架飛行中的戰斗機,只要你上下,左右地傾斜手機,飛機就可以做上下,左右的動作。

手機陀螺儀游戲:

現代戰爭系列,近地軌道防禦系列,搏擊長空,荒野行動等。(陀螺儀游戲一般是槍戰類的多)

拓展內容:

陀螺儀又叫角速度感測器,是不同於加速度計(G-sensor)的,他的測量物理量是偏轉、傾斜時的轉動角速度。在手機上,僅用加速度計沒辦法測量或重構出完整的3D動作,測不到轉動的動作的,G-sensor只能檢測軸向的線性動作。但陀螺儀則可以對轉動、偏轉的動作做很好的測量,這樣就可以精確分析判斷出使用者的實際動作。而後根據動作,可以對手機做相應的操作!

閱讀全文

與android陀螺儀滑鼠相關的資料

熱點內容
信息加密需要幾對密鑰 瀏覽:846
快手視頻能分文件夾嗎 瀏覽:316
雷達流速儀演算法 瀏覽:811
游戲美工重要還是程序員重要 瀏覽:437
程序員隱藏游戲彩蛋 瀏覽:246
apache載入php7 瀏覽:328
天貓程序員有什麼用 瀏覽:554
第三百章挺近劉濤 瀏覽:236
先收母親收女兒的小說 瀏覽:35
無牙仔電影叫什麼名字 瀏覽:505
樹莓派python爬蟲 瀏覽:68
穿越長征之紅星戰將 瀏覽:264
80台伺服器要用什麼防火牆 瀏覽:230
安卓應用是什麼進制 瀏覽:77
穿越民國的二道販子 瀏覽:357
伺服器出現狀況怎麼辦 瀏覽:409
有一本小說女主叫姜什麼 瀏覽:866
pdf轉換器軟體 瀏覽:643
命令提示符的雙引號 瀏覽:186
命令行運行編譯器 瀏覽:548