主题:ROS2与ESP32 的通信实验
文章目录
前言
本文介绍了基于Ubuntu22.04 LTS系统上的ROS2 Humble(发布维护时间2022.5–2027.5)与ESP32-wroom-32的通信实验
`
一、ROS2节点的基本概念
Nodes:节点,一个节点即为一个可执行文件,节点之间通过ROS这个系统进行通信。
Messages:消息,消息是一种ROS数据类型,用于主题的订阅或发布。
Topics:主题,节点可以发布消息到主题,也可以订阅某些主题以接收这些主题的消息。
Master:节点管理器,ROS名称服务。(在ROS2中取消了Master节点)
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器。
rospy = python 客户端库
roscpp = c++ 客户端库
本文利用ros2中的topic主题进行通讯、控制
二、Ubuntu的准备
1.Ubuntu上安装ardunio
看了许多教程,并且亲身实测
如果再终端直接输入命令安装,会导致打不开arduino,闪退
sudo apt install arduino #错误做法
正确的安装方法如下,摘自Linux公社分享
wget https://downloads.arduino.cc/arduino-1.8.12-linux64.tar.xz
tar -xvf arduino-1.8.12-linux64.tar.xz
cd arduino-1.8.12/
sudo ./install.sh
2.ESP32开发板数据添加
1、在File 中 的Prefereces 中添加 ESP32 开发板网站
https://dl.espressif.com/dl/package_esp32_index.json
2、通过Tools/Manage Libraries 中 搜索esp32,下载并完成安装。
3、通过Sketch/include Libraries/Library Manager 中 搜索ros2arduino库并完成安装
4、测试 led灯 代码参考博主zhangrelay的 ROS2与Arduino发布订阅
#include <ros2arduino.h>
#define XRCEDDS_PORT Serial
#define PUBLISH_FREQUENCY 1 //hz
#define LED_BUILTIN 2
void publishString(std_msgs::String* msg, void* arg)
{
(void)(arg);
static int cnt = 0;
sprintf(msg->data, "Hello ROS2 From Arduino %d", cnt++);
}
class StringPub : public ros2::Node
{
public:
StringPub()
: Node("ros2arduino_pub_node")
{
ros2::Publisher<std_msgs::String>* publisher_ = this->createPublisher<std_msgs::String>("ros2_chatter");
this->createWallFreq(PUBLISH_FREQUENCY, (ros2::CallbackFunc)publishString, nullptr, publisher_);
}
};
void subscribeLed(std_msgs::Bool* msg, void* arg)
{
(void)(arg);
digitalWrite(LED_BUILTIN, msg->data);
}
class LedSub : public ros2::Node
{
public:
LedSub()
: Node("ros2arduino_sub_node")
{
this->createSubscriber<std_msgs::Bool>("ros2_led", (ros2::CallbackFunc)subscribeLed, nullptr);
}
};
void setup()
{
XRCEDDS_PORT.begin(115200);
while (!XRCEDDS_PORT);
ros2::init(&XRCEDDS_PORT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
static StringPub StringNode;
static LedSub LedNode;
ros2::spin(&StringNode);
ros2::spin(&LedNode);
}
上传过程中可能出现的错误
1、esp32 自带的wifi库 与arduino 的wifi 库发生冲突
路径下/arduino-1.8.12/libraries/WIFI 如果不需要,可以直接移动到回收站
2 Unbuntu :exec: “python”: executable file not found in $PATH
通过以下指令修复 esp32
sudo apt install python-is-python3
3.安装 Micro-XRCE-DDS
git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent && git checkout v1.1.0
mkdir build && cd build
cmake ..
make
sudo make install
sudo ldconfig /usr/local/lib/
终端下进行连接
MicroXRCEAgent serial --dev /dev/ttyUSB0 -b 115200
连接后arduino不能连接到开发板,ttyUSB0 还是 ttyACM0取决与Ubuntu与开发板的连接方式
4、开始测试
终端输入 : MicroXRCEAgent serial --dev /dev/ttyUSB0 -b 115200
然后 按下开发板上的 EN 按钮
此时 开发板已经在ubuntu上创建topic
在另一个终端输入 : ros2 topic list 可查看
最后,再新建一个终端 输入:
ros2 topic pub /ros2_led std_msgs/msg/Bool “{data: 0}” #关闭led
ros2 topic pub /ros2_led std_msgs/msg/Bool “{data: 1}” #开启led
观察esp32 指示灯 看到蓝色灯亮起,成功测试通信成功
总结
提示:这里对文章进行总结:
以上就是我两天踩坑的总结,从安装ROS2、arduino以及串口调试。由于本人是新人博主,文章中说明不清楚的地方见谅。