Stm32 Hal库 CubeMX USB(VCP) RosSerial 与ROS通信

前情提要

工程文件在我的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的配置

  1. RCC
    在这里插入图片描述
  2. SYS
    在这里插入图片描述
  3. USB在这里插入图片描述
  4. USB_DEVICE
    在这里插入图片描述
  5. 时钟树
    在这里插入图片描述

在这里插入图片描述
7.
在这里插入图片描述

工程文件的配置

  1. 复制ROSlib库到工程文件目录下面
    在这里插入图片描述
  2. 添加如下四个文件到工程里,并在keil中导入
    在这里插入图片描述

KEIL的配置

  1. 添加 ,__USE_C99_MATH 到define
,__USE_C99_MATH
  1. 添加, --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);
}
  1. 工程文件在我的GITHUB上 链接
    https://github.com/yltzdhbc/RosSerialVcp

在Linux上测试接收stm32发过来的消息

使用 ttl 转 usb 一般检测到的是ttyUSB0 , 直接使用USB虚拟串口(VCP)一般检测到的是ttyACM0

  1. 查看USB设备
lsusb
dmesg | grep tty
  1. 提高串口权限
sudo chmod 777 /dev/ttyACM0
  1. linux上要先安装rosserial库,如果有就忽略这一步
sudo apt-get install ros-kinetic-serial
  1. 启动roscore
roscore
  1. 启动rosserial 指定端口 /dev/ttyACM0 这里端口可能不一样
rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0 _baud:=115200
  1. 输入 rostopic echo /chatter 查看topic 内容
rostopic echo /chatter
  1. 输入rqt_graph可以查看节点状态图
rqt_graph
  1. 输入rqt打开topic monitor 可以查看消息的内容和频率
rqt
STM32F103C8 Serial(UART) to USB HID Keyboard Mouse 串口 转 USB键盘鼠标 (1) 使用Composite Device 组合(复合)设备 (1.1) 1个Device -> 1个 Configuation -> 2个Interfance (Keyboard & Mouse) (1.2) Keyboard Interfance -> HID (boot mode) -> 2个Endpoint(IN_0x81 & OUT_0x01) -> KeyboardReportDescriptor(不使用Report ID) (1.3) Mouse Interfance -> HID (boot mode) -> 1个Endpoint(IN_0x82) -> MouseReportDescriptor(不使用Report ID) (1.4) 使用HID boot模式, 不使用Report ID, 以便兼容在 计算器设定BIOS模式 中的操作 (2) 串口接收 命令 (2.1) UART协议: 115200, n, 8, 1 (2.2) 1帧发送字符串格式, 以 '{'开始; '}'结束; ','分隔. 共9个10进制数字 例如: {1,2,3,4,5,6,7,8,9} (2.3) 第9位 区分 Keyboard(64) 或是 Mouse(128) 命令 例如: {0,0,0,0,0,0,0,0,64} --- 发送Keyboard命令 {0,0,0,0,0,0,0,0,128} --- 发送Keyboard命令 (3) 发送Keyboard键盘命令时 : 第1~8位 分别如下 (3.1) 第1位 : Key_Release = 0x00, Left_Control = 0x01, Left_Shift = 0x02, Left_Alt = 0x04, Left_GUI = 0x08, Right_Control = 0x10, Right_Shift = 0x20, Right_Alt = 0x40, Right_GUI = 0x80, 例如: {8,0,0,0,0,0,0,0,64} --- 发送 Win_Key键 {128,0,0,0,0,0,0,0,64} --- 发送 WinApp_Key键 {32,0,0,0,0,0,0,0,64} --- 发送 右Shift键 (3.2) 第2位 : 保留,不使用,一律填0 (3.3) 第3~8位 : 可以同时发送6个Keyboard按键 例如: {0,0,4,5,6,7,8,9,64} --- 发送 'abcdef'键 {2,0,4,5,6,7,8,9,64} --- 按住 左Shift 发送 'abcdef'键 => 'ABCDEF' {0,0,0,5,0,7,0,9,64} --- 发送 'bdf'键 (0表示 无按键) 按键码 可参阅: (HID Usage ID) http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf https://www.hiemalis.org/~keiji/PC/scancode-translate.pdf https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2 http://www.usb.org/developers/hidpage/Hut1_12v2.pdf (4) 发送Mouse鼠标命令时 : 第1~8位 分别如下 (4.1) 第1位 : Button_Release = 0x00, Left_Button = 0x01, Right_Button = 0x02, Mid_Button = 0x04, 例如: {1,0,0,0,0,0,0,0,128} --- 点击 左键 {2,0,0,0,0,0,0,0,128} --- 点击 右键 {4,0,0,0,0,0,0,0,128} --- 点击 中键 (4.2) 第2~4位 : 移动(X,Y), 滚轮(Wheel) X: -127~127:左右移动鼠标 Y: -127~127:上下移动鼠标 Wheel: -127~127:上下转动滚轮 例如: {0,20,-10,0,0,0,0,0,128} --- 鼠标 右移20,上移10 {0,0,0,-30,0,0,0,0,128} --- 滚轮-30 (4.2) 第5~8位 : 保留,不使用,一律填0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值