【ROS-2】ROS接入传感器并通过mqtt发布

1、创建python源文件

# 创建功能包
zxh@zxh-Precision-3640-Tower:~/catkin_ws/src$ catkin_create_pkg ros_test roscpp rospy std_msgs 
zxh@zxh-Precision-3640-Tower:~/catkin_ws/src$ cd serial_voltage/
# 创建scripts文件夹,py文件放在scripts中
zxh@zxh-Precision-3640-Tower:~/catkin_ws/src/serial_voltage$ mkdir scripts
zxh@zxh-Precision-3640-Tower:~/catkin_ws/src/serial_voltage$ cd scripts/
zxh@zxh-Precision-3640-Tower:~/catkin_ws/src/serial_voltage/scripts$ gedit voltage.py

ROS接入传感器,并发布话题

#!/usr/bin/env python


import serial
import binascii,time
import rospy
from std_msgs.msg import String
import json
# 配置串口基本参数并建立通信
ser = serial.Serial("/dev/ttyUSB0", 9600, 8, "N", timeout=50,stopbits=1)

if __name__ == '__main__':
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('serial_ros_node')
    rate = rospy.Rate(10)
    while True:
        # 数据帧
        a = '01 03 02 58 00 01 04 61'
        # 发送16进制字符
        d = bytes.fromhex(a)
        # 串口发送数据
        read = ser.write(d)
        # 停止、等待数据
        time.sleep(5)
        count = ser.inWaiting()
        # 数据的接收
        if count > 0:
            data = ser.read(count)
            # 返回二进制数据的十六进制表示,每个字节被转换成相应的2位十六进制表示形式。
            # 通过[]得到我们想要的数据
            result = str(int(str(binascii.b2a_hex(data))[8:-5],16))
            result_json = {
                "voltage": result+"mv"
            }
            print(result_json)
            # data_string = json.dumps(result_json, indent=2)
            # print(type(data_string))
            # result_json is dict
            pub.publish(str(result_json))
            rate.sleep()

# 关闭串口
ser.close()

接收传感器发布的数据,并通过mqtt端上传服务端

#!/usr/bin/env python


import rospy
from std_msgs.msg import String
import random
import time
from paho.mqtt import client as mqtt_client
import json

broker = 'broker.emqx.io'
port = 1883
topic = "/mqtt/demo"
# generate client ID with pub prefix randomly
# client_id = f'python-mqtt-{random.randint(0, 1000)}'
client_id = "/edge/bdlf"

def callback(data):
    # json_data = data.loads(data.data)
    rospy.loginfo("receive_data:%s", data)
    # jsonDict = {}
    # jsonDict["voltage"] = eval(data).voltage
    # jsonStr = json.dumps(jsonDict)
    # topic_status = client_id + topic
    result = client.publish(topic, str(data))
    status = result[0]
    print(status)
    if status == 0:
        rospy.loginfo("send" + str(data) + "to topic " + topic)
    else:
        rospy.logdebug("Failed to send message to topic" + topic)


def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    client.loop_start()
    return client


# def publish(client):
#     msg_count = 0
#     while True:
#         time.sleep(1)
#         msg = f"messages: {msg_count}"
#         result = client.publish(client_id, msg)
#         # result: [0, 1]
#         status = result[0]
#         if status == 0:
#             print(f"Send `{msg}` to topic `{topic}`")
#         else:
#             print(f"Failed to send message to topic {topic}")
#         msg_count += 1

def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print("jsjj")

        pyload = str(msg.payload.decode())
        print(type(pyload))
        # print("Received" + msg.payload.decode() + "to topic" + topic)
        # print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    # topic_status = client_id + topic
    client.subscribe(topic)
    client.on_message = on_message


# def run():
#     client = connect_mqtt()
#     client.loop_start()
#     publish(client)


if __name__ == '__main__':
    rospy.init_node('listener')
    pub = rospy.Publisher(topic, String, queue_size=10)

    client = connect_mqtt()
    client.loop_start()
    # publish(client)

    rospy.Subscriber('chatter', String, callback)
    # rospy.spin() must
    rospy.spin()
    # run()

2、修改serial_voltage文件夹中的CMakeLists.txt文件

 catkin_install_python(PROGRAMS
   scripts/voltage.py
   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )

3、编译

cd catkin_ws
catkin_make

4、执行

roscore
#重新开启一个终端
cd catkin_ws
source ./devel/setup.bash  #每次运行节点都要执行下,可以将其写入.bashrc文件中 ~/catkin_ws/devel/setup.bash,这样就不用每次执行了
rosrun serial_voltage voltage.py

5、运行结果

6、 错误解决

 在待执行文件首加上以下内容

#!/usr/bin/env python 
#coding=utf-8
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值