ROS与STM32通信
ROS功能包与STM32工程文件:
蓝奏云:https://huffie.lanzouw.com/iN7w602ti37a
1 通信协议
STM32和ROS端各有一个数据发送函数和数据接收函数,发送和接受的数据以数据包的形式发送。
数据包的内容:
数据头55aa + 数据字节数size + 数据共用体 + 校验crc8 + 数据尾0d0a
2 原理
2.1 收发数据方法简述
首先,串口收发数据是一个字节一个字节的传输的。一个字节最大表示数据是255,而往往我们需要传递的传感器数据都是int/float类型的。
传统的串口通信方法是将int/float数据分解成一个个字节发送出去。
而这里使用共用体,将数据通过共用体转换为数组发送。
2.2 数据共用体的使用
共用体的规则:
- 共用体是结构体内不同成员共享内存的机制,各成员内存地址一致
- 同一时刻只能访问其中的一个成员
- 不同成员按照成员类型的性质进行内存访问。
共用体的创建:
1 |
|
最后赋给变量的值占用了内存位置,因此同一时间只能用到一个成员。
如何使用共用体
在通信两端都定义同样数据结构的共用体,该共用体包含一个short/int/float类型的变量和一个unsigned char类型的数组,数组大小与变量字节大小对应。这样发送和接收数据时,只发送或接收共用体中unsigned char数组的元素。
3 准备工作
3.1 硬件准备
使用STM32串口+TTL转USB模块(CH340)+Linux设备。
注意事项:
- STM32和ROS的串口波特率必须一致
- STM32串口和USB转TTL模块连接正确,RX-TX,TX-RX
- Linux设备安装好CH340/CH341驱动
- 确保串口在Linux系统上有超级用户权限
- 将ROS功能包中mbot_linux_serial.cpp文件中的串口设备名字改为自己的设备名
3.2 串口设置
查看串口设备
Linux设备插上USB转TTL模块后,打开终端,输入命令:
1 | ls -l /dev/ttyUSB* |
如果终端出现类似下面的输出结果,说明串口设备已经被识别
1 | crw-rw---- 1 root dialout 188, 0 3月 25 17:07 /dev/ttyUSB0 |
设置串口权限
在终端中输入下面命令:(注意自己的串口设备名)
1 | sudo chmod 777 /dev/ttyUSB0 |
如果没有任何输出,说明串口设备设置权限成功。(每次重新启动或重新插入串口设备后都需要进行这样的操作)
4 程序设计
4.1 STM32程序设计
工程文件中提供的是STM32F103的程序,也可以在自己板子的串口收发例程的基础上进行修改,添加mbotLinuxUsart.c和mbotLinuxUsart.h到工程中即可。
函数调用方式如下:
1 |
|
4.2 ROS程序设计
[[01-Ubuntu20.04安装ROS Noetic|ROS安装]]过程不再介绍
第一步
首先[[13_ROS系统基本功能的使用详解(基本指令、节点、服务、启动文件、动态参数)]](如果没创建的话)
1 | mkdir -p ~/catkin_ws/src |
第二步
将topic_example功能包复制到src目录下,然后回到工作空间目录进行编译
1 | cd .. |
5 测试
添加串口设备权限
1 | sudo chmod 777 /dev/ttyUSB0 |
打开新终端,启动`ros master
1 | roscore |
打开新终端,启动测试功能包
1 | rosrun topic_example publish_node |
可以看到从STM32接收到的数据。