作者:良知犹存

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


前言

主题:串口是一种设备间常用的通讯接口,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 或者 微信私我。我把我使用的代码和编译器一个分享给感兴趣的朋友们。

STM32通过rosserial接入ROS通讯开发的更多相关文章

  1. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  2. SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  3. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

  4. Windows 网络通讯开发

    Windows 网络通讯开发 一.Windows网络开发API 由于C++标准库中没有网络库,所以进行网络开发的时候要调用系统API.Windows通讯开发API包括以下几个基本函数及成员类型: 1. ...

  5. ros机器人开发概述

    1.       ROS项目开发流程? 参照古月大神写的ROS探索总结系列:http://blog.exbot.net/archives/619 具体项目设计可看看<程序员>杂志的最新一篇 ...

  6. XMPP通讯开发-好友获取界面设计

    在XMPP通讯开发-服务器连接 中我们成功连接到服务器上面,然后进入到主界面,接下来就是获取好友列表,这里我们分段开发,首先就是界面的设计,这里仿照QQ好友界面,里面的数据先是用模拟的,下一章获取服务 ...

  7. Protobuf实现Android Socket通讯开发教程

    本节为您介绍Protobuf实现Android Socket通讯开发教程,因此,我们需要先了理一下protobuf 是什么? Protocol buffers是一种编码方法构造的一种有效而可扩展的格式 ...

  8. XMPP通讯开发-服务器好友获取以及监听状态变化

    在 XMPP通讯开发-好友获取界面设计   我们设计了放QQ的列表功能,这里我们获取我们服务器上的 数据. 这一部分知识我们可以查看smack_3_3_0/smack_3_3_0/documentat ...

  9. XMPP通讯开发-仿QQ显示好友列表和用户组

    在 XMPP通讯开发-服务器好友获取以及监听状态变化   中我们获取服务器上的用户好友信息,然后结合XMPP通讯开发-好友获取界面设计    我们将两个合并起来,首先获取用户组,然后把用户组用List ...

随机推荐

  1. 腾讯消息队列CMQ部署与验证

    环境 IP 备注 192.168.1.66 node1 前置机 192.168.1.110 node2 192.168.1.202 node3 架构图 组件介绍 组件 监听端口 access 1200 ...

  2. 大数据专栏 - 基础1 Hadoop安装配置

    Hadoop安装配置 环境 1, JDK8 --> 位置: /opt/jdk8 2, Hadoop2.10: --> 位置: /opt/bigdata/hadoop210 3, CentO ...

  3. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  4. Pycharm同时执行多个脚本文件

    Pycharm同时执行多个脚本文件 设置Pycharm使它可以同时执行多个程序 打开Pycharm 找到Run,点击确认 点击Edit Configurations 右上角Allow parallel ...

  5. 单片机—Arduino UNO-R3—学习笔记002

    led控制 本篇主要介绍Arduino数字引脚及相关函数,通过数字I/O输出控制板载LED灯亮灭状态(数字引脚13). 数字信号是以0.1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号. ...

  6. 超详细 安装VMware Workstation,并安装WIN10操作系统连接外网 步骤指导

    首先下载VMware Workstation15.1版本,我保存在迅雷链接里面,下载速度非常可观. 链接:https://pan.xunlei.com/s/VMRSt6hHMZXEmPZCm6gJcG ...

  7. 小试牛刀ElasticSearch大数据聚合统计

    ElasticSearch相信有不少朋友都了解,即使没有了解过它那相信对ELK也有所认识E即是ElasticSearch.ElasticSearch最开始更多用于检索,作为一搜索的集群产品简单易用绝对 ...

  8. apache状态显示报错AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdo...is message

    今天启动apache查看状态发现报错,说不能确认服务器完全确认域名,以下是报错内容: [root@localhost ~]# service httpd status Redirecting to / ...

  9. compare-algorithms-for-heapqsmallest

    Compare algorithms for heapq.smallest « Python recipes « ActiveState Code http://code.activestate.co ...

  10. 并发编程:Actors 模型和 CSP 模型

    https://mp.weixin.qq.com/s/emB99CtEVXS4p6tRjJ2xww 并发编程:Actors 模型和 CSP 模型 ImportNew 2017-04-27