ROSSERIAL与Arduino IDE交叉开发(UBUNTU环境,包含ESP32、arduino nano)

ROSSERIAL与Arduino IDE交叉开发

一、简介

这个教程展示在ubuntu环境下如何利用Arduino IDE配合rosserial开发机器人部件。通过Arduino IDE+rosserial实现arduino/esp32开发板通过串口跟PC Master进行ros通信,从而开发自己的机器人智能硬件。

二、安装

1、Ubuntu下的Arduino IDE安装

  • 安装Arduino
bash 复制代码
sudo apt-get install arduino

启动arduino并进行相关设置, 完成后增加sketchbook/libraries目录等

bash 复制代码
arduino 

如果安装失败,可以考虑通过Ubuntu software可视化界面安装,安装形式为snap。

  • Ubuntu下rosserial arduino软件安装
bash 复制代码
sudo apt-get install ros-{$ROS_DISTRO}-rosserial
sudo apt-get install ros-{$ROS_DISTRO}-rosserial-arduino
rospack profile
  • 安装ros_lib到Arduino IDE开发环境

rosserial-arduino安装后,可以使用ros命令在本地生成arduino ide使用的ros_lib通讯库。

通常会生成ros_lib目录,将其复制到Arduino的开发环境。一般为Arduino库目录sketchbook/libraries。snap安装的Arduino IDE目录在~/snap/arduino/85/Arduino/libraries

bash 复制代码
cd Arduino/libraries/

rm -rf ros_lib #如之前有,可以先删除

rosrun rosserial_arduino make_libraries.py .
  • 检查ros_lib是否安装成功
    重启Arduino IDE,查看Sketch->includeLibrary查看是否存在ros_lib选项。可以通过File->Examples->Examples from custom libraries-> ros_lib-> HelloWorld开启演示项目
cpp 复制代码
/*
 * rosserial Publisher Example
 * Prints "hello world!"
 */

#include <ros.h>
#include <std_msgs/String.h>

ros::NodeHandle  nh;

std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);

char hello[13] = "hello world!";

void setup()
{
  nh.initNode();
  nh.advertise(chatter);
}

void loop()
{
  str_msg.data = hello;
  chatter.publish( &str_msg );
  nh.spinOnce();
  delay(1000);
}

arduino ide编译后上传到开发板

针对ESP32报错问题原因溯源和修改

报错内容:

bash 复制代码
assert failed: tcpip_send_msg_wait_sem IDF/components/lwip/lwip/src/api/tcpip.c:455 (Invalid mbox)

该问题原因在于。在ros.h中ArduinoTcpHardware.h文件内定义了ArduinoHardware类,而ArduinoHardware.h也有一个ArduinoHardware类这就是问题来源。使用esp32时会定义ESP32宏,并调用ArduinoTcpHardware.h,使用WIFI通讯。而rosserial主要通过串口通信。解决办法就是修改ros.h,让程序调用使用串口的ArduinoHardware的class。注释掉//ArduinoTcpHardware.h,并include< ArduinoHardware.h>

cpp 复制代码
//文件路径 ~/snap/arduino/85/Arduino/libraries/ros_lib/ros.h

#ifndef _ROS_H_
#define _ROS_H_

#include "ros/node_handle.h"

#if defined(ESP8266) or defined(ESP32) or defined(ROSSERIAL_ARDUINO_TCP)
  #include "ArduinoHardware.h"
  //注释原有头文件ArduinoTcpHardware
  //#include "ArduinoTcpHardware.h"
#else
  #include "ArduinoHardware.h"
#endif

修改后编译和烧录均成功,且串口不再显示报错信息。

三、运行结点

连接单片机设备

命令行1:运行roscore:

bash 复制代码
roscore

命令行2:运行结点(串口设备文件为/dev/ttyUSB0, esp32和arduino均可):

bash 复制代码
rosrun rosserial_python serial_node.py /dev/ttyUSB0

命令行3:查看话题消息:

bash 复制代码
$ rostopic list
/chatter
/diagnostics
/rosout
/rosout_agg
$ rostopic echo /chatter
data: "hello world!"
---
data: "hello world!"
---
data: "hello world!"
---
^C
相关推荐
澄澈i12 分钟前
CMake学习篇[3]---CMake进阶+嵌套CMakeLists+多层级关系
c++·学习·cmake
酷飞飞1 小时前
掌握DMA基于GD32F407VE的天空星的配置
stm32·单片机·嵌入式硬件·arm
杨小码不BUG1 小时前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
清风6666661 小时前
基于单片机的Boost升压斩波电源电路
单片机·嵌入式硬件·毕业设计·课程设计
qiuiuiu4132 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机
草莓熊Lotso2 小时前
《C++ STL list 完全指南:从基础操作到特性对比,解锁链表容器高效用法》
开发语言·c++·list
繁星星繁2 小时前
C++11学习笔记
c++·笔记·学习
搞一搞汽车电子7 小时前
单片机的堆\栈\Flash\Ram区别和联系
单片机·嵌入式硬件
Stanford_11068 小时前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台
千里马-horse9 小时前
Async++ 源码分析8--partitioner.h
开发语言·c++·async++·partitioner