STM32與ROS之間的串口通信

  Routers配置     |      2023-03-29 23:21

馬上要找工作了,因此總結一下之前做的項目里面涉及到的重要的知識點,經常使用到STM32與ROS之間的串口通信,串口通信必然涉及到發送和接收兩個過程,下面詳細講解。

二、STM32向ROS發送數據

STM32向ROS發送數據使用一個date_task的任務按照20hz的頻率執行。發送的數據包括:幀頭幀尾、機器人使能標志位、機器人XYZ三軸速度、IMU三軸加速度、三軸角速度、電池電壓、數據校驗位,如下表所示

發送數據的方式:

將要發送的數據打包到一個數組中,數組的長度是24字節,使用串口逐位發送出去。因為串口一次只能發送一個8位(1個字節)的數據,因此2個字節(short)的數據會拆分成高8位和低8位發送。

發送數據前對數據賦值的函數時usart.c文件中的data_transition函數;發送數據的函數是usartx.c文件中的USART3_SEND()函數。如果您要更改發送的數據內容,直接更改data_transition()函數即可;如果您要更改發送數據的長度,需要更改SENT[]這個數組長度的同時還要修改USART3_SEND()函數中for循環的次數,并且ROS端接收數據長度也要做相應的修改。

在發送數據中,其中幀頭是固定值0X7B,幀尾是固定值0X7D,flag_stop是電機的停止標志位(0是使能、1是失能)。數據校驗位的計算方式是BCC校驗(將全部數據位(包括幀頭)異或),最終得到的結果就是數據校驗位。

注意:機器人XYZ三軸速度、加速度計、角速度計以及電池電壓的原始數據是浮點型的數據(float),因為浮點型的數據使用串口傳輸不方便,所以這下數據在傳輸之前先將浮點數放大1000倍(保留小數點后三位),再將放大后的浮點數強制轉換成short型數據,最后在發送前將short型數據拆分成兩個8位的數據。相應的,上位機端在接收到數據后,需要接收到的數據兩個8位數據合并后轉換為short型,再縮小1000倍來進行單位的轉換。

下面講解一下如何將兩個8位數據合并后轉換位short型,即得到我們的實際速度的數據,我們的控制量單位是mm/s,控制量方向由高8位數據的最高位決定。

示例1:21 B6=0010 0001 1011 011,最高位是0,正數,速度大小是

21 B6=(2*16+1)*256+(B*16+6)=(2*16+1)*256+(11*16+6)=8630(mm/s)

示例2:A1 2F=1010 0001 0010 1111,最高位是1,負數,速度大小是

2^16(FF FF+1)-A1 2F=5E D0+1=(5*16+E)*256+(D*16+0)+1=24272(mm/s)

下圖是我們連接串口3后通過串口助手接收到的數據。

下面對這接收到的24個字節數據轉換一下:

第一個字節:0X7B,幀頭;

第二個字節:0X00,點擊處于非靜止狀態;

第3、4個字節:X軸速度,高8位0X01(16進制)=0000 0001(2進制),低8位0X01(16進制)=0000 0001(2進制),最高位是0,正數(前進),速度大小1*256+1=257(mm/s),該速度是小車對編碼器數據進行計算得到的實際速度

......

第21、22個字節:電池電壓,高8位0X58(16進制)=0101 1000(2進制)、低8位0X38(16進制)=0011 1000(2進制),最高位是0,正數,大小是88*256+56=22584,電壓大小是22584毫伏

第23字節:BBC校驗位(前22字節異或),

第24字節:0X7D,幀尾;

三、STM32接收ROS發送過來的數據

接收數據采用中斷接收的方式,接收的數據包括機器人產品信號、使能控制標志位、機器人三軸目標速度、數據校驗位。

其中機器人產品型號用于給STM32控制器識別目前運行產品,flag_stop是機器人的使能控制位,默認發送使能;機器人三軸目標速度用于控制機器人運動,具體的接受內容如下

總結:在所有控制機器人運動方式中,ROS的控制優先級是最高的,在任意時刻STM32控制器的串口3接收到數據,則強制進入ROS模式。設置前10秒不接收數據是因為消除機器人商店開機過程中發送過來的無用數據。10秒的等待期后開始接收數據,首先要檢測數據幀頭,檢測到數據幀頭后才開始接收數據;在數據接收完成后,再驗證幀尾的數據校驗位是否出錯,數據校驗位正確才使用數據。