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