微信小程序和ros2进行通信

这篇具有很好参考价值的文章主要介绍了微信小程序和ros2进行通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


  ROS2做为一款优秀的机器人操作系统软件,其搭载了丰富的机器人平台,是目前机器人领域应用最多的软件。微信做为一个大型社交软件,应用非常广泛,其中的小程序直接通过扫二维码进行加载,使用起来非常方便快捷。为了让手机端能够对机器人进行操作,于是通过微信小程序与ROS2通信的方式将两者联系在一起。
  ROS2在ubuntu的电脑上运行,而微信则运行在手机端,可以通过一个中间设备透传两者之间的消息的方式实现,笔者目前采用mqtt通信的方式进行,中间设备是 免费公共 MQTT 服务器 ,作为本次测试的 MQTT 服务器地址,服务器接入信息如下:
  • Broker: broker.emqx.io
  • TCP Port: 1883
  • SSL/TLS Port: 8883
    更多详情请访问 EMQX Cloud 官网,或查看EMQX Cloud 文档 。

环境配置

ubuntu下安装ros2

直接使用鱼香ros进行安装,安装脚本命令:

wget http://fishros.com/install -O fishros && . fishros

ubuntu安装mqtt库

git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
mkdir build
cd build
cmake ..
make
sudo make install

windows安装微信开发者工具

进入官网下载windows版本的安装程序,保证C盘有1G的空闲空间,否则会出现安装失败的情况。

主要功能模块介绍

ROS2基础程序讲解

mqtt_c.hpp

#ifndef MQTT_C_HPP_
#define MQTT_C_HPP_

#include <iostream>
#include "stdlib.h"
#include "string.h"
#include "unistd.h"
#include <functional>

#include "MQTTClient.h"

class Mqtt_C {
public:
    //加载类的静态函数或全局函数做为mqtt的回调函数
    Mqtt_C(char* address, char* client_id, char* user_name, char* password, char* topic, int qos, MQTTClient_messageArrived *callBack);
    
    //加载类的非静态函数做为mqtt的回调函数
    Mqtt_C(char* address, char* client_id, char* user_name, char* password, char* topic, int qos, std::function<void (void*, char*, int, MQTTClient_message*)> callBack);
    ~Mqtt_C();

    // 发送mqtt消息
    void publish(char *topic, char *payload);

private:
    bool connect_flag_;    //0表示连接失败,1表示成功
    long TIMEOUT = 10000;
    char* topic_;
    MQTTClient client_;
    int qos_;

    //待绑定的回调函数
    std::function<void (void*, char*, int, MQTTClient_message*)> callBackFun;

    //接受mqtt的回调函数
    static int on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message);
};

typedef Mqtt_C* Mqtt_C_Ptr;    //不能使用智能指针,否则会关闭mqtt连接

#endif

mqtt_c.cpp

#include "mqtt_c.hpp"

Mqtt_C::Mqtt_C(char* address, char* client_id, char* user_name, char* password, char* topic, int qos, MQTTClient_messageArrived *callBack)
: connect_flag_(0) {
    int rc;
    topic_ = topic;
    qos_ = qos;

    MQTTClient_create(&client_, address, client_id, 0, NULL);
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    conn_opts.username = user_name;
    conn_opts.password = password;

    //将全局函数或类的静态函数
    MQTTClient_setCallbacks(client_, NULL, NULL, callBack, NULL);

    if ((rc = MQTTClient_connect(client_, &conn_opts)) != MQTTCLIENT_SUCCESS) {
        std::cout << "Failed to connect, return code " << rc << std::endl;
        connect_flag_ = 0;
        return;
    } else {
        std::cout << "Connected to MQTT Broker!" << std::endl;
        connect_flag_ = 1;
    }
    // 开始订阅对应topic的消息
    MQTTClient_subscribe(client_, topic, qos);
}

Mqtt_C::Mqtt_C(char* address, char* client_id, char* user_name, char* password, char* topic, int qos, std::function<void (void*, char*, int, MQTTClient_message*)> callBack)
: connect_flag_(0)  {
    int rc;
    topic_ = topic;
    qos_ = qos;

    // 将需要回调的函数进行绑定
    callBackFun = callBack;

    MQTTClient_create(&client_, address, client_id, 0, NULL);
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    conn_opts.username = user_name;
    conn_opts.password = password;

    // 将类的this指针传入on_message函数中,以便静态函数调用类的非静态成员
    MQTTClient_setCallbacks(client_, this, NULL, on_message, NULL);

    if ((rc = MQTTClient_connect(client_, &conn_opts)) != MQTTCLIENT_SUCCESS) {
        std::cout << "Failed to connect, return code " << rc << std::endl;
        connect_flag_ = 0;
        return;
    } else {
        std::cout << "Connected to MQTT Broker!" << std::endl;
        connect_flag_ = 1;
    }
    // 开始订阅对应topic的消息
    MQTTClient_subscribe(client_, topic, qos);
}

Mqtt_C::~Mqtt_C() {
    if(connect_flag_ == 1) {
        MQTTClient_disconnect(client_, TIMEOUT);
        MQTTClient_destroy(&client_);
    }

    std::cout << "Close the mqtt connect" << std::endl;
}

void Mqtt_C::publish(char *topic, char *payload) {
    if(connect_flag_ == 1) {
        MQTTClient_message message = MQTTClient_message_initializer;
        message.payload = payload;
        message.payloadlen = strlen(payload);
        message.qos = qos_;
        message.retained = 0;
        MQTTClient_deliveryToken token;
        MQTTClient_publishMessage(client_, topic, &message, &token);
        MQTTClient_waitForCompletion(client_, token, TIMEOUT);
        std::cout << "Send " << payload << " to topic " << topic << std::endl;
    }
    else {
        std::cout << "Failed to connect" << std::endl;
    }
}

int Mqtt_C::on_message(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
    // 调用绑定的回调函数
    Mqtt_C* ptr = (Mqtt_C*)context;
    ptr->callBackFun(context, topicName, topicLen, message);

    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);

    return 1;
}

main.cpp

#include <chrono>
#include <functional>
#include <memory>
#include <string>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

#include "MQTTClient.h"
#include "mqtt_c.hpp"

using namespace std::chrono_literals;

class MinimalPublisher : public rclcpp::Node {
public:
    MinimalPublisher() : Node("minimal_publisher") {
        // 初始化ros发布的消息
        publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);

        // 初始化mqtt的消息及加载回调函数
        mqtt_ = new Mqtt_C("tcp://broker.emqx.io:1883", "c-client", "test", "test", "/wechat_ros/mqtt", 0, std::bind(&MinimalPublisher::getMqttMessage, 
                                                                                                                     this,
                                                                                                                     std::placeholders::_1,
                                                                                                                     std::placeholders::_2,
                                                                                                                     std::placeholders::_3,
                                                                                                                     std::placeholders::_4));
    }
    
private:
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    
    Mqtt_C_Ptr mqtt_;

    // 定义mqtt的回调函数
    void getMqttMessage(void *context, char *topicName, int topicLen, MQTTClient_message *message) {
        auto* payload = message->payload;
        std::cout << "Received " << (char*)(payload) << " from " << topicName << " topic" << std::endl;

        // 发布mqtt消息
        mqtt_->publish("/wechat_ros_return/mqtt", "ros2 to wechat");

        // 发布ros消息
        auto ros_message = std_msgs::msg::String();
        ros_message.data = (char*)(payload);
        RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", ros_message.data.c_str());
        publisher_->publish(ros_message);
    }
};

int main(int argc, char * argv[]) {
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<MinimalPublisher>());
    rclcpp::shutdown();
    return 0;
}

微信小程序基础程序讲解

微信小程序参考EMQ的demo,源程序

编译及运行ros2程序

mkdir ros2_ws
cd ros2_ws
mkdir src
cd src
git clone https://gitee.com/jdi-shen/wechat_to_ros2.git
cd ..
colcon build
export LD_LIBRARY_PATH=/usr/local/lib
source install/setup.bash
ros2 run ros2_end main

编译及运行微信小程序

在windows中下载源程序,运行微信开发者工具,加载源程序中的“wechat_robot”,勾选“不校验合法域名、web-view(业务域名)、TLS版本以及HTTPS证书”,如同1所示。

微信小程序和ros2进行通信
图1

直接使用微信开发者工具中的模拟器或点击“真机调试”生成二维码,用手机微信扫描二维码运行。点击“连接”、“订阅”,然后点击“发布”,会在ros2终端中收到消息,同时手机小程序也会收到消息。至此实现了ros2和微信小程序之间的简单通信过程。文章来源地址https://www.toymoban.com/news/detail-494889.html

主要事项

  1. 在运行ros程序时,需要加载环境变量“export LD_LIBRARY_PATH=/usr/local/lib”;
  2. 所有源程序在gitee仓库,https://gitee.com/jdi-shen/wechat_to_ros2.git;
  3. 运行ros2程序的ubuntu系统和手机都需要连上互联网;

到了这里,关于微信小程序和ros2进行通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS2从入门到精通1-2:详解ROS2服务通信机制与自定义服务

    本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 服务 是 ROS 图中节点之间的另一种通信方法。服务基于 服务器-客户端 模型,不同于话题的 发布者-订阅者

    2024年04月09日
    浏览(29)
  • STM32 使用microros与ROS2通信

    本文主要介绍如何在STM32中使用microros与ROS2进行通信,在ROS1中标准的库是rosserial,在ROS2中则是microros,目前网上的资料也有一部分了,但是都没有提供完整可验证的demo,本文将根据提供的demo一步步给大家进行演示。 1、首先如果你用的不是STM32F4的话,则需要自己去生成 micro_r

    2024年02月08日
    浏览(34)
  • ros2 基础教程-使用ROS 2进行相机标定

    相机(摄像头)是一种非常精密的光学仪器,对外界环境的感知非常敏感。由于摄像头内部和外部的一些原因,摄像头采集的图像常常会发生一定的畸变。如果直接将采集到的图像拿来进行图像处理,会产生很大的问题。为了避免图像数据源造成的误差,需要对摄像头的相关

    2024年01月21日
    浏览(41)
  • [ROS2系列] ORBBEC(奥比中光)AstraPro相机在ROS2进行rtabmap 3D建图

    目录 背景: 一、驱动AstraPro摄像头 二、安装rtabmap error1:缺包 三、尝试 四、参数讲解 五、运行 error2: Did not receive data since 5 seconds! 六、效果​编辑 error4: 背景: 1、设备:pc;jeston agx orin 2、环境:Ubuntu20.04;ROS2(Foxy) 3、主从机配置,jeston agx orin为主机 4、 jeston agx orin含有

    2024年02月07日
    浏览(31)
  • C++使用serial串口通信 + ROS2示例IMU串口驱动

    串行接口 (Serial Interface)简称串口(通常指COM接口),是采用串行通信方式的扩展接口,是指数据一位一位地顺序传送,串口通信就要解析这一位一位数据。这里使用的是亚博智能的10轴IMU模块为例介绍C++使用serial串口通信,此IMU模块为UART通信,它是一异步通讯:不需要时

    2024年01月25日
    浏览(70)
  • ESP32中micro-ROS与ROS2通信(点亮esp32指示灯)

    micro-ROS,是基于ROS2进行优化的一套轻量级ROS系统,它提供了完全部署的ROS 2生态系统的大多数吸引人的工具和功能,并具有入式和低资源设备的卓越能力,可以运行在MCU硬件平台。 传统上,即使机器人包含许多ROS,ROS仍停留在微控制器边界。它们通常通过串行协议与旧版RO

    2024年02月01日
    浏览(31)
  • 【ROS2机器人入门到实战】使用API进行导航

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn Navigation 2 对外提供了动作服务用于导航调用。动作通信是 ROS 2 四

    2024年02月03日
    浏览(33)
  • ROS2 库包设置和使用 Catch2 进行单元测试

            本文的目的是了解如何在 ROS2 中创建库,以供其他 ROS2 包使用。除此之外,本文还介绍了如何使用 catch2 框架编写单元测试。本文的第 

    2024年02月07日
    浏览(28)
  • ROS2系统学习番外篇2---用VSCode开发ROS2程序

    在ROS2系统学习3—第一个“Hello World”程序—即工作空间创建与包创建中已经介绍了如何创建ROS的工作空间以及包。在开发大型工程时,往往需要在IDE下面进行开发,因此本篇介绍使用VSCode来搭建ROS2开发环境的方法。 首先用VSCode打开ROS2的工作空间。 按Ctrl+shift+P进入命令模式

    2024年02月13日
    浏览(29)
  • 微信小程序 |做一款跟ChatGPT下五指棋的小程序

    敢问世间万物,何以解忧? 时下最为火爆的 ChatGPT 想必够资格来回答一下这个问题。 要想当年 AlphaGO 打败世界围棋高手李世石,就展露出AI的惊人实力,时隔多年,AI领域在憋了这么多年之后,现如今, ChatGPT 4 大杀四方,各行各业无不为之震撼! 借用刚召开的新程序员大会

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包