我试图制作一个小型3连接机器人。他们必须相互发送和接收传感器数据,并采取措施使读取趋于零。 我试图交换运动的角度让对方跟随他。我使用MQTT,效果很好。 但是当我尝试从def on_message获取数据时,在下一个变量不是全局的时候使用它。 代码如下:
############### MQTT section ##################
# when connecting to mqtt do this;
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe(sub_topic)
# when receiving a mqtt message do this;
def on_message(client, userdata, msg):
masterangel = int(msg.payload)
print ( masterangel )
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, 1883, 60)
client.loop_start()
# Start the Program
psm.screen.termPrintAt(1, "Press Go to stop program")
while(not doExit):
oldAngel = Angel
Angel = gyro.readValue()
Angelshow = "Current Angel ="+" "+str (Angel)
if ( oldAngel != Angel):
psm.screen.termPrintAt(5, Angelshow)
if (Angel < masterangel) :
psm.BBM1.setSpeedSync(20)
psm.BAM1.floatSync()
elif (masterangel < Angel ) :
psm.BAM1.setSpeedSync(20)
psm.BBM1.floatSync()
client.publish(pub_topic, "test")
现在有人知道如何使用变量&#34; masterangel&#34;在while循环中? 顺便说一下,打印顺序很好。
print ( masterangel )
提前感谢您,感谢您的帮助
答案 0 :(得分:0)
您需要在onMessage
函数范围之外初始化变量,然后在onMessage
函数中将其标记为全局变量。
查看python global
关键字。
############### MQTT section ##################
# when connecting to mqtt do this;
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe(sub_topic)
# when receiving a mqtt message do this;
def on_message(client, userdata, msg):
# use global version not local
global masterangel
masterangel = int(msg.payload)
print ( masterangel )
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, 1883, 60)
client.loop_start()
# initialise variable to starting value
masterangel = 0
# Start the Program
psm.screen.termPrintAt(1, "Press Go to stop program")
while(not doExit):
oldAngel = Angel
Angel = gyro.readValue()
Angelshow = "Current Angel ="+" "+str (Angel)
if ( oldAngel != Angel):
psm.screen.termPrintAt(5, Angelshow)
if (Angel < masterangel) :
psm.BBM1.setSpeedSync(20)
psm.BAM1.floatSync()
elif (masterangel < Angel ) :
psm.BAM1.setSpeedSync(20)
psm.BBM1.floatSync()
client.publish(pub_topic, "test")
答案 1 :(得分:-1)
为了避免以后变量范围可能出现的问题(即将局部变量与全局变量混合),而不是使用#include <iostream>
#include <math.h>
#include <cstdlib>
int main()
{
long N,NN = 0;
double h, tau, T1, T2 = 0;
N=100;
NN=pow(N,3);
h=1/N;
tau=pow(1/N,3);
T1=1;
T2=1.5;
double T [N][NN];
for (int i=0; i<N; i++) {
T [i][0]=T1;
for (int j=0; j<NN; j++) {
T [0][j]=T1;
T [N][j]=T2;}}
for (int i=1; i<N-1; i++) {
for (int j=1; j<NN; j++) {
T [i][j]=T [i][j-1]+(tau/(pow(h,2)))*(T [i+1][j-1]+T [i-1][j-1]-2*T [i][j-1]);}}
return 0;
}
关键字,请利用return语句。
换句话说,return允许你实际使用传递给return函数的参数并将其存储到另一个变量中,而print()只是打印到屏幕上。
global