zoukankan      html  css  js  c++  java
  • STM32通过rosserial接入ROS通讯开发

    作者:良知犹存

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


    前言

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

  • 相关阅读:
    反转链表 16
    CodeForces 701A Cards
    hdu 1087 Super Jumping! Jumping! Jumping!(动态规划)
    hdu 1241 Oil Deposits(水一发,自我的DFS)
    CodeForces 703B(容斥定理)
    poj 1067 取石子游戏(威佐夫博奕(Wythoff Game))
    ACM 马拦过河卒(动态规划)
    hdu 1005 Number Sequence
    51nod 1170 1770 数数字(数学技巧)
    hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
  • 原文地址:https://www.cnblogs.com/conscience-remain/p/14288723.html
Copyright © 2011-2022 走看看