Estoy trabajando en un quadrotor. Sé su posición, , a dónde me gustaría ir, la posición de destino b , y a partir de eso calculo un vector c , un vector unitario que me llevará a mi objetivo:
c = b - a
c = normalize(c)
Como un quadrotor puede moverse en cualquier dirección sin rotación, lo que he intentado hacer es
- gire por el ángulo de guiñada de los robots
- dividirlo en sus componentes
- páselos al robot como ángulos de balanceo y cabeceo.
El problema es que si la guiñada es 0 ° ± 5, entonces esto funciona, pero si la guiñada está cerca de +90 o -90 falla y se dirige hacia direcciones equivocadas. Mi pregunta es ¿me estoy perdiendo algo obvio aquí?
quadcopter
uav
navigation
slam
kinect
computer-vision
algorithm
c++
ransac
mobile-robot
arduino
microcontroller
machine-learning
simulator
rcservo
arduino
software
wifi
c
software
simulator
children
multi-agent
ros
roomba
irobot-create
slam
kalman-filter
control
wiring
routing
motion
kinect
motor
electronics
power
mobile-robot
design
nxt
programming-languages
mindstorms
algorithm
not-exactly-c
nxt
programming-languages
mindstorms
not-exactly-c
raspberry-pi
operating-systems
mobile-robot
robotic-arm
sensors
kinect
nxt
programming-languages
mindstorms
sensors
circuit
motion-planning
algorithm
rrt
theory
design
electronics
accelerometer
calibration
arduino
sensors
accelerometer
Hamza
fuente
fuente
Respuestas:
Al volver a implementar su solución, obtengo esto:
Ángulo entre vectores
Primero, quieres el ángulo entre los puntosUNA ysi , no específicamente el vector unitario.
Ángulo de guiñada del vehículo
Encabezado vs Yaw
La superposición de 90 grados entre estas mediciones, combinada con la suma (en lugar de restar) la guiñada del vehículo de la guiñada deseada, puede ser la razón por la cual las cosas funcionaron cuando su objetivo estaba dentro de ± 5 ° y se comportó mal a ± 90 °.
Conversión a Componente X e Y
Control PID
Puede ser mejor servido usando bucles de control PID para el balanceo y el cabeceo del vehículo. Es decir, una vez que arregle su código y pueda alcanzar su objetivo, supongo que comenzará a sobrepasarlo, oscilando de un lado a otro. Un PID sintonizado correctamente evitará que eso suceda mientras le permite acercarse rápidamente al objetivo.
fuente
Asumiré que estás hablando de un vector 3D aquí. ¿Puedes generalizar
normalize()
así? ¿Es tan común (nunca lo he visto, así que si es así, entonces noticias para mí). De lo contrario, los problemas obvios de ajuste de la brújula se aplican a cada uno de los componentes X e Y. ¿Por qué no llamarlos rodar y / o lanzar y / o guiñar? (mezclar nomenclatura 3D y 2D confunde la pregunta).Mi normalización 2D se parece a esto;
Si de hecho es un quad, supongo que sus componentes X e Y son realmente YAW, Altitud ((X, Y) y Z). Tendrá que manejar el
YAW(X, Y)
en 2D, y simplemente dejar caer o ganar altitud para Z (y de nuevo por eso sospecho que normalizar es más de lo que tiene).fuente