主要包含兩個方面:
- 小車里程計數(shù)據(jù)的上傳與接收
- 控制指令的下發(fā)與接收
1.原始消息內(nèi)容
在ROS中,里程計數(shù)據(jù)主要包括機器人的位姿(位置和姿態(tài)),以及機器人的速度(線速度和角速度)。對于本實驗所用到的麥輪地面機器人,只需要知道機器人的x軸與y軸線速度、x軸與y軸位置、z軸角速度、偏航角即可。
由于對速度積分可以得到位置,對角速度積分可以得到角度,所以STM32端上傳的里程計數(shù)據(jù)只需要包括機器人的 x軸與y軸線速度、z軸角速度 ,ROS端在接收到這些數(shù)據(jù)后,進行積分即可得到位置和角度。
另外,在本實驗用到的STM32端集成了一個ICM20602姿態(tài)傳感器,其中內(nèi)置了姿態(tài)解算算法,可以獲得準確的機器人姿態(tài)數(shù)據(jù),因此本實驗使用STM32端上傳的偏航角來代替對角速度積分得到的航向角。
所以STM32上傳的里程計數(shù)據(jù)包括機器人的x軸線速度、y軸線速度、z軸角速度、偏航角。
與里程計數(shù)據(jù)類似,對于麥輪地面機器人,控制指令只需要包括機器人的x軸速度、y軸速度、z軸角速度即可,機器人坐標系如圖所示:
2.轉(zhuǎn)換為字節(jié)數(shù)組
知道了消息的原始數(shù)據(jù),還需要將它轉(zhuǎn)換成傳輸效率更高的字節(jié)數(shù)組,如圖:
在C/C++中,有很多種將原始數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法,其中一種常用的方法是使用聯(lián)合體(union)。
聯(lián)合體的所有成員占用同一段內(nèi)存,修改一個成員會影響其余成員,如果要實現(xiàn)一個float數(shù)據(jù)與字節(jié)數(shù)組的互相轉(zhuǎn)換,我們可以定義如下的聯(lián)合體:
typedef union{
float data;
uint8_t data8[4];
}data_u;
這個聯(lián)合體中有兩個成員,一個是32位的float數(shù)據(jù)data,另一個同樣是占據(jù)了32位字長的字節(jié)數(shù)組data8,根據(jù)聯(lián)合體的性質(zhì),這兩個成員所在的內(nèi)存位置是一樣的,也就是說,改變其中任何一個成員的值,另一個也會被改變。
利用這個性質(zhì),我們就可以實現(xiàn)float與字節(jié)數(shù)據(jù)的互相轉(zhuǎn)換。
3.添加幀頭和校驗碼
本實驗選擇常用的0xAA 0x55作為幀頭,同時對原始數(shù)據(jù)轉(zhuǎn)換得到的字節(jié)數(shù)組進行求和,將結(jié)果保存在1字節(jié)數(shù)據(jù)中,作為校驗碼。
準備工作:
1.在ROS端安裝serial功能包
sudo apt-get install ros-melodic-serial
2.在ROS端創(chuàng)建一個功能包,命名為xrobot,添加依賴項roscpp rospy tf serial
-
機器人
+關(guān)注
關(guān)注
210文章
28105瀏覽量
205854 -
通信
+關(guān)注
關(guān)注
18文章
5950瀏覽量
135787 -
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354305 -
ROS
+關(guān)注
關(guān)注
1文章
276瀏覽量
16942
發(fā)布評論請先 登錄
相關(guān)推薦
評論