1.通信協議
里程計數據格式(19字節)
2.STM32端
/**
* @brief 發送里程計數據
*/
void DataTrans_Odom(void)
{
uint8_t _cnt = 0;
data_u _temp; // 聲明一個聯合體實例,使用它將待發送數據轉換為字節數組
uint8_t data_to_send[100] = {0}; // 待發送的字節數組
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++)
{
// 將要發送的數據賦值給聯合體的float成員
// 相應的就能更改字節數組成員的值
_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;
// 串口發送
SendData(data_to_send, _cnt);
}
3.ROS端
采用狀態機的方式來接收STM32端上傳的里程計數據,每讀取一字節數據,則在狀態機中處理一次,部分程序如下:
uint8_t buffer = 0;
ser.read(&buffer, 1); // ser是串口類的一個實例,該語句表示從串口中讀取一個字節
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)
{
/* 進行數據校驗 */
uint8_t checkout = 0;
for(int k = 0; k < data_cnt - 1; k++)
{
checkout += data_receive[k];
}
if(checkout == data_receive[data_cnt - 1]) // 串口接收到的最后一個字節是校驗碼
{
/* 校驗通過,進行解碼 */
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; // 轉換為弧度
}
data_cnt = 0;
state = 0;
}
}
else state = 0;
ROS端在運行時可能會提示串口打開失敗,有兩種原因,一是串口號不對,使用dmesg | grep ttyS*列出檢測到的串口號,逐個測試;
二是沒有操作權限,使用sudo chmod 666 /dev/ttyACM0即可解決,也可以使用sudo usermod -aG dialout 用戶名來獲得永久權限,用戶名可使用whoami查看。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
機器人
+關注
關注
211文章
28566瀏覽量
207719 -
數據
+關注
關注
8文章
7104瀏覽量
89297 -
STM32
+關注
關注
2270文章
10915瀏覽量
356778 -
ROS
+關注
關注
1文章
279瀏覽量
17042
發布評論請先 登錄
相關推薦
深度解析|機器人自主移動的秘密(二)
消耗是巨大的,雖然并沒有達到像訓練神經網絡動用服務器集群那種地步,但傳統上需要PC級別的處理器。除配備激光雷達外,還需要機器人具有IMU(慣性測量單元)、里程計來為激光雷達提供輔助數據,否則SLAM系統
發表于 06-30 15:05
關于機器人定位與建圖,這些小技巧你懂嗎
說到機器人自主定位導航解決方案及技術,大家腦海里肯定會浮現“定位”、“建圖”、“避障”、“路徑規劃”等字眼。定位 在思嵐提供的自主定位導航解決方案中,主要是通過雷達和里程計的數據來進行定位。雖然
發表于 03-28 15:48
機器人視覺系統組成及定位算法分析
,這些眼睛亦可稱為VO(視覺里程計:單目or立體),維基百科給出的介紹:在機器人和計算機視覺問題中,視覺里程計就是一個通過分析處理相關圖像序列來確定機器人的位置和姿態。當今,由于數字圖
發表于 06-08 08:30
如何去實現一種送餐機器人產品設計
漂移,環境中移動物體過多時容易出錯UWB定位誤差十幾厘米,信號容易遮擋視覺二維碼 + 輪子里程計對比后最優方案是 視覺二維碼+輪子里程計基于二維碼+輪子里程計方法,主要的傳感器數據來源
發表于 11-11 07:10
設計一個能自由行走并且可以與人語音對話機器人的設計資料分享
機器人大腦處理并輸出反饋和執行動作。本章節涉及到的傳感器有激光雷達、IMU、輪式里程計、麥克風、音響、攝像頭,和用于處理信息的嵌入式主板。關于傳感器的ROS驅動程序開發和在機器人上的使用在后面的章節會展開,...
發表于 12-17 06:58
基于全景視覺與里程計的移動機器人自定位方法
通過分析全景視覺與里程計傳感器的感知模型的不確定性,提出了一種基于路標觀測的 移動機器人 自定位算法. 該算法利用卡爾曼濾波器,融合多種傳感器在不同觀測點獲取的觀測數據完
發表于 06-28 10:58
?41次下載
視覺里程計的詳細介紹和算法過程
在導航系統中,里程計(odometry)是一種利用致動器的移動數據來估算機器人位置隨時間改變量的方法。例如,測量輪子轉動的旋轉編碼器設備。里程計總是會遇到精度問題,例如輪子的打滑就會導
輪式移動機器人里程計分析
但凡涉及到可移動的機器人的導航系統,大概率會涉及到里程計的計算,比如輪式移動機器人、無人機、無人艇,以及多足機器人等,而計算里程計的方案也有
介紹一種基于編碼器合成里程計的方案
摘要:本文主要分析輪式移動機器人的通用里程計模型,并以兩輪差速驅動機器人的里程計計算為案例,給出簡化后的兩輪差速驅動機器人
ROS機器人導航調參手冊
在 ROS 中,我們可以輸出帶有時間戳的里程計數據,然后看機器人達到恒定的最大平移速度(ti)需要多長時間,然后使用來自里程計數據(nav_msgs/Odometry message)來計算這個過程的加速度。多做幾次實驗求平均值
機器人里程計數據可視化
STM32端返回的x軸線速度、y軸線速度是相對于自身的機體坐標系的速度,而機器人的位置信息是相對于世界坐標系的位置,所以在對速度進行積分前, 要先將機體坐標系下的x軸線速度、y軸線速度轉換到世界坐標
評論