久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3659|回復: 0
收起左側

基于SLAMWARE的服務型機器人底盤電機里程計說明及代碼示例

[復制鏈接]
ID:156214 發表于 2018-12-19 15:53 | 顯示全部樓層 |閱讀模式
對于需要自主定位導航的服務型機器人而言,電機里程計的精準度影響著整個機器人的定位精度,電機部分的控制是實現機器人底盤中最為主要的部分。為了便于操作,本文將為大家介紹常見機器人底盤的電機及其編碼器并結合Breakout 3.0中STM32的參考代碼,對SLAMWARE系統中用到的里程計進行詳細說明。

電機編碼器類型選擇
常用的機器人底盤電機編碼器按實現原理來分類,包括光電編碼器及霍爾編碼器,按照其編碼方式分類,主要包括增量型和絕對型。對于基于slamware的機器人底盤來說,里程計的分辨率需要在1mm以下,且總誤差最多不能超過5%,如果超過此數值,機器人將無法正常實現定位導航的功能。因此,無論選擇哪種編碼器,必須要達到其精度的要求。可以參考以下判斷公式:
(2π/每轉編碼器脈沖數)×輪子半徑≤0.001米
注:輪子半徑單位為米

系統電機應答流程(僅以兩輪差動電機為例)
1.png
SLAMWARE Core 每間隔delta時間,會向底盤發送左右輪的速度,向前為正,向后為負,即SET_BASE_MOTOR(0x40)。底盤會回復此時的左右輪里程計的累計值,即GET_BASE_MOTOR_DATA(0x31)。請注意,無論輪子向前運動或向后運動,里程計的度數均遞增,因為SLAMWARE Core在下發速度時,已經區分了向前還是向后。
SLAMWARE Core發送SET_BASE_MOTOR的請求報文為, 速度的單位為mm/s。

SET_BASE_MOTOR
typedef struct _base_set_motor_request
{
    _s32 motor_speed_mm[4];
} __attribute__((packed)) base_set_motor_request_t;
對應下面的代碼:
SET_BASE_MOTOR
case SLAMWARECORECB_CMD_SET_BASE_MOTOR:
    {
        base_set_motor_request_t *ans_pkt = (base_set_motor_request_t *) request->payload;
        if (!bumpermonitor_filter_motorcmd(ans_pkt->motor_speed_mm[0], ans_pkt->motor_speed_mm[1])) {
            set_walkingmotor_speed(ans_pkt->motor_speed_mm[0], ans_pkt->motor_speed_mm[1]);
        }
        net_send_ans(channel, NULL, 0);
    }
break;
底盤會通過響應GET_BASE_MOTOR_DATA, 將左右輪的累計里程發給SLAMWARE Core,響應報文為,距離單位為mm。
GET_BASE_MOTOR_DATA
typedef struct _base_motor_status_response
{
    _s32 motor_cumulate_dist_mm_q16[4];

} __attribute__((packed)) base_motor_status_response_t;
對應的代碼:
GET_BASE_MOTOR_DATA
case SLAMWARECORECB_CMD_GET_BASE_MOTOR_DATA:
    {
        base_motor_status_response_t ans_pkt;
        memset(&ans_pkt, 0, sizeof(ans_pkt));         
        ans_pkt.motor_cumulate_dist_mm_q16[0] = (_s32) (cumulate_walkingmotor_ldist_mm());
        ans_pkt.motor_cumulate_dist_mm_q16[1] = (_s32) (cumulate_walkingmotor_rdist_mm());
        net_send_ans(channel, &ans_pkt, sizeof(base_motor_status_response_t));
    }
    break;

里程計部分代碼示例:
每米編碼器脈沖數ODOMETER_EST_PULSE_PER_METER,需要根據每轉編碼器脈沖數以及輪子的直徑來確定,公式如下:
每米編碼器脈沖數=每轉編碼器脈沖數/(π×輪子直徑)
注:輪子直徑單位為米

Odometry
//每米編碼器脈沖數
#define ODOMETER_EST_PULSE_PER_METER  6390UL

//行走電機速度控制頻率:60hz
#define CONF_MOTOR_HEARTBEAT_FREQ     60
#define CONF_MOTOR_HEARTBEAT_DURATION (1000/(CONF_MOTOR_HEARTBEAT_FREQ))

/*
* 刷新行走電機的里程數據函數
*/
static void _refresh_walkingmotor_odometer(_u32 durationMs)
{
    _u32 irqSave = enter_critical_section();                                    //臨界資源保護
    for (size_t cnt = 0; cnt < WALKINGMOTOR_CNT; ++cnt) {                     
        _lastEncoderTicksDelta[cnt] = _encoderTicksDelta[cnt];                  //獲得delta時間內編碼器的脈沖數
        _motorAccumulatedTicks[cnt] += _encoderTicksDelta[cnt];                 //獲得累計編碼器的脈沖數
        _encoderTicksDelta[cnt] = 0;
    }
    leave_critical_section(irqSave);
    if (durationMs == 0)                                                        //防止除零
        durationMs = 1;
    for (size_t cnt = 0; cnt < WALKINGMOTOR_CNT; ++cnt) {                       //根據delta的編碼器數據計算這段時間內速度,即當前速度
        _lastOdometerSpeedAbs[cnt] = (float) _lastEncoderTicksDelta[cnt] * (1000.0 / ODOMETER_EST_PULSE_PER_METER) * 1000.0 / durationMs;
    }
}
/*
* 計算左行走電機累計里程函數
* 單位:mm
*/
_u32 cumulate_walkingmotor_ldist_mm(void)
{
    return (_motorAccumulatedTicks[WALKINGMOTOR_LEFT_ID] * 1000) / ODOMETER_EST_PULSE_PER_METER;
}
/*
* 計算右行走電機累計里程函數
* 單位:mm
*/
_u32 cumulate_walkingmotor_rdist_mm(void)
{
    return (_motorAccumulatedTicks[WALKINGMOTOR_RIGHT_ID] * 1000) / ODOMETER_EST_PULSE_PER_METER;
}
里程計測試
可以用slamware_console工具中的run以及vrun命令來測試里程計的準確性,其誤差需要在5%以內。



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品在线观看一区 | 人人叉 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 午夜一级做a爰片久久毛片 精品综合 | 日韩美女一区二区三区在线观看 | 日韩在线中文字幕 | 成人在线播放 | 国产免费一区二区三区 | 伊人久久在线 | 中文字幕在线观 | 成年网站在线观看 | 久久成人免费视频 | 精品在线一区二区三区 | 亚洲+变态+欧美+另类+精品 | 国产91网站在线观看 | 国产69精品久久99不卡免费版 | 久久日韩粉嫩一区二区三区 | 香蕉超碰 | 国内自拍视频在线观看 | 午夜看电影在线观看 | 免费网站国产 | 成人妇女免费播放久久久 | 亚洲视频一区二区三区 | 波多野结衣电影一区 | 超碰人人做 | 高清不卡毛片 | 欧美不卡一区二区三区 | 中文字幕在线观看一区 | 欧美一级片在线看 | 欧美性猛交一区二区三区精品 | 久草热播 | 亚洲综合在线播放 | 亚洲最色网站 | 欧美日韩亚洲视频 | 亚洲一区二区精品视频 | 激情视频网站 | 精品国产欧美一区二区 | 青青操91 | 国产在线资源 | 精品欧美乱码久久久久久 | 偷拍自拍在线观看 |