ROS学习笔记之七:ROSSerial初试

2023-05-16

总体来说,ROS更偏重软件,其涉及的控制、算法都是偏策略或复杂的,但机器人是要和现实世界打交道的,必须有相应的执行机构,使ROS所能做的那些“高、大、上”的工作落地。真正能够和执行硬件打交道、操控起来得心应手的还是MCU,所以如何将MCU控制的硬件和ROS系统相连,可以基于ROS的信息交互机制实现控制和反馈,是学习ROS、基于ROS完成一些任务必须首先化解的问题。

很早我就做了一个4轮全向小车平台,可以将笔记本放置在上面,作为上位机,设计了一个STM32的控制板,驱动4个舵机和4个轮式驱动单元(带反馈的直流电机),通过串口即可控制小车运转:


 

当时就想在笔记本上运行ROS,控制小车运动,相当于那个经典的ROS底盘。可一直没有沉下心来实现ROSSerial,惭愧!希望这次可以借此顺势完成^_^

先从简单的做起吧!

上一篇做了一个STM32的Arduino控制板,并且成功替换了原来的Arduino Nano控制板,将原来的程序移植到STM32平台上,实现了原有的功能。编译后发现资源还富裕很多,在上面应该可以做很多文章,比如PID转速控制;原来那个基于Mega328的Nano有点勉强,不光是资源问题,对AVR的底层也太不熟悉,完全基于Arduino库有点困难。

不过这个先放一下,重点是打通和ROS的通讯,将ROSSerial功能用起来。

ROS的官方教学示例都是以虚拟的小海龟为控制对象,消息、服务均是以控制小海龟作为示例。但小海龟毕竟是虚拟的,而Robot对于很多人而言,是现实存在的。

所以,第一步打算用前文所述的那个小车作为实体的小海龟,尝试一下,可否通过ROS消息控制这个现实世界的小海龟。

作为测试,将geometry_msgs/Twist 中的 linear X 作为 PWM,angular Z 作为舵机转角,每次收到消息走 3 秒。

以上一篇的程序为基础,修改了以下几个部分:

…….

#include<ros.h>      // 190519

#include<geometry_msgs/Twist.h>   // 190519

…….

//-----------190519 ---------------

boolean                           g_bReceived_Msgs;

int                                    gc_iRunTimeCnt;

ros::NodeHandle  nh;

//------------- 190519 ----------------

voidoneWheel_cb( const geometry_msgs::Twist& cmd_msg)

{

  int temp;

  if(cmd_msg.linear.x == 0.0)

  {

       g_ucPara1= BRAKE;

       g_ucPara2= 0;

  }

  else

  {

          if(cmd_msg.linear.x > 0.0)

          {

               g_ucPara1 = FORWARD;

               g_ucPara2 =byte(cmd_msg.linear.x);

          }

          else

          {

               g_ucPara1 = BACKWARD;

               g_ucPara2 = byte(0 -cmd_msg.linear.x);

          }

         }

  temp = int(cmd_msg.angular.z);

         if(temp <0)

         {

          temp = 0;

         }

         if(temp >180)

         {

                   temp = 180;

         }       

         g_ucServoVal = byte(temp);

         g_bReceived_Msgs = true;

         gc_iRunTimeCnt = 3000;

         digitalWrite(LED_BUILTIN, HIGH);  // led 

}

 

ros::Subscriber<geometry_msgs::Twist>sub("turtle_cmd_Vel", oneWheel_cb);

…….

voidsetup()

{

 ………..

  nh.initNode();

  nh.subscribe(sub);

}

voidloop()

{

  ……

      nh.spinOnce();       // 190519

    if(g_bReceived_Msgs)

    {

             g_bReceived_Msgs= false;

             driveMotor(g_ucPara1,g_ucPara2);

             myServo.writeMicroseconds(correctServo(g_ucServoVal));

    }

    if(gc_iRunTimeCnt!=0)

    {

             gc_iRunTimeCnt--;

             if(gc_iRunTimeCnt==0)

             {

                       driveMotor(BRAKE,0);

                       digitalWrite(LED_BUILTIN,LOW);

             }

    }

  }

}

增加了上述语句后,编译通过(在ubuntu环境下,因为只在那里面安装了ROS):


 

可以看出对于STM32F103C8而言,64K FLASH 只占用了25k(38%),20K RAM只占用了2.7k(13%),在此基础上,可以有很大的发挥空间。

用USB转TTL电平串口模块连接STM32duino控制板:


 

使用消息发布测试:


 

现实世界中的小海龟动起来了!

感觉不错。不过尝试用无线适配器代替USB转TTL电平串口,失败了:(

好像 ROSSerial 协议在通讯过程中不断在用时间同步,经过两个无线模块转发后,可能通讯帧不连贯了,导致通讯只能偶尔成功,多数情况下失败。

看来如果要让这个小海龟无拘无束的跑起来,只能用TK-1之类的小主板放置在小车上了,或者使用树莓派3B+ 放置在小车上,作为中继,通过Wifi实现远程。

这一步的目标算是实现了,证明 ROSSerial可用,而且还比较方便,ROS.lib封装的不错。

下一步要尝试:如果程序框架基于 FreeRTOS编写,是否还可以可靠的使用ROS.lib?通过ROSSerial和ROS主机通讯。

因为我以往的小车控制程序都是基于 uCOS编写的,要移植到Arduino环境下,如果放弃RTOS框架,改写的内容太多,关键是需要自己写调度部分,有些麻烦。感觉移植到FreeRTOS上会方便些,STM32Duino有现成的 FreeRTOS库。

 

注:程序附在 QQ 群 32438885 的共享文件夹中,供参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS学习笔记之七:ROSSerial初试 的相关文章

  • 从零开始实现一个简单的CycleGAN项目

    项目地址 xff1a https github com jzsherlock4869 cyclegan pytorch pytorch 中CycleGAN xff08 循环一致生成对抗网络 xff09 的简单且易于修改的实现 CycleGA
  • 【计算机视觉】一个简单易上手的图像分类任务pipeline代码

    整理了一个针对图像分类任务的pipeline xff0c 主要用于快速开始验证现有模型结果 xff0c 以及后续的自定义模型的开发 https github com jzsherlock4869 image classification p
  • MySQL存储数据加密

    加密方式主流的有两种 ENCODE 与 DECODE 建一张测试表 create table users username varchar 128 用户昵称 password blob 密码 engine 61 innodb default
  • 线程池BUG复现和解决

    逻辑很简单 xff0c 线程池执行了一个带结果的异步任务 但是最近有偶发的报错 xff1a java util concurrent RejectedExecutionException Task java util concurrent
  • 移动端开发——APP端上H5容器化建设

    1 背景 当前移动端和前端的结合愈加紧密 xff0c 尤其是在偏重活动运营的电商App中 xff0c 受制于App版本审核 xff0c 具备研发成本低 可灵活发布等特点的H5页面受到青睐 xff0c 使其在APP端上承接了越来越多的业务 然
  • C++时间与字符串转换

    1 常用的时间存储方式 1 xff09 time t类型 xff0c 这本质上是一个长整数 xff0c 表示从1970 01 01 00 00 00到目前计时时间的秒数 xff0c 如果需要更精确一点的 xff0c 可以使用timeval精
  • 解决linux环境下nohup: redirecting stderr to stdout问题

    在生产环境下启动Weblogic时 xff0c 发现原来好好的nohup信息输出到指定文件中的功能 xff0c 突然出问题了 现象是控制台输出的信息一部分输出到了我指定的文件 xff0c 另一部分却输出到了nohup out xff0c 而
  • [转]Redis作为消息队列与RabbitMQ的性能对比

    周末测试了一下RabbitMQ的性能 xff0c RabbitMQ是使用Erlang编写的一个开源的消息队列 xff0c 本身支持很多的协议 xff1a AMQP xff0c XMPP SMTP STOMP xff0c 也正是如此 xff0
  • Python3.7 实现TCP通信

    TCP 连接程序分为服务端和客户端两部分 服务端步骤如下 xff1a 1 创建套接字Socket 什么是套接字 应用层通过传输层进行数据通信时 xff0c TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题 为了区别不同的应用程序
  • CentOS、Ubuntu、Debian三个linux比较异同

    Linux有非常多的发行版本 xff0c 从性质上划分 xff0c 大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本 商业版本以Redhat为代表 xff0c 开源社区版本则以debian为代表 这些版本各有不同的特点 xff
  • LDAP 中 CN, OU, DC 的含义

    1 LDAP的存储规则 区分名 xff08 DN xff0c Distinguished Name xff09 和自然界中的树不同 xff0c 文件系统 LDAP 电话号码簿目录的每一片枝叶都至少有一个独一无二的属性 xff0c 这一属性可
  • bat修改hosts文件

    attrib R C WINDOWS system32 drivers etc hosts 64 echo 64 echo 127 0 0 1 aaaa bbb com gt gt C WINDOWS system32 drivers et
  • 使用org.apache.tools.zip实现zip压缩和解压

    import java io import org apache tools zip import java util Enumeration 功能 zip压缩 解压 支持中文文件名 说明 本程序通过使用Apache Ant里提供的zip工
  • freeModbus代码解读及移植笔记

    freeModbus的代码库还是很好用的 xff0c 本人在wince和C8051F410下均移植成功 xff08 只用到RTU模式 xff09 但freeModbus提供的文档比较少 xff0c 只能对照着Modbus协议一点点试着读懂源
  • MySQL变量:local_infile

    local infile服务器变量指示能否使用load data local infile命令 该变量默认为ON 该变量为OFF时 xff0c 禁用客户端的load data local infile命令 Sql代码 mysql gt sh
  • strcpy函数实现

    C语言标准库函数strcpy的一种典型的工业级的最简实现 返回值 xff1a 返回目标串的地址 对于出现异常的情况ANSI C99标准并未定义 xff0c 故由实现者决定返回值 xff0c 通常为NULL 参数 xff1a strDesti
  • C++库介绍

    1 C 43 43 标准库 xff08 STL xff09 STL六大组件 容器 算法 迭代器 仿函数 适配器 配接器 空间配置器 1 容器 各种数据结构 xff0c 如vector list deque set map等 xff0c 用来
  • 【C++】extern “C“ 用法详解

    前言 前面简单了解了C 43 43 中的extern 34 C 34 之后 xff0c 可能很多小伙伴对这个陌生的词非常困惑 xff0c 不能理解他的使用场景 所以本章内容就来详细了解extern 34 C 34 的用法 xff0c 这里使
  • FreeRTOS学习第三篇——FreeRTOS任务创建(下)

    声明 xff1a 本文为博主的学习篇章 xff0c 欢迎大家指错 xff0c 共同学习 在解决一下上篇遗留下来的问题之前 xff0c 还得提前做些功课 xff0c 了解一些FreeRTOS的全局变量 PRIVILEGED DATA stat
  • printf用法之打印二进制,八进制,十进制,十六进制

    printf用法之打印2进制 xff0c 八进制 xff0c 十进制 xff0c 十六进制 printf是格式化输出函数 xff0c 它可以直接打印十进制 xff0c 八进制 xff0c 十六进制 xff0c 输出控制符分别为 d o x

随机推荐