0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于RT-Thread的RoboMaster電控框架(四)

冬至子 ? 來源:螺絲松掉的人 ? 作者:螺絲松掉的人 ? 2023-09-20 15:28 ? 次閱讀

背景

使用的開發(fā)板為大疆RoboMaster-C 型開發(fā)板,基礎(chǔ)工程為 rt-thread>bsp>stm32f407-robomaster-c

IMU姿態(tài)解算

使用 BMI088 robomaster-c 開發(fā)板上集成的6軸 imu 進(jìn)行姿態(tài)解算,使用的方案其實(shí)是RM中比較普遍成熟的一套,主要使用了四元數(shù)和卡爾曼濾波進(jìn)行融合解算,解算頻率為 1Khz。

dt = dwt_get_delta(&ins_dwt);
    imu_ops.gyro_read(ins.gyro);
    imu_ops.accel_read(ins.accel);
    // 核心函數(shù),EKF更新四元數(shù)
    IMU_QuaternionEKF_Update(ins.gyro[X], ins.gyro[Y], ins.gyro[Z], ins.accel[X], ins.accel[Y], ins.accel[Z], dt);
    memcpy(ins.q, QEKF_INS.q, sizeof(QEKF_INS.q));
    // 機(jī)體系基向量轉(zhuǎn)換到導(dǎo)航坐標(biāo)系,本例選取慣性系為導(dǎo)航系
    BodyFrameToEarthFrame(xb, ins.xn, ins.q);
    BodyFrameToEarthFrame(yb, ins.yn, ins.q);
    BodyFrameToEarthFrame(zb, ins.zn, ins.q);
    // 將重力從導(dǎo)航坐標(biāo)系n轉(zhuǎn)換到機(jī)體系b,隨后根據(jù)加速度計(jì)數(shù)據(jù)計(jì)算運(yùn)動加速度
    float gravity_b[3];
    EarthFrameToBodyFrame(gravity, gravity_b, ins.q);
    for (uint8_t i = 0; i < 3; ++i) // 同樣過一個低通濾波
    {
        ins.motion_accel_b[i] = (ins.accel[i] - gravity_b[i]) * dt / (ins.accel_lpf + dt) + ins.motion_accel_b[i] * ins.accel_lpf / (ins.accel_lpf + dt);
    }
    BodyFrameToEarthFrame(ins.motion_accel_b, ins.motion_accel_b, ins.q); // 轉(zhuǎn)換回導(dǎo)航系n
    ins.yaw = QEKF_INS.Yaw;
    ins.pitch = QEKF_INS.Pitch;
    ins.roll = QEKF_INS.Roll;
    ins.yaw_total_angle = QEKF_INS.YawTotalAngle;

恒溫控制

C型開發(fā)板上的 BMI088 周圍是又一圈加熱電阻的,可以通過 PWM 控制加熱功率,從而實(shí)現(xiàn)恒溫控制,有助于抑制陀螺儀漂移,根據(jù)手冊提示恒溫控制在40攝氏度較好,

static pid_obj_t *imu_temp_pid;
static pid_config_t imu_temp_config = {
.Kp = 50000,
.Ki = 8000,
.Kd = 0,
.IntegralLimit = 50000,
.Improve = PID_Integral_Limit,
.MaxOut = 250000,
};
static rt_err_t temp_pwm_init(rt_uint32_t period, rt_uint32_t pulse)
{
temp_pwm_dev = (struct rt_device_pwm )rt_device_find(TEMP_PWM_DEV_NAME);
if (temp_pwm_dev == RT_NULL)
{
LOG_E("Can't find %s device!", TEMP_PWM_DEV_NAME);
return -RT_ERROR;
}
/
設(shè)置PWM周期和脈沖寬度默認(rèn)值 /
rt_pwm_set(temp_pwm_dev, TEMP_PWM_DEV_CHANNEL, period, pulse);
/
使能設(shè)備 */
rt_pwm_enable(temp_pwm_dev, TEMP_PWM_DEV_CHANNEL);
}

在 ins_task 中以 500hz 的頻率進(jìn)行恒溫控制,需要注意,使用加熱電阻外圍電路需要給C板額外供電。

void ins_thread_entry(void argument)
{
static uint32_t count;
temp_pwm_init(period, pulse);
/
注冊 PID 實(shí)例 */
imu_temp_pid = pid_register(&imu_temp_config);
imu_ops.imu_init();
LOG_I("Example Task Start");
for (;;)
{
example_start = dwt_get_time_ms();
imu_ops.gyro_read(gyro);
imu_ops.accel_read(acc);
if(count % 2 == 0){
temp = imu_ops.temp_read();
pulse = pid_calculate(imu_temp_pid, temp, IMU_TARGET_TEMP);
rt_pwm_set_pulse(temp_pwm_dev, TEMP_PWM_DEV_CHANNEL, pulse);
}
count++;
rt_thread_delay(1);
}
}

實(shí)際效果測試如下:

不加恒溫控制,室溫下(23攝氏度左右)十分鐘內(nèi),yaw 軸偏移近20度;
加入恒溫控制后(40攝氏度),十分鐘內(nèi),yaw 軸偏移10度
arm_math庫使用
有一個小插曲就是arm_math庫的移植使用,需要通過修改 Scons 文件,將 arm_math 庫鏈接到工程中,并添加需要的宏定義:

使用 arm_math.h 需要添加相關(guān)內(nèi)核定義

CPPDEFINES = ['ARM_MATH_CM4']
LIBPATH = [cwd + '/arm_math']
LIBS = ['libarm_cortexM4lf_math.a']
path += [cwd + '/arm_math']
group = DefineGroup('RM_Algorithms', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES, LIBS = LIBS, LIBPATH=LIBPATH)

到此就可以使用解算得到的歐拉角等數(shù)據(jù)去對云臺等進(jìn)行閉環(huán)控制啦。

存在問題及優(yōu)化方向

雖然通過陀螺儀校準(zhǔn)和恒溫控制等有效抑制了零漂,但yaw的零飄依然存在;
之后考慮通過融合磁力計(jì)數(shù)據(jù),解決零飄問題;

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • PWM控制器
    +關(guān)注

    關(guān)注

    18

    文章

    461

    瀏覽量

    36023
  • 卡爾曼濾波
    +關(guān)注

    關(guān)注

    3

    文章

    162

    瀏覽量

    24622
  • STM32F407
    +關(guān)注

    關(guān)注

    15

    文章

    187

    瀏覽量

    29330
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39837
  • 姿態(tài)解算
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    8235
收藏 人收藏

    評論

    相關(guān)推薦

    基于RT-ThreadRoboMaster電控框架設(shè)計(jì)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇 RT-Thread 進(jìn)行項(xiàng)目開發(fā)。
    發(fā)表于 09-06 15:21 ?637次閱讀

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實(shí)時操作系統(tǒng),本文是RT-Thread實(shí)時操作系統(tǒng)的編程指南
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread全球技術(shù)大會:RT-Thread上的單元測試框架與運(yùn)行測試用例

    RT-Thread全球技術(shù)大會:RT-Thread上的單元測試框架與運(yùn)行測試用例 ? ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發(fā)表于 05-27 16:21 ?1584次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術(shù)大會:<b class='flag-5'>RT-Thread</b>上的單元測試<b class='flag-5'>框架</b>與運(yùn)行測試用例

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實(shí)現(xiàn)

    RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實(shí)現(xiàn)方式介紹如下:
    的頭像 發(fā)表于 05-28 10:38 ?2132次閱讀
    <b class='flag-5'>RT-Thread</b>設(shè)備模型<b class='flag-5'>框架</b>及創(chuàng)建注冊設(shè)備的實(shí)現(xiàn)

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發(fā)表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發(fā)表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    RT-Thread文檔_utest 測試框架

    RT-Thread文檔_utest 測試框架
    發(fā)表于 02-22 18:43 ?2次下載
    <b class='flag-5'>RT-Thread</b>文檔_utest 測試<b class='flag-5'>框架</b>

    淺析RT-Thread設(shè)備驅(qū)動框架

    RT-Thread 設(shè)備框架屬于組件和服務(wù)層,是基于 RT-Thread 內(nèi)核之上的上層軟件。設(shè)備框架是針對某一類外設(shè),抽象出來的一套統(tǒng)一的操作方法及接入標(biāo)準(zhǔn),可以屏蔽硬件差異,為應(yīng)用
    的頭像 發(fā)表于 08-07 15:39 ?1875次閱讀

    基于 RT-ThreadRoboMaster 電控框架(一)

    。但也正是因?yàn)檫@些優(yōu)點(diǎn)的覆蓋面較廣,很多初學(xué)者會覺得無從下手,但只要步入 RT-Thread 的大門,你就發(fā)現(xiàn)她的美好。這系列文檔將作為本人基于 RT-Thread 開發(fā) RoboMaster
    的頭像 發(fā)表于 09-19 19:55 ?713次閱讀

    基于RT-ThreadRoboMaster電控框架(二)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設(shè)備驅(qū)動框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包
    的頭像 發(fā)表于 09-20 15:16 ?695次閱讀

    基于RT-ThreadRoboMaster電控框架(三)

    使用的開發(fā)板為大疆的 RoboMaster-C 型開發(fā)板,基礎(chǔ)工程為 rt-thread>bsp>stm32f407-robomaster-c
    的頭像 發(fā)表于 09-20 15:21 ?798次閱讀

    RT-Thread框架下的SMP支持

    使其支持 RT-Thread 框架下的 SMP,最近就一直在研究 SMP,并在 Raspberry-Pico 上做了一些實(shí)驗(yàn)。
    的頭像 發(fā)表于 10-11 10:34 ?1025次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>框架</b>下的SMP支持

    基于rt-thread的socket通信設(shè)計(jì)

    最近再研究 rt-thread 的通信 ,想設(shè)計(jì)出 eps8266(多個) rt-thread(作為中控) 服務(wù)器的通信框架,使用的開發(fā)板是 潘多拉
    的頭像 發(fā)表于 10-13 15:02 ?1302次閱讀
    基于<b class='flag-5'>rt-thread</b>的socket通信設(shè)計(jì)

    基于RT-ThreadRoboMaster電控框架(五)

    使用的開發(fā)板為大疆的 RoboMaster-C 型開發(fā)板,基礎(chǔ)工程為 rt-thread>bsp>stm32f407-robomaster-c
    的頭像 發(fā)表于 10-30 17:10 ?1067次閱讀

    基于RT-ThreadRoboMaster電控框架(六)

    使用的開發(fā)板為大疆的 RoboMaster-C 型開發(fā)板,基礎(chǔ)工程為 rt-thread>bsp>stm32f407-robomaster-c
    的頭像 發(fā)表于 10-30 17:41 ?446次閱讀