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