ROS项目总结之基于HAL STM32的ROSSERIAL通讯

两年前入门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文件夹进工程

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

3.工程添加文件,记得把main.c改成main.cpp

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

4.中断添加接收函数,我用了串口一

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

5.编写话题发布订阅 ,烧录代码

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

6.连接上位机测试

启动ros

roscore

查看设备

lsusb

提高USB权限

sudo chmod 777 /dev/dev/ttyUSB0

运行rosserial节点

rosrun roserial_python serial_node.py _port:=/dev/ttyUSB0 _baund:=115200

ROS项目总结之基于HAL STM32的ROSSERIAL通讯

上一篇:Deepin 设置静态 ip


下一篇:STM32cubeMX+DMA+USART 接收任意长度的数据