我已经创建了一个api,通过web ui来控制我的beaglebone blue。电路板本身控制两个直流电机(用于驱动)和一个伺服电机(用于转动相机)。我的api从ui接收get请求,以控制直流电机,但由于某些原因,电机未收到信号。在最长的一段时间里(与我现在使用的代码完全相同),它工作得很好。我用电压表检查是否有信号被发送到直流电机,并且没有电源被发送。我已经更新了我的板,并确保我有最新版本的rcpy。我不明白为什么会发生这种情况。奇怪的是伺服电机工作得非常好(就像它最初做的那样)。
以下是我的api的代码:
import rcpy
import rcpy.motor as motor
import rcpy.servo as srv
import rcpy.clock as clock
import time
from flask import Flask, render_template, request, jsonify, make_response
from datetime import datetime
app = Flask(__name__)
@app.route('/')
def index():
return render_template('robocar.html')
@app.route('/servo/<duty>')
def move_camera(duty=0.0):
global servo_duty
if request.method == "GET":
servo = srv.Servo(1)
duty = max(min(1.0, float(duty)), -1.0)
rcpy.set_state(rcpy.RUNNING)
clk = clock.Clock(servo, 0.02)
srv.enable()
clk.start()
servo.set(duty)
time.sleep(1)
clk.stop()
srv.disable()
return _corsify_actual_response(jsonify({"response": "200"}))
else:
return _build_cors_prelight_response()
@app.route('/drive/<speed>/<direction>')
def move_car(speed=0.0, direction=0):
if request.method == "GET":
motor1_channel = 1
motor2_channel = 2
speed = float(speed)
direction = int(direction)
wheel_speeds = [speed, -speed]
if direction == 1:
motor.set(motor1_channel, wheel_speeds[0])
motor.set(motor2_channel, wheel_speeds[1])
elif direction == 4:
motor.set(motor1_channel, wheel_speeds[0])
motor.set(motor2_channel, wheel_speeds[0])
if speed >= 0.1:
time.sleep(0.5)
stop_car()
elif direction == 3:
motor.set(motor1_channel, wheel_speeds[1])
motor.set(motor2_channel, wheel_speeds[0])
elif direction == 2:
motor.set(motor1_channel, wheel_speeds[1])
motor.set(motor2_channel, wheel_speeds[1])
if speed >= 0.1:
time.sleep(0.5)
stop_car()
#time.sleep(20)
#stop_car()
return _corsify_actual_response(jsonify({"response": "200"}))
else:
return _build_cors_prelight_response()
@app.route('/brake')
def stop_car():
if request.method == "GET":
motor1_channel = 1
motor2_channel = 2
motor.set_brake(motor1_channel)
motor.set_brake(motor2_channel)
return _corsify_actual_response(jsonify({"response": "200"}))
else:
return _build_cors_prelight_response()
def _build_cors_prelight_response():
response = make_response()
response.headers.add("Access-Control-Allow-Origin", "*")
response.headers.add('Access-Control-Allow-Headers', "*")
response.headers.add('Access-Control-Allow-Methods', "*")
return response
def _corsify_actual_response(response):
response.headers.add("Access-Control-Allow-Origin", "*")
return response
if __name__ == '__main__':
app.run(host='0.0.0.0')
下面是我向api发出请求的javascript:
servo_duty = 0.0
function moveCamera(duty) {
servo_duty += duty
servo_duty = Math.max(-1.0, Math.min(1.0, servo_duty))
$.ajax({
url: "http://beaglebone.local:5000/servo/" + servo_duty,
type: "GET",
cache: false,
data: {},
success: () => {
console.log('ok');
},
error: function(result) {
console.log(result);
}
});
}
function moveCar(speed, direction) {
$.ajax({
url: "http://beaglebone.local:5000/drive/" + speed + "/" + direction,
type: "GET",
cache: false,
data: {},
success: () => {
console.log('ok');
},
error: function(result) {
console.log(result);
}
});
}
function stopCar() {
$.ajax({
url: "http://beaglebone.local:5000/brake",
type: "GET",
cache: false,
data: {},
success: () => {
console.log('ok');
},
error: function(result) {
console.log(result);
}
});
}
当一个直流电机的请求被发送到电路板时,我得到一个200的响应。控制台或api端没有错误。有什么想法吗(对不起,代码墙)。
暂无答案!
目前还没有任何答案,快来回答吧!