两年前入门ROS用了RIKI的底盘套件,后来19年自己搭建底盘做比赛和项目,因为懒用来HAL,然后参考了ImapBox一些其他大佬的移植使用,后来发现不稳定,效果一般。自己写了简单的接收发送协议。后来今年五月在QQ群有大佬用了HAL写的底盘,然后好奇问了一下是不是基于ROSERIAL写的。发现不是,但是宅在家比较无聊自己去官网解读了协议写了一份,测试效果蛮好。 cubemx生成代码配置就不讲了,用这个应该都懂了吧。 平台TX2+ubuntu 18.04LTS+ROS Melodic STM32F103RCT6 1.修改STM32Hardware.h 以下是STM32Hardware.h的内容。 #include “stdint.h” #define ROS_SERIAL huart1 extern UART_HandleTypeDef huart1; class STM32Hardware { } STM32Hardware(STM32Hardware& h){ } uint32_t available(void) void write(uint8_t* data, int length){ 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
#include “RingBuffer.h”
#include “stm32f1xx_hal.h”
#include “stm32f1xx_hal_uart.h”
extern __IO uint32_t uwTick;
extern RingBuffer rx_buffer;
public:
STM32Hardware()
{
{
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;
}
};
for(int i=0; i<length; i++){
write_date(data[i]);
}
}
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算