原文:
高通的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被設定為...