1.通信協(xié)議
里程計(jì)數(shù)據(jù)格式(19字節(jié))

2.STM32端
/**
* @brief 發(fā)送里程計(jì)數(shù)據(jù)
*/
void DataTrans_Odom(void)
{
uint8_t _cnt = 0;
data_u _temp; // 聲明一個(gè)聯(lián)合體實(shí)例,使用它將待發(fā)送數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組
uint8_t data_to_send[100] = {0}; // 待發(fā)送的字節(jié)數(shù)組
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0x55;
uint8_t _start = _cnt;
float datas[] = {kinematics.odom.vel.linear_x,
kinematics.odom.vel.linear_y,
kinematics.odom.vel.angular_z,
kinematics.odom.pose.theta
};
for(int i = 0; i < sizeof(datas) / sizeof(float); i++)
{
// 將要發(fā)送的數(shù)據(jù)賦值給聯(lián)合體的float成員
// 相應(yīng)的就能更改字節(jié)數(shù)組成員的值
_temp.data = datas[i];
data_to_send[_cnt++]=_temp.data8[0];
data_to_send[_cnt++]=_temp.data8[1];
data_to_send[_cnt++]=_temp.data8[2];
data_to_send[_cnt++]=_temp.data8[3]; // 最高位
}
uint8_t checkout = 0;
for(int i = _start; i < _cnt; i++)
{
checkout += data_to_send[i];
}
data_to_send[_cnt++] = checkout;
// 串口發(fā)送
SendData(data_to_send, _cnt);
}
3.ROS端
采用狀態(tài)機(jī)的方式來(lái)接收STM32端上傳的里程計(jì)數(shù)據(jù),每讀取一字節(jié)數(shù)據(jù),則在狀態(tài)機(jī)中處理一次,部分程序如下:
uint8_t buffer = 0;
ser.read(&buffer, 1); // ser是串口類的一個(gè)實(shí)例,該語(yǔ)句表示從串口中讀取一個(gè)字節(jié)
if(state == 0 && buffer == 0xAA)
{
state++;
}
else if(state == 1 && buffer == 0x55)
{
state++;
}
else if(state == 2)
{
data_receive[data_cnt++]=buffer;
if(data_cnt == 17)
{
/* 進(jìn)行數(shù)據(jù)校驗(yàn) */
uint8_t checkout = 0;
for(int k = 0; k < data_cnt - 1; k++)
{
checkout += data_receive[k];
}
if(checkout == data_receive[data_cnt - 1]) // 串口接收到的最后一個(gè)字節(jié)是校驗(yàn)碼
{
/* 校驗(yàn)通過(guò),進(jìn)行解碼 */
float vx, vy, vth, th; // x軸線速度,y軸線速度,z軸角速度,偏航角
float* datas_ptr[] = {&vx, &vy, &vth, &th};
data_u temp;
for(int i = 0; i < sizeof(datas_ptr) / sizeof(float*); i++)
{
temp.data8[0] = data_receive[4 * i + 0];
temp.data8[1] = data_receive[4 * i + 1];
temp.data8[2] = data_receive[4 * i + 2];
temp.data8[3] = data_receive[4 * i + 3];
*(datas_ptr[i]) = temp.data;
}
th *= D2R; // 轉(zhuǎn)換為弧度
}
data_cnt = 0;
state = 0;
}
}
else state = 0;
ROS端在運(yùn)行時(shí)可能會(huì)提示串口打開(kāi)失敗,有兩種原因,一是串口號(hào)不對(duì),使用dmesg | grep ttyS*列出檢測(cè)到的串口號(hào),逐個(gè)測(cè)試;
二是沒(méi)有操作權(quán)限,使用sudo chmod 666 /dev/ttyACM0即可解決,也可以使用sudo usermod -aG dialout 用戶名來(lái)獲得永久權(quán)限,用戶名可使用whoami查看。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
31097瀏覽量
222374 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7335瀏覽量
94808 -
STM32
+關(guān)注
關(guān)注
2310文章
11162瀏覽量
373546 -
ROS
+關(guān)注
關(guān)注
1文章
293瀏覽量
18748
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
出租車(chē)行駛里程計(jì)數(shù)
proteus仿真單片機(jī)實(shí)驗(yàn)實(shí)訓(xùn)仿真文件 出租車(chē)行駛里程計(jì)數(shù)
發(fā)表于 10-22 10:59
深度解析|機(jī)器人自主移動(dòng)的秘密(二)
消耗是巨大的,雖然并沒(méi)有達(dá)到像訓(xùn)練神經(jīng)網(wǎng)絡(luò)動(dòng)用服務(wù)器集群那種地步,但傳統(tǒng)上需要PC級(jí)別的處理器。除配備激光雷達(dá)外,還需要機(jī)器人具有IMU(慣性測(cè)量單元)、里程計(jì)來(lái)為激光雷達(dá)提供輔助數(shù)據(jù),否則SLAM系統(tǒng)
發(fā)表于 06-30 15:05
關(guān)于機(jī)器人定位與建圖,這些小技巧你懂嗎
說(shuō)到機(jī)器人自主定位導(dǎo)航解決方案及技術(shù),大家腦海里肯定會(huì)浮現(xiàn)“定位”、“建圖”、“避障”、“路徑規(guī)劃”等字眼。定位 在思嵐提供的自主定位導(dǎo)航解決方案中,主要是通過(guò)雷達(dá)和里程計(jì)的數(shù)據(jù)來(lái)進(jìn)行定位。雖然
發(fā)表于 03-28 15:48
機(jī)器人視覺(jué)系統(tǒng)組成及定位算法分析
,這些眼睛亦可稱為VO(視覺(jué)里程計(jì):?jiǎn)文縪r立體),維基百科給出的介紹:在機(jī)器人和計(jì)算機(jī)視覺(jué)問(wèn)題中,視覺(jué)里程計(jì)就是一個(gè)通過(guò)分析處理相關(guān)圖像序列來(lái)確定機(jī)器人的位置和姿態(tài)。當(dāng)今,由于數(shù)字圖
發(fā)表于 06-08 08:30
服務(wù)型智能掃地機(jī)器人的主要功能有哪些呢
,實(shí)現(xiàn)掃地機(jī)器人運(yùn)動(dòng)中的自我保護(hù)。(2) 姿態(tài)感知:包括運(yùn)動(dòng)里程計(jì)數(shù)和航向測(cè)量等功能,需要獲取掃地機(jī)器人的運(yùn)動(dòng)速
發(fā)表于 11-08 09:26
如何去實(shí)現(xiàn)一種送餐機(jī)器人產(chǎn)品設(shè)計(jì)
漂移,環(huán)境中移動(dòng)物體過(guò)多時(shí)容易出錯(cuò)UWB定位誤差十幾厘米,信號(hào)容易遮擋視覺(jué)二維碼 + 輪子里程計(jì)對(duì)比后最優(yōu)方案是 視覺(jué)二維碼+輪子里程計(jì)基于二維碼+輪子里程計(jì)方法,主要的傳感器數(shù)據(jù)來(lái)源
發(fā)表于 11-11 07:10
設(shè)計(jì)一個(gè)能自由行走并且可以與人語(yǔ)音對(duì)話機(jī)器人的設(shè)計(jì)資料分享
機(jī)器人大腦處理并輸出反饋和執(zhí)行動(dòng)作。本章節(jié)涉及到的傳感器有激光雷達(dá)、IMU、輪式里程計(jì)、麥克風(fēng)、音響、攝像頭,和用于處理信息的嵌入式主板。關(guān)于傳感器的ROS驅(qū)動(dòng)程序開(kāi)發(fā)和在機(jī)器人上的使用在后面的章節(jié)會(huì)展開(kāi),...
發(fā)表于 12-17 06:58
基于全景視覺(jué)與里程計(jì)的移動(dòng)機(jī)器人自定位方法
通過(guò)分析全景視覺(jué)與里程計(jì)傳感器的感知模型的不確定性,提出了一種基于路標(biāo)觀測(cè)的 移動(dòng)機(jī)器人 自定位算法. 該算法利用卡爾曼濾波器,融合多種傳感器在不同觀測(cè)點(diǎn)獲取的觀測(cè)數(shù)據(jù)完
發(fā)表于 06-28 10:58
?41次下載
視覺(jué)里程計(jì)的詳細(xì)介紹和算法過(guò)程
在導(dǎo)航系統(tǒng)中,里程計(jì)(odometry)是一種利用致動(dòng)器的移動(dòng)數(shù)據(jù)來(lái)估算機(jī)器人位置隨時(shí)間改變量的方法。例如,測(cè)量輪子轉(zhuǎn)動(dòng)的旋轉(zhuǎn)編碼器設(shè)備。里程計(jì)總是會(huì)遇到精度問(wèn)題,例如輪子的打滑就會(huì)導(dǎo)
輪式移動(dòng)機(jī)器人里程計(jì)分析
但凡涉及到可移動(dòng)的機(jī)器人的導(dǎo)航系統(tǒng),大概率會(huì)涉及到里程計(jì)的計(jì)算,比如輪式移動(dòng)機(jī)器人、無(wú)人機(jī)、無(wú)人艇,以及多足機(jī)器人等,而計(jì)算里程計(jì)的方案也有
介紹一種基于編碼器合成里程計(jì)的方案
摘要:本文主要分析輪式移動(dòng)機(jī)器人的通用里程計(jì)模型,并以兩輪差速驅(qū)動(dòng)機(jī)器人的里程計(jì)計(jì)算為案例,給出簡(jiǎn)化后的兩輪差速驅(qū)動(dòng)機(jī)器人
ROS機(jī)器人導(dǎo)航調(diào)參手冊(cè)
在 ROS 中,我們可以輸出帶有時(shí)間戳的里程計(jì)數(shù)據(jù),然后看機(jī)器人達(dá)到恒定的最大平移速度(ti)需要多長(zhǎng)時(shí)間,然后使用來(lái)自里程計(jì)數(shù)據(jù)(nav_msgs/Odometry message)來(lái)計(jì)算這個(gè)過(guò)程的加速度。多做幾次實(shí)驗(yàn)求平均值
ROS與移動(dòng)底盤(pán)的通信試驗(yàn)內(nèi)容
ROS與STM32的通信流程如圖所示 主要包含兩個(gè)方面: 小車(chē)里程計(jì)數(shù)據(jù)的上傳與接收 控制指令的下發(fā)與接收 1.原始消息內(nèi)容 在ROS中,里程計(jì)數(shù)據(jù)
機(jī)器人里程計(jì)數(shù)據(jù)可視化
STM32端返回的x軸線速度、y軸線速度是相對(duì)于自身的機(jī)體坐標(biāo)系的速度,而機(jī)器人的位置信息是相對(duì)于世界坐標(biāo)系的位置,所以在對(duì)速度進(jìn)行積分前, 要先將機(jī)體坐標(biāo)系下的x軸線速度、y軸線速度轉(zhuǎn)換到世界坐標(biāo)
機(jī)器人里程計(jì)數(shù)據(jù)的上傳與接收
評(píng)論