高通sensor座標軸的轉換

2021-09-24 17:09:13 字數 4929 閱讀 9370

原文: 

高通的sensor系統中,可以讓我們在adsp中轉換sensor的座標系。由於sensor貼的位置,可能與我們的android要求的座標系不同,那麼需要轉換,有的晶元可以向裡面寫暫存器,讓晶元來幫我們轉換,高通的也可以在dd driver裡面來進行轉換。

這裡轉換座標系的資訊,我們可以儲存到nv裡面,也就是那個sns_reg檔案裡面,在初始化的時候會通過init函式傳遞進來:

sns_ddf_status_e (*init)(

sns_ddf_handle_t*         dd_handle_ptr,

sns_ddf_handle_t         smgr_handle,

sns_ddf_nv_params_s*   nv_params,

sns_ddf_device_access_s   device_info,

uint32_t                 num_devices,

sns_ddf_memhandler_s*     memhandler,

sns_ddf_sensor_e**       sensors,

uint32_t*                 num_sensors

);我們先講講使用情況,是如何對應的。

傳遞進來的引數如下:,那麼raw data就按照x,y,z 傳遞上去;

如果傳遞進來的引數是:, 那麼raw data 就按照 -x, y, -z傳遞上去;

如果傳遞進來的引數是:, 那麼 x 對應的是raw資料的 -y, y 對應的是raw資料的 z, 在對應的是raw資料的 -x

總結一下他們的對應關係是, 數字代表的是raw陣列裡面的索引,正負符號代表了資料是否反向。

下面看看**:

void sns_ddf_axes_map_init(sns_ddf_axes_map_s* axes_map, uint8_t* registry_data)

axes_map->sign_x = sign_of_int8(registry_axes_map[0]);

axes_map->indx_x = registry_axes_map[0] * axes_map->sign_x - 1;

axes_map->sign_y = sign_of_int8(registry_axes_map[1]);

axes_map->indx_y = registry_axes_map[1] * axes_map->sign_y - 1;

axes_map->sign_z = sign_of_int8(registry_axes_map[2]);

axes_map->indx_z = registry_axes_map[2] * axes_map->sign_z - 1;

}// return -1 if an int8_t is negative, or +1 otherwise.

#define sign_of_int8(x) (1 | ((x) >> 7))

這個巨集定義就只是取出了符號,代表正負,後面使用。

所以如果傳遞的是 -3,那麼 axes_map->sign_x = -1;

這些索引index呢,我們可以算算,如果是 -1或者1, 就是 (1*1) - 1 = 0;或者 (-1 * -1) - 1 = 0;

同樣的道理,如果是 -3或者3,那麼就是 (3 * 1) - 1 = 2;或者 (-3 * -1) - 1 = 2;

這些index就是將來在raw陣列裡面尋找資料的陣列下標了。

那我們在傳遞資料的時候,在呼叫了如下的函式:

void sns_ddf_map_axes(sns_ddf_axes_map_s* axes_map, q16_t* device_data)

device_data是從sensor暫存器裡面讀取出來的資料,那麼我們把上面計算出來的index作為下標,來進行對應,是否反向就用sign來相乘,這就這樣我們的座標系就完成了轉換了。

原理很簡單,我們的sensor包括加速度,陀螺儀和地磁都需要座標軸的轉換,前面講到是把這些nv引數傳遞進來初始化的。那麼他們存在nv的那個位置呢,在sns_reg_api_v02.h這個檔案中,我們定義了如下的一下巨集定義:

/**  item id's corresponding to group sns_reg_driver_group_accel (group id: 1000)  */

#define sns_reg_driver_accel_x_orient_v02 700

#define sns_reg_driver_accel_y_orient_v02 701

#define sns_reg_driver_accel_z_orient_v02 702

/**  item id's corresponding to group sns_reg_driver_group_gyro (group id: 1010)  */

#define sns_reg_driver_gyro_x_orient_v02 800

#define sns_reg_driver_gyro_y_orient_v02 801

#define sns_reg_driver_gyro_z_orient_v02 802

/**  item id's corresponding to group sns_reg_driver_group_mag (group id: 1020)  */

#define sns_reg_driver_mag_x_orient_v02 900

#define sns_reg_driver_mag_y_orient_v02 901

#define sns_reg_driver_mag_z_orient_v02 902

這些位址裡面,儲存的就是對應senosr的座標系轉換引數,我們可以用qsensortest.apk這個程式來讀取一下,剛好就是傳遞進dsps的nv引數。那麼就有兩個問題了,這些nv引數是**寫入的呢,驅動裡面又是**請求的這些nv項呢。

我們先來看後面乙個問題,我們按照這些group id 進行尋找,發現在sns_smgr_sensor_config.h這個檔案中,最每乙個sensor的相關資訊進行了定義,也包括了需要的nv引數的資訊,下面是乙個加速度的資訊摘取:

#ifdef config_use_lis3dh

#define sns_smgr_sensor_0_enum_code                   sns_smgr_id_accel_v01

#define sns_smgr_sensor_0_dd_fn_list_ptr              &sns_dd_acc_lis3dh_if

#define sns_smgr_sensor_0_device_id                   0

#define sns_smgr_sensor_0_bus_address                 0x19 /* 0x1d alternative i2c address. ranfei modify */

#define sns_smgr_sensor_0_data_type_1                 sns_ddf_sensor_accel

#define sns_smgr_sensor_0_data_type_2                 sns_ddf_sensor__none

#define sns_smgr_sensor_0_range_type                  sns_smgr_data_type_primary_v01

#define sns_smgr_sensor_0_sensitivity_default         1 /* 16g fixed. */

#define sns_smgr_sensor_0_flags                       sns_smgr_no_sensitivity //rk check this with smgr requirements

#define sns_smgr_sensor_0_off_to_idle                 1000 /* usec */ // rk check this with data sheet

#define sns_smgr_sensor_0_idle_to_ready               100000 /* usec */

#define sns_smgr_sensor_0_reg_item_type               sns_smgr_reg_item_type_group

#define sns_smgr_sensor_0_reg_item_id                 sns_reg_driver_group_accel_v02

#define sns_smgr_sensor_0_cal_pri_type                sns_smgr_reg_item_type_group

#define sns_smgr_sensor_0_cal_pri_id                  sns_reg_scm_group_accel_fac_cal_params_v02  /* 0=sns_reg_smgr_group_accel_v02 in sns_reg_api_v02.h */

#define sns_smgr_sensor_0_gpio_first                  61    //ranfei modify

#define sns_smgr_sensor_0_gpio_second                 0xffff

#endif /* config_use_lis3dh */

可以看到 #define sns_smgr_sensor_0_reg_item_id                 sns_reg_driver_group_accel_v02

這個正是前面定義的加速度座標系矯正的nv group id了。在smgr裡面呼叫 sns_err_code_e sns_smgr_req_reg_data( const uint16_t id, const uint8_t type );就可以請求讀取相應的nv引數了;

matlab座標軸的設定

matlab 繪圖的時候只用 plot 函式出來的圖不一定符合自己最想要的格式,經常要對座標的數字 範圍 間隔做處理。雖然不是什麼很難的操作,但是確實常用,也容易忘記,所以就放在這裡說明一下 xlabel x name x軸名稱 ylabel y name legend 線條注釋,多條的話 lege...

Qwt中座標軸的設定

1自定義座標軸 x軸設定為系統時間 分鐘,秒數 如下 class timescaledraw public qwtscaledraw 自畫座標軸 virtual qwttext label double v const 重繪座標軸 刻度值 setaxisscaledraw qwtplot xbott...

matlab設定座標軸的範圍

1.axis xmin xmax ymin ymax 設定當前圖形的座標範圍,分別為x軸的最小 最大值,y軸的最小最大值 2.v axis 返回包含當前座標範圍的乙個行向量 3.axis auto 將座標軸刻度恢復為自動的預設設定 4.axis manual 凍結座標軸刻度,此時如果hold被設定為...