想将ROS配送车的速度上传到云平台,然后远程控制与监控。由于ROS要求python的版本是2.7,且阿里云的mqtt的sdk只支持python3.5。所以用开源的paho来实现相应功能
官网下载,MQTT.fx。 参考【MQTT】用MQTT.fx连接阿里云,直到设备通过MQTT.fx,连接在线即可。
注意事项:
clientId 千万不要选123456,最好复杂点
生成密钥工具,可以选加密工具
可以看下官方文档,但是那个最小加密工具真的不好用。
安装paho库
pip install paho-mqtt
之后参考博主的代码魔改就可以了,记得更改一些参数配置
#!/usr/bin/python # -*- coding:utf8 -*- #----------------函数头-------------------# import paho.mqtt.client as mqtt import time import rospy import json from geometry_msgs.msg import Twist #---------------------变量设置-------------------# # Client对象构造 MQTTHOST = "a1QSlaSJ16g.iot-as-mqtt.cn-shanghai.aliyuncs.com" MQTTPORT = 1883 mqttClient = mqtt.Client("xxx|securemode=3,signmethod=hmacsha1|") mqttClient.username_pw_set("xxxxx", "xxxxx") post_path = "/sys/a1QSlaSJ16g/linux/thing/event/property/post" #---------------------mqtt设置------------------------# # 连接MQTT服务器 def on_mqtt_connect(): mqttClient.connect(MQTTHOST, MQTTPORT, 60) mqttClient.loop_start() # publish 消息 def on_publish(topic, payload, qos): mqttClient.publish(topic, payload, qos) # 消息处理函数 def on_message_come(lient, userdata, msg): user_dic = json.loads(msg.payload) twist = Twist() param_dic =user_dic["params"] try: if("linear_x" in param_dic.keys()): pub_linear_x = user_dic["params"]["linear_x"] twist.linear.x = pub_linear_x if("angular_z" in param_dic.keys()): pub_angular_z = user_dic["params"]["angular_z"] twist.angular.z = pub_angular_z pub.publish(twist) except: print(user_dic) # subscribe 消息 def on_subscribe(): # 订阅监听自定义Topic mqttClient.subscribe("/********/pythondevice2/user/update1", 1) mqttClient.on_message = on_message_come # 消息到来处理函数 #------------------ROS函数回调------------------# def mqtt_callback(data): if(data.linear.x == -0.0 and data.angular.z ==-0.0 ): pass else: linear_x = data.linear.x angular_z = data.angular.z payload_json = { 'id': int(time.time()), 'params': { 'linear_x': linear_x, 'angular_z': angular_z }, 'method': "thing.event.property.post" } time.sleep(0.5) on_publish(post_path,str(payload_json),1) print(str(payload_json)) def send_cmd(): rate = rospy.Rate(2) # 10hz while not rospy.is_shutdown(): pub.publish(twist) rate.sleep() if __name__ == '__main__': rospy.init_node('mqtt_server') on_mqtt_connect() on_subscribe() rospy.Subscriber("/mqtt_server", Twist, mqtt_callback) pub = rospy.Publisher('cmd_vel', Twist,queue_size = 3) rospy.spin()正常情况下,用云服务器,emq 和node-red既可以拓展一个自己的mqtt控制中心。但是平台有平台的优势,无论是阿里云还是华为云,数据上云只是第一步,难得是后面的数据利用与控制。
以阿里云为例: 这是自己linux的物理数据模型
在物理设备模型下主要有运行状态,事件管理,服务调用等功能,这些数据节点之后又可以在lot studio里面完成一个网页的数据展示。
设备端向云端发送的topic,主要有以下:
发送的msg数据应是json格式,且包含数据的标识符,
数据格式如下:
payload_json = { 'id': int(time.time()), 'params': { 'linear_x': linear_x, 'angular_z': angular_z }, 'method': "thing.event.property.post" }其他如在线测试,日志跟踪,文件管理的功能可以自己去摸索。
