写点什么

STM32 通过 rosserial 接入 ROS 通讯开发

用户头像
良知犹存
关注
发布于: 2021 年 01 月 17 日

作者:良知犹存

转载授权以及围观:欢迎添加微信公众号:羽林君


前言

主题:串口是一种设备间常用的通讯接口,rosserial 将串口字符数据转发到标准 ROS 网络,并输出到 rosout 和其日志文件。本文将记录如何在 ROS 上使用其提供的 serial 包进行串口通信。

我的环境介绍:PC:使用的是 Ubuntu 16-04 ROS-Kinetic 嵌入式端:STM32F071

ROS 机器人操作系统是用于创建机器人系统的功能强大的平台,其中包括开发项目所需的一切,从最简单的软件组件(称为“节点”)和数据交换协议到真正的凉亭机器人平台的仿真环境。至于 ROS 这个操作系统的介绍大家可以看我之前的那篇文章《嵌入式为什么要学ROS

总之 ROS 是一个在机器人设备端比较常用的分布式处理框架,但是因为 ROS 的包很多功能也比较复杂,所以一般都是跑在 linux 系统的板卡上,像 stm32 一类的单片机就使用的比较少,但是如果我们想用 ROS 的通讯接口到我们 STM32 中,那我们应该怎么做呢?

使用介绍

这个时候就要提起 rosserial,这个 ROS 提供一种嵌入式节点和运行在主控 PC 上的 ros master 通信的方式,使得在嵌入式节点上编写、运行 ros 节点成为可能,主要用于转接 IO 和各类传感器,运行底层控制算法。要使用 rosserial,显然需要分别在嵌入式板卡和主控 PC 上部署,当前支持的板卡有:arduino stm32 等这些比较热门的嵌入式端。


但是目前关于结合 STM32 微控制器使用 ROS 机器人操作系统的信息,其实网上使用的还是很少,不过网上还是有几个比较好的的 stm32 结合 ROS 使用的代码,其中有一个 stm32rc 和 rtt 的配置,不过 RTT 的配置我使用之后发现有些问题,已经给 RTT 在 github 的仓库提交了问题不过 RT_Thread 官网的文档中心还是做的很好的,对于使用 ROSSERIAL 的包在 STM32 还是介绍的很详细,大家有兴趣可以去看一下

https://www.rt-thread.org/document/site/tutorial/smart-car/ros-connect/ros-connect/

ROSLib 实战的使用

首先 stm32 ROS serial 的使用分为两部分,分别为 PC 端 ROS 环境接收数据, 嵌入式端 STM32 进行发送 ROS 数据。

首先我是使用的其他人分享一个包进行开发的,使用的是 makefile 文件进行编译,编译器选择的是

gcc-arm-none-eabi-4_9-2015q3 程序文件如下所示:


其中 Bsp 包里面主要是 stm32 串口串口配置的文件和时间定时的程序文件:

在这里插入图片描述

这里的配置方法其实就和我们平时的用库函数配置 STM32 串口的方法没什么区别,只不过是配置程序放到了 HardwareSerial 这个类成员函数中。

Dirver 包中是我进行自定义的各种电机控制和 IMU 等的程序包

从程序文件的名称大家应该就可以看出来,这个部分的文件也是做外设等的基本配置,数据的基本发送和接收部分。例如:这里面 wheel 的配置

lib 目录下有两个 lib 库:

其中 rsolib 其实就是使用 ROS 的时候程序中需要的头文件,ros msg 的各种类。

这些类是我们定义 ROS 的 topic 或者 service 节点时候发送的数据类型,以及 ROS serial 的串口配置等头文件都在这个包里面

stm32lib 是 stm32 配置时候的各种库文件,包括 stm32f0xx.h、CMSIS、库文件和启动汇编文件

再下面 src 目录里面就放着我们的 main.cpp

这个部分是比较重要的,main 函数的部分除了初始化,我们也可以定义我们需要的 topic 节点。


  initialise();  ros::NodeHandle nh;  nh.initNode()    while (!nh.connected()) {    // nh.loginfo("ros is not connect\r\n");    nh.spinOnce();  }  sensor_msgs::ChannelFloat32 VelFeedBack;  ros::Publisher velfeedbackpub("VelFb_", &VelFeedBack);  nh.advertise(velfeedbackpub);  nh.spinOnce();    float fbVel[7];  while (1)   {  		if ((millis() - previous_debug_time) >= (1000 / DEBUG_RATE)) //定时发送      {        VelFeedBack.name = "r";        VelFeedBack.values = fbVel;        VelFeedBack.values_length = 7;        velfeedbackpub.publish(&VelFeedBack);      }      nh.spinOnce();  }
复制代码


最后面是部分是 makfile 文件,其中 makefile 文件分了两部分,一个 include 头文件,一个 makefile 文件。

makefile.include 文件中,和正常的 IDE 选项一样,里面包含了芯片选择、编译选择、链接选择、以及相应的程序文件目录设置。

其中芯片我选择了 STM32F072

编译选项我按照默认,也没有修改,其中交叉编译器是用的 arm-none-eabi-gxx

makefile 文件中我设置了我自行定义的程序文件

此外我还下载了 arm-none-eabi-gxx 的包

编译前先用 export 配置一个编译器的选项:其中我下载好的编译器目录在 /home/lyn/M0/gcc-arm-none-eabi-4_9-2015q3

export  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/lyn/M0/gcc-arm-none-eabi-4_9-2015q3/bin
复制代码

使用 make 命令 编译,最后会在当前目录生成一个 main.bin 文件,这个时候我们就可以把 main.bin 文件通过 j-link 或者 st-link 下载软件把程序下载到板子中去。


PC 端连接

PC 端安装 ROS 大家可以参考我之前的ROS安装的文章,一般安装 ROS 都是安装的全功能版本(全功能含有 ROSSERIAL),如果你只是安装了部分的话,那你还需要多进行安装 ROS serial

sudo apt-get install ros-kinetic-rosserial-python


我是使用我们最常见的 USB 转串口工具连接到我的电脑端口。

在这里插入图片描述

我们首先检查串口号 用命令 “ls /dev/ttyUSB*” 一定要在程序中 USB 的参数完全一致。

首先在一个终端开启 roscore

然后使用我们安装好的 rosserial_python 进行启动节点

  rosrun rosserial_python serial_node.py /dev/ttyUSB0 _baud=115200
复制代码

当然第一次启动会进行报错,权限不够,拒绝访问,,此时我们就需要对 USB 的权限进行设置,使得 /dev/ttyUSB0 可以被读写

     sudo chmod 777 /dev/ttyUSB0
复制代码

在启动过程中,我们就可以看到我们设置的 publis 的 VelFb_就初始化了。

此时我们使用 rostopic list 就可以看到相应注册好的通信点,然后再使用 rostopic echo /VelFb_

结语

这就是我使用 STM32 接入 ROS 节点的方法,大家有什么更好的建议可以一起和我交流,如果大家对代码感兴趣,可以在公众号后台回复我 STM32 使用 ROSLIB 或者 微信私我。我把我使用的代码和编译器一个分享给感兴趣的朋友们。


发布于: 2021 年 01 月 17 日阅读数: 906
用户头像

良知犹存

关注

还未添加个人签名 2020.05.29 加入

还未添加个人简介

评论

发布
暂无评论
STM32通过rosserial接入ROS通讯开发