ROS 学习笔记之三:无线连接 Arduino

ROS与stm32L476RG nucleo 基于mbed开发,使用rosserial_python包通信 使用rosserial_python包.报通信错误,因为原serial_node.py及SerialClient作了修改,删除了fix_pyserial_for_test项.使用ros自带的serial_node.py及SerialClient.py,更改一下py名字以区别,import时报错'module' object is not callable原因为Python导入模块的方法有两种:im... 阅读详情

    在准备过程中,实现了基于 rosserial 和 Arduino 的通讯,确定了单片机系统也可以作为 ROS 的一个 Node ,融入 ROS 机器人系统。
    但按目前我的理解和水平,似乎 ROS 的 Master 必须在 PC 上运行,而且是安装了 ubuntu 相应系统的 PC。
    如果通过串口线(USB线)和 Arduino 板相连才能实现 rosserial ,那局限性太大了。因为作为学习用的小车平台不会做的很大,否则成本太高。这样就无法将笔记本电脑放置在小车上,如果选择性能够跑 ROS 的单板电脑,似乎价格不菲。
    所以,在实现 rosserial 后,第一步想验证的就是:可否将有线连接变为无线?

    利用我自己做的两个USB无线适配器(可以支持USB转无线或者UART转无线,用 STM32F103C8实现,USB虚拟串口是用 STM32 的USB库实现的),一个通过USB连接到电脑上,一个通过UART口连接到 Arduino Nano 板。

 
    因为我是在虚拟机上安装的 ubuntu,STM32 虚拟串口驱动安装在 win10 下 ubuntu 系统就应该能识别,实际上似乎有点问题,我 Linux 不熟悉,目前主要目的不是琢磨 STM32 的USB虚拟串口,所以绕开,用一个 CH340的 USB转TTL串口模块接入PC,这样在 ubuntu 中就认识了。
    依次在 ubuntu 中启动终端,运行 roscore 、rosrun rosserial_python serial_node.py /dev/ttyUSB0 ,发现连接不上,显示同步失败。
https://github.com/ros-drivers/rosserial/blob/melodic-devel/rosserial_arduino/src/rosserial_arduino/SerialClient.py    ;担心是 Arduino 的 USB 串口连接产生的复位信号没有,导致同步失败。用 USB转TTL串口模块直接接到 Arduino 芯片的 TXD、RXD端,结果正常工作,看来不是复位信号问题。

    再次按照前述接线,用两个无线透传模块代替 UART 连线,这次成功了!



    又试了几次,发现可能和复位有一定关系。 
    PC 上的 rosserial 运行必须在 Arduino 模块可靠复位后,否则似乎是由于串口缓冲中有数据,通讯的同步就无法实现。感觉库程序中有点问题,通讯帧的处理不能从连续的数据流中找到有效的同步帧,而是从复位开始检测。
    这个以后在具体实施时再说吧,至少验证了通过无线实现 rosserial 的可能性,这样可以发挥的空间就大多了。

补白:
    查阅了github 上的 roserial_arduino 源代码,是在请求通讯时通过 DTR 信号给 Arduino 板提供复位信号了:
https://github.com/ros-drivers/rosserial/blob/melodic-devel/rosserial_arduino/src/rosserial_arduino/SerialClient.py
……

import time
  
 

import rospy

 

from std_srvs.srv import Empty, EmptyResponse

  
 

from serial import Serial

  
 

from rosserial_python import SerialClient as _SerialClient

  
 

MINIMUM_RESET_TIME = 30

  
 

class SerialClient(_SerialClient):

  
 

def __init__(self, *args, **kwargs):

 

# The number of seconds to wait after a sync failure for a sync success before automatically performing a reset.

 

# If 0, no reset is performed.

 

self.auto_reset_timeout = kwargs.pop('auto_reset_timeout', 0)

 

self.lastsync_reset = rospy.Time.now()

 

rospy.Service('~reset_arduino', Empty, self.resetArduino)

 

super(SerialClient, self).__init__(*args, **kwargs)

  
 

def resetArduino(self, *args, **kwargs):

 

"""

 

Forces the Arduino to perform a reset, as though its reset button was pressed.

 

"""

 

with self.read_lock, self.write_lock:

 

rospy.loginfo('Beginning Arduino reset on port %s. Closing serial port...' % self.port.portstr)

 

self.port.close()

 

with Serial(self.port.portstr) as arduino:

 

arduino.setDTR(False)

 

time.sleep(3)

 

arduino.flushInput()

 

arduino.setDTR(True)

 

time.sleep(5)

 

rospy.loginfo('Reopening serial port...')

 

self.port.open()

 

rospy.loginfo('Arduino reset complete.')

 

self.lastsync_reset = rospy.Time.now()

 

self.requestTopics()

 

return EmptyResponse()

  
 

def sendDiagnostics(self, level, msg_text):

 

super(SerialClient, self).sendDiagnostics(level, msg_text)

 

# Reset when we haven't received any data from the Arduino in over N seconds.

 

if self.auto_reset_timeout and (rospy.Time.now() - self.last_read).secs >= self.auto_reset_timeout:

 

if (rospy.Time.now() - self.lastsync_reset).secs < MINIMUM_RESET_TIME:

 

rospy.loginfo('Sync has failed, but waiting for last reset to complete.')

 

else:

 

rospy.loginfo('Sync has failed for over %s seconds. Initiating automatic reset.' % self.auto_reset_timeout)

 

self.resetArduino()

ROS基础篇(六)-- ROS与Arduino如何通信(rosserial_arduino) 如今,ROS与嵌入式系统实现串口通讯的方式有好几种,目前最常用的就是rosserial,rosserial已支持Arduino、STM32等开源和低成本硬件的通讯。本篇主要介绍通过rosserial实现ROS与Arduino通信。 阅读详情

相关推荐

在ROS中使用Arduino

现在其实我们已经一步一步迈入实用阶段了。使用传感器是创建你自己机器人的第一步。 让我们首先来看一下如何在ROS中使用Arduino。 Arduino环境的搭建 Arduino的搭建相当简单。  1. 从arduino.cc/en/Main/Software下载最新的IDE。在你的系统中解压。 2. 执行以下命令让你的帐号可以打开串口设备 sudo adduser juns di

大头苏的ROS世界 4696

ROS 入门基础(六)Server, 继续用python

Python 真香~ 继续使用Python吧。 那就还是用之前那个learning_service的package吧。 在scripts文件夹里面新增turtle_command_server.py #!/usr/bin/env python import rospy import thread,time from geometry_msgs.msg import Twist from std_srvs.srv import Trigger, TriggerResponse pubC.

lzqweasz的博客 436

在ROS下的Arduino舵机机械臂控制

经过前面对ROS和Arduino的学习与例程编写,又用了一些时间学习了URDF和Moveit,结合之前所学的内容编写了程序以实现ROS系统对Arduino的通信控制。 从SW导出URDF模型 利用Solidworks三维建模 ,导出URDF文件可以参考合工大的这篇文章,值得注意的是如果需要在机械臂末端添加摄像头即eye in hand系统的话,还要再新建一个link使其固定于上一个link中,便于后续摄像头坐标系与机械臂末端坐标系的重合。如下图所示: 此外建立URDF模型所使用的坐标系和基准轴需要改为英

帕里亚的杂货铺 6265

ROS2 - microros从入门到入坟

microros的构建比roserial更加折磨人,首先不同于rosserial的库可以通过rossserial功能包直接在ROS环境中编译出来就能用。microros官方虽然提供了构建功能包和用于cubemx项目的框架,在这些仓库下官方提供了对应的构建方法,但是针对国内网络环境,官方提供的容器和其构建方法不能直接用。我这里针对官方提供的docker构建方法做一个补充,并添加一个非docker本地构建的方法,干货满满

Hrilug的博客 4514

ubuntu下安装arduino IDE、ros与arduino进行串口通信

1.安装arduino IDE 使用如下指令进行安装IDE : sudo apt-get install arduino 2.安装功能包 rosserial能够让arduino成为标准的ROS节点,可以发布和订阅ROS消息,发布TF转换,获取ROS系统时间。使用如下指令进行安装,注意ros版本号 sudo apt-get install ros-kinetic-rosserial-arduino sudo apt-get install ros-kinetic-rosserial rosstack pro

weixin_45168199的博客 4246

ros+arduino学习(四):ros发布消息控制舵机(arduino做下位机)

目录 前言 1.烧录Arduino程序 2.运行程序并发布消息 3.注意事项 前言 基于ros如果可以直接控制舵机的话,如果后面想做项目就会比较容易一些。 目前来说用ros控制舵机一般有两种方式: 一、直接通过舵机驱动板控制舵机。 二、通过向下位机通讯的方式控制舵机。 第一种方式一般适用于有舵机驱动板的情况,比如一些串口舵机和专用的舵机驱动器。 这些一般有固定的协议,根据协议控制,适用于有专用协议或者舵机数量较多的情况。 第二种方式通过下位机通讯,让下位机去控制舵机,需要用下位机的.

qqliuzhitong的博客 4253

rosserial通信协议简介

rosserial通信协议介绍

倔强不倒翁的博客 1万+

ubuntu环境下实现ROS 2 与 Arduino 通信

本教程为https://blog.youkuaiyun.com/2301_81924597/article/details/141757091?spm=1001.2014.3001.5501的进一步拓展。

2301_81924597的博客 1982

ros_arduino_bridge使用总结

关于ROS和Arduino通信方式,刚开始大多使用的是rosserial_arduino这个库,随后又诞生了一个新的库名为ros_arduino_bridge,两者对比如下: rosserial_arduino:由于将Arduino内的程序写成ros节点形式,所以能够快速的通过ROS控制Arduino,并且可以忽略通信协议层,与之相同的还有rosserial_stm32f1库,但是由

ROS小生的博客 1万+

Arduino在ROS中的应用

用途Arduino主要应用于控制电机驱动和各类传感器(比如超声波、IMU等),然后和ROS的上机位通讯,交换数据。安装与使用 安装rosserial软件包 sudo apt-get install ros-indigo-rosserial-arduino sudo apt-get install ros-indigo-rosserial 安装ros_lib库,其中<sketchbook>是ardui

EAIBOT的博客 7052

服务器(Server)的编程实现与自定义服务数据编程实现

通过这些示例,您可以了解如何创建一个ROS节点作为服务器,并根据实际需求添加自定义的服务逻辑。您还学会了如何创建自定义的服务消息类型,并在服务器中使用它们。在服务器编程中,我们将创建一个简单的ROS节点,该节点将充当服务器。在本文中,我将介绍如何进行服务器编程实现以及如何自定义服务数据的编程实现。在ROS中,您可以自定义服务消息类型以满足您的特定需求。通过使用自定义服务消息类型,您可以根据实际需求定义更复杂的服务数据结构,并在服务器中使用它们。然后,我们可以在服务器编程中使用我们的自定义服务消息类型。

XrxVue的博客 198

rosserial arduino的安装及使用(ROS控制arduino,arduino创建ROS结点)

一,简介 这个教程展示如何安装arduino IDE和使用rosserial Arduino和Arduino IDE是进行硬件开发的非常好的辅助工具 rosserial_arduino包可让ROS和ArduinoIDE一起工作 rosserial提供的ROS通讯协议工作在Arduino的UART上,它让Arduino成为标准的ROS节-点,可以发布和订阅ROS消息,发布TF转换,获...

蒋程扬的部落格 8181

arros:与 ROS 无线通信的 Arduino 机器人

阿罗斯 与 ROS 无线通信的 Arduino 机器人 这是我学位项目的结束。 我制作了一个便宜的 arduino 机器人(与其他商业机器人相比),并使用 ros-arduino-bridge 与 ROS 进行通信。 它有一些传感器,用于在环境中移动,避开障碍物,甚至创建环境地图。 可以在此处找到解释所有内容的论文: 我解释如何构建机器人和安装软件的 在这里: Este proyecto participa en el Certamen de Proyectos Libres de la UGR。 Las bases del concurso se pueden encontrar .

ROS与Arduino:Arduino IDE的配置安装+实现简单串口通讯

rosserial_arduino包可让ROS和ArduinoIDE一起工作 rosserial提供的ROS通讯协议工作在Arduino的UART上,它让Arduino成为标准的ROS节点,可以发布和订阅ROS消息,发布TF转换,获取ROS系统时间。 Arduino IDE安装 安装Arduino sudo apt-get install arduino ...

weixin_44827364的博客 1万+

使用 sim 卡SerialNumber判断省份

使用sim卡SerialNumber判断省份

Vmware安装windowsServer2022版本

全网最详细的Vmware安装windowsServer2022版本

A乐神的博客 7005

Arduino学习笔记(15)--Arduino & ROS

1. Why Arduino and ROS? ROS(Robot Operation System)是一个开源机器人操作系统,它是一个分布式的计算架构,集成了底层硬件驱动、节点间通讯、机器人控制、仿真环境和跨平台等功能。 Arduino主要应用于控制电机驱动和各类传感器(比如超声波、IMU、里程计、电机转速PID控制等),然后通过收发消息等到ros_topic和service...

Techblog of HaoWANG 2542

NVIDIA NCCL 源码解析:从XML拓扑到高性能通信图的构建

本文深入解析了NVIDIA NCCL如何将XML硬件拓扑文件转化为高性能通信图的核心过程。详细阐述了从创建CPU、GPU、NIC等节点,到建立PCIe、NVLink连接,再到计算链路带宽并进行关键排序的完整建图流程。该图是NCCL实现最优通信路径规划、充分发挥NVLink等高速互联性能的基石,直接影响分布式深度学习训练的效率。

convnet3designer的博客 306

ROS+arduino串口通信控制舵机

ROS+arduino串口通信控制舵机 在此我假设各位读者已经装好了ROS,笔者使用的Ubuntu16.04+ROS(Kinetic),如果读者使用的是Ubuntu18.04+ROS(Melodic)可能出现一些其他问题。 安装arduinoADE arduino具有支持Linux的官方ADE: arduino官网下载Linux版ADE 选择你所使用版本Linux对应的ADE 下载完之后在DO...

weixin_43114617的博客 4174

yolo自动化项目实例解析(九) 导航

比如我们经常使用的导航,说白了就是寻找两点之间最近的路径,也就是所谓的寻路,我们需要想办法让程序知道他要去哪里,路径包含(起点、轨迹、路径)

默子昂 1994

最佳解决Maven同一依赖多版本共存问题,重复依赖(同一个jar包,多个版本)-maven-shade-plugin

公司的历史项目在导出功能上引用的是poi-3.12版本,后续再做word模板导出功能时用到了poi-3.15版本,升级完后发现项目的很多导出功能都瘫痪了。用旧版本,新功能无法使用;用新版本,旧功能瘫痪,且整改的工作量比较大。使用maven-shade-plugin,将某个版本的依赖名称进行修改,重新引入即可。

S_White_Island的博客 1万+

ros_arduino_bridge控制舵机

简单对比在ros中使用ros_arduino_bridge和rosserial_arduino控制舵机的区别,然后根据ros_arduino_bridge包进行修改写一个ros_arduino_bridge控制舵机的例子。

Jiali Zhang的博客 3497

【ComfyUI】Wan2.2 Animate 背景保留动作迁移视频生成

本文介绍了一个基于ComfyUI的高精度视频生成工作流"Wan2.2 Animate",该系统融合动作捕捉、图像拼接和LoRA加权等技术,能自动识别人脸并完成精准动作迁移,同时保持背景稳定。工作流采用模块化设计,包含输入提取、图像融合、模型加载等关键节点,核心模型Wan2.2-Animate-14B支持fp8精度与BlockSwap控制。流程分为图像输入、动作提取、多图合成等五个阶段,通过文本提示编码器和图像语义编码器实现语义驱动的动作生成,最终输出高质量视频,适用于虚拟形象驱动和

Mr数据杨 2259
上一篇: ROS 学习笔记之二:准备
下一篇: ROS 学习笔记之四:扫盲
嵌入之梦
博客等级 码龄21年 134粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入之梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值