前情提要
工程文件在我的GITHUB上 链接
https://github.com/yltzdhbc/RosSerialVcp
最近在做ros,stm32是一个性能强悍的微控制器,适合做底层数据的运算,ROS和stm32通信就是连接这两者的桥梁,花了很多时间去了解这方面的内容,写一篇总结
stm32 rosserial
- rosserial 是ros官方的一个功能包 http://wiki.ros.org/rosserial/
- rosserial相当于让stm32可以直接在ros网络中发布话题,接入ros,节点的写法和在linux下相同,使用起来也是非常方便
USB转TTL
- 在网上,很多资料都是使用stm32 usart 和usb 转 ttl 来连接的 ,这样因为大部分stm32的定时器是16位,65秒左右会溢出,导致时钟与ros同步不上,会出现 error,虽然不影响实际的通信效果 , 但是看着也很烦人
USB VCP 虚拟串口
- 关于stm32虚拟串口的使用可以看我另一篇博文https://blog.csdn.net/yuleitao/article/details/103285137
- stm32带有usb接口,开启虚拟串口之后,ubuntu下可以直接识别
- 测试中发现VCP和rROS的通信比较稳定,使用USB转TTL,使用1HZ发送消息频率一直达不到1HZ,在0.8~0.98之间飘
CUBEMX的配置
- RCC
- SYS
- USB
- USB_DEVICE
- 时钟树
7.
工程文件的配置
- 复制ROSlib库到工程文件目录下面
- 添加如下四个文件到工程里,并在keil中导入
KEIL的配置
- 添加 ,__USE_C99_MATH 到define
,__USE_C99_MATH
- 添加, --diag_suppress=1,47,1300 , 到misc controls
--diag_suppress=1,47,1300
3. 添加rosmain.h,使用cubemx的话,要添加到BEGAIN 和END之间,这样重新生成代码的时候就不会把我们自己添加的代码覆盖掉了
4. 添加如下函数到指定位置
setup();
loop();
5. 下载到stm32
6. 主要的函数在ros_main.cpp里面,这里延续的arduino的写法,setup里面就是初始化节点,发布一个叫做chatter的话题 ,在loop里面循环调用了publish以1HZ的频率在ros中发布“HELLO WORLD”消息
void setup(void)
{
nh.initNode();
nh.advertise(chatter);
}
void loop(void)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
str_msg.data = hello;
chatter.publish(&str_msg);
nh.spinOnce();
HAL_Delay(1000);
}
- 工程文件在我的GITHUB上 链接
https://github.com/yltzdhbc/RosSerialVcp
在Linux上测试接收stm32发过来的消息
使用 ttl 转 usb 一般检测到的是ttyUSB0 , 直接使用USB虚拟串口(VCP)一般检测到的是ttyACM0
- 查看USB设备
lsusb
dmesg | grep tty
- 提高串口权限
sudo chmod 777 /dev/ttyACM0
- linux上要先安装rosserial库,如果有就忽略这一步
sudo apt-get install ros-kinetic-serial
- 启动roscore
roscore
- 启动rosserial 指定端口 /dev/ttyACM0 这里端口可能不一样
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=115200
- 输入 rostopic echo /chatter 查看topic 内容
rostopic echo /chatter
- 输入rqt_graph可以查看节点状态图
rqt_graph
- 输入rqt打开topic monitor 可以查看消息的内容和频率
rqt