两年前入门ROS用了RIKI的底盘套件,后来19年自己搭建底盘做比赛和项目,因为懒用来HAL,然后参考了CSDN一些其他大佬的移植使用,后来发现不稳定,效果一般。自己写了简单的接收发送协议。后来今年五月在QQ群有大佬用了HAL写的底盘,然后好奇问了一下是不是基于ROSERIAL写的。发现不是,但是宅在家比较无聊自己去官网解读了协议写了一份,测试效果蛮好。
cubemx生成代码配置就不讲了,用这个应该都懂了吧。
平台TX2+ubuntu 18.04LTS+ROS Melodic STM32F103RCT6
1.修改STM32Hardware.h
以下是STM32Hardware.h的内容。
#include "stdint.h"
#include "RingBuffer.h"
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_uart.h"
#define ROS_SERIAL huart1
extern UART_HandleTypeDef huart1;
extern __IO uint32_t uwTick;
extern RingBuffer rx_buffer;
class STM32Hardware {
public:
STM32Hardware()
{
}
STM32Hardware(STM32Hardware& h){
}
uint32_t available(void)
{
return (uint32_t)(SERIAL_BUFFER_SIZE + rx_buffer._iHead - rx_buffer._iTail) % SERIAL_BUFFER_SIZE ;
}
uint8_t read_date(void)
{
// if the head isn't ahead of the tail, we don't have any characters
if ( rx_buffer._iHead == rx_buffer._iTail )
return -1 ;
uint8_t uc = rx_buffer._aucBuffer[rx_buffer._iTail] ;
rx_buffer._iTail = (unsigned int)(rx_buffer._iTail + 1) % SERIAL_BUFFER_SIZE ;
return uc ;
}
void flush()
{
rx_buffer._iTail = rx_buffer._iHead;
}
uint32_t write_date(uint8_t ch)
{
HAL_UART_Transmit(&ROS_SERIAL, (uint8_t *)&ch, 1, 100);
while(HAL_UART_GetState(&ROS_SERIAL) == HAL_UART_STATE_BUSY_TX);
return 1;
}
int read(){
if(available()){
return read_date();
}else{
return -1;
}
};
void write(uint8_t* data, int length){
for(int i=0; i<length; i++){
write_date(data[i]);
}
}
unsigned long time(){return uwTick;}
protected:
};
2.复制roslibs文件夹进工程
3.工程添加文件,记得把main.c改成main.cpp
4.中断添加接收函数,我用了串口一
5.编写话题发布订阅 ,烧录代码
6.连接上位机测试
启动ros
roscore
查看设备
lsusb
提高USB权限
sudo chmod 777 /dev/dev/ttyUSB0
运行rosserial节点
rosrun roserial_python serial_node.py _port:=/dev/ttyUSB0 _baund:=115200