作者:良知犹存

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


前言

主题:串口是一种设备间常用的通讯接口,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. MySQL/MariaDB二进制安装

    本文说明MySQL/MariaDB二进制安装的过程 mysql和mariadb的安装方式基本一致,唯一初始化方式有点不一样 1.规划: 数据文件存储位置                /data/my ...

  2. 多图详解Go中的Channel源码

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 chan介绍 package main import & ...

  3. 4.k8s存储之Volume、PV、PVC和StatefulSet

    3.Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的 ...

  4. pip不是内部或外部命令解决方法

    问题 已经配置好Python环境,但是安装依赖时,出现pip不是内部或外部命令. 解决方法 找到pip.exe文件所在的目录,将所在路径配置到环境变量path中. 再次输入pip

  5. MySQL的索引优化分析(二)

    一.索引优化 1,单表索引优化 建表 CREATE TABLE IF NOT EXISTS article( id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO ...

  6. 【win10】win10下两个显示器不同桌面壁纸

    win10系统下,双屏显示为不同的桌面壁纸 操作: 1.鼠标右键点击个性化 2.点击背景选项 3.在图片上右键选择要添加为背景的图片 同理,将另一个屏幕壁纸设为监视器1 最后效果为两个分屏为不同桌面壁 ...

  7. 【EXP】WINDOWS下如何导出

    有些时候需要在windows下通过远程来导出数据 那么windows下怎么导出呢 例子: exp hr/hr@192.168.1.222:1521/zhang file=d:backup.dmp lo ...

  8. leetcode 940. 不同的子序列 II (动态规划 ,字符串, hash,好题)

    题目链接 https://leetcode-cn.com/problems/distinct-subsequences-ii/ 题意: 给定一个字符串,判断里面不相同的子串的总个数 思路: 非常巧妙的 ...

  9. oracle dg库因为standby_file_management参数导致应用停止

    DG库的standby_file_management=manual,主库添加文件的时候,备库无法自动创建对应的文件而报错 File #154 added to control file as 'UN ...

  10. LTH7锂电池充放电IC完整方案

    内容目录: A,LTH7贴片5脚充电芯片    PW4054 1, 单节的锂电池保护电路     单节为3.7V锂电池(也叫4.2V)和3.8V锂电池(也叫4.35V) 2, 单节的锂电池充电电路   ...