Oi,
Estou fazendo um controle baseado na visão e a câmera está voltada para baixo no drone.
Portanto, a estimativa da posição está na estrutura corporal.
Descobri que o tópico / mavros / setpoint_velocity / cmd_vel pode ser usado para alterar a velocidade do drone, mas parece que está no quadro do NED.
Existe um tópico como / mavros / setpoint_velocity / cmd_vel, mas usar moldura corporal?
Ou preciso converter meu ponto de ajuste de velocidade da estrutura do corpo para a estrutura NED para implementá-lo?
Tentei encontrar algo que possa usar e encontrei este código. https://github.com/weiweikong/px4_velocity_control_keyboard/blob/master/src/px4_velocity_control_node.cpp
vs_body_axis.twist.linear.x = vs.twist.linear.x * cos(uavYawENU) + vs.twist.linear.y * sin(uavYawENU);
vs_body_axis.twist.linear.y = vs.twist.linear.x * sin(uavYawENU) - vs.twist.linear.y * cos(uavYawENU);
Parece que essa é a melhor solução que consegui encontrar.
Não tenho certeza se o Yaw é apenas de IMU ou da fusão de IMU e magnético.
Você tem algum comentário ou ideia sobre isso?
Mavros: 0.17.3
ROS: Indigo
Ubuntu: 14.04
APM: Copter V3.4-dev (fe724032)
bshang2 @ mechatronics-990 : ~ / simulação / ardupilot / ArduCopter $ roslaunch ardupilot_sitl_gazebo_plugin erlecopter_mark.launch
... registrando em /home/bshang2/.ros/log/ca9213bc-89bf-11e7-b657-1803733b65bb/roslaunch-mechatronics-990-28079.log
Verificando o diretório de log para uso do disco. Isso pode demorar um pouco.
Pressione Ctrl-C para interromper
Concluída a verificação do uso do disco do arquivo de log. O uso é <1 GB.
servidor roslaunch iniciado http: // mechatronics-990 : 45006 /
PARÂMETROS CLAROS
PARÂMETROS
NODES
/
gazebo (gazebo_ros / gzserver)
gazebo_gui (gazebo_ros / gzclient)
mavros (mavros / mavros_node)
spawn_erlecopter (gazebo_ros / spawn_model)
auto-iniciar novo mestre
processo [master]: iniciado com pid [28094]
ROS_MASTER_URI = http: // localhost : 11311
configuração / run_id para ca9213bc-89bf-11e7-b657-1803733b65bb
processo [rosout-1]: iniciado com pid [28107]
iniciou o serviço principal [/ rosout]
processo [mavros-2]: iniciado com pid [28126]
processo [spawn_erlecopter-3]: iniciado com pid [28133]
processo [gazebo-4]: iniciado com pid [28134]
processo [gazebo_gui-5]: iniciado com pid [28151]
script spawn_model iniciado
processo [gazebo-4] morreu [pid 28134, código de saída 255, cmd / home / bshang2 / simulação / ros_catkin_ws / src / gazebo_ros_pkgs / gazebo_ros / scripts / gzserver -u -e ode / home / bshang2 / simulação / ros_catkin_ws / src /ardupilot_sitl_gazebo_plugin/ardupilot_sitl_gazebo_plugin/worlds/mark_world/mark.world __name: = gazebo __log: = / home / bshang2 / .ros / log / ca9213bc-89bf-11e7-b657-1803733b65bb / gazebo].
arquivo de log: /home/bshang2/.ros/log/ca9213bc-89bf-11e7-b657-1803733b65bb/gazebo-4 .log[INFO] [WallTime: 1503684250.172508] [0,000000] Carregando modelo xml do parâmetro ros[INFO] [WallTime: 1503684250.176886] [0,000000] Aguardando serviço / gazebo / spawn_urdf_modelprocesso [gazebo_gui-5] morreu [pid 28151, código de saída 255, cmd / home / bshang2 / simulação / ros_catkin_ws / src / gazebo_ros_pkgs / gazebo_ros / scripts / gzclient __name: = gazebo_gui __log: = / home / bshang2 / .ros /. log / ca9213bc-89bf-11e7-b657-1803733b65bb / gazebo_gui-5.log].arquivo de registro: /home/bshang2/.ros/log/ca9213bc-89bf-11e7-b657-1803733b65bb/gazebo_gui-5 .log
^ C [spawn_erlecopter-3] matando na saída
[mavros-2] matando na saída
Traceback (última chamada mais recente):
Arquivo "/ home / bshang2 / simulação / ros_catkin_ws / src / gazebo_ros_pkgs / gazebo_ros / scripts / spawn_model", linha 301, em
sm.callSpawnService ()
Arquivo "/ home / bshang2 / simulação / ros_catkin_ws / src / gazebo_ros_pkgs / gazebo_ros / scripts / spawn_model", linha 267, em callSpawnService
proposição_inicial, self.reference_frame, self.gazebo_namespace)
Arquivo "/home/bshang2/simulation/ros_catkin_ws/src/gazebo_ros_pkgs/gazebo_ros/src/gazebo_ros/gazebo_interface.py", linha 28, em spawn_urdf_model_client
rospy.wait_for_service (gazebo_namespace + '/ spawn_urdf_model')
Arquivo "/opt/ros/indigo/lib/python2.7/dist-packages/rospy/impl/tcpros_service.py", linha 159, em wait_for_service
aumentar ROSInterruptException ("desligamento rospy")
rospy.exceptions.ROSInterruptException: rospy shutdown
^ C [rosout-1] matando na saída
^ C [master] matando na saída
desligando monitor de processamento ...
... desligando o monitor de processamento completo
feito
bshang2 @ mechatronics-990 : ~ / simulação / ardupilot / ArduCopter $ roslaunch ardupilot_sitl_gazebo_plugin erlecopter_mark.launch
... registrando em /home/bshang2/.ros/log/e483c856-89bf-11e7-bb61-1803733b65bb/roslaunch-mechatronics-990-28603.log
Verificando o diretório de log para uso do disco. Isso pode demorar um pouco.
Pressione Ctrl-C para interromper
Concluída a verificação do uso do disco do arquivo de log. O uso é <1 GB.
servidor roslaunch iniciado http: // mechatronics-990 : 41224 /
PARÂMETROS CLAROS
PARÂMETROS
NODES
/
gazebo (gazebo_ros / gzserver)
gazebo_gui (gazebo_ros / gzclient)
mavros (mavros / mavros_node)
spawn_erlecopter (gazebo_ros / spawn_model)
auto-iniciar novo mestre
processo [master]: iniciado com pid [28618]
ROS_MASTER_URI = http: // localhost : 11311
configuração / run_id para e483c856-89bf-11e7-bb61-1803733b65bb
processo [rosout-1]: iniciado com pid [28631]
iniciou o serviço principal [/ rosout]
processo [mavros-2]: iniciado com pid [28656]
processo [spawn_erlecopter-3]: iniciado com pid [28657]
processo [gazebo-4]: iniciado com pid [28674]
processo [gazebo_gui-5]: iniciado com pid [28678]
script spawn_model iniciado
[INFO] [WallTime: 1503684293.653120] [0,000000] Carregando modelo xml do parâmetro ros
[INFO] [WallTime: 1503684293.657344] [0,000000] Aguardando serviço / gazebo / spawn_urdf_model
[INFO] [WallTime: 1503684294.260952] [0,047500] Calling service / gazebo / spawn_urdf_model
[INFO] [WallTime: 1503684294.855628] [0.445000] Status de Spawn: SpawnModel: modelo gerado com sucesso
processo [spawn_erlecopter-3] foi concluído de forma limpa
arquivo de registro: /home/bshang2/.ros/log/e483c856-89bf-11e7-bb61-1803733b65bb/spawn_erlecopter-3*.log
bshang2 @ mechatronics-990 : ~ / simulação / ardupilot / ArduCopter $ rostopic echo -n1 / diagnostics
cabeçalho:
seq: 6456
carimbo:
segs: 6817
nsecs: 500000000
frame_id: ''
status:
bshang2 @ mechatronics-990 : ~ / simulação / ardupilot / ArduCopter $ rosrun mavros checkid
OK. Recebi mensagens de 1: 1.
Recebeu 1231 mensagens, de 1 endereço
sys: comp lista de mensagens
1: 1 0, 1, 2, 136, 152, 150, 24, 27, 29, 30, 32, 33, 162, 163, 164, 165, 42, 173, 178, 62, 193, 74, 35, 36 , 241, 116
Ei,
Você pode usar o setpoint_raw.
http://wiki.ros.org/mavros#mavros.2BAC8 -Plugins.setpoint_raw
No ponto de ajuste de destino, você pode alterar o quadro de coordenadas.
http://docs.ros.org/api/mavros_msgs/html/msg/PositionTarget.html
Para setpoint_velocity
, adicionarei uma correção que permitirá escolher entre LOCAL_NED
e BODY_NED
, já que atualmente é LOCAL_NED
(https: / /github.com/mavlink/mavros/blob/master/mavros/src/plugins/setpoint_velocity.cpp#L81). Nesse meio tempo, você pode usar setpoint_raw
e definir coordinate_frame
para FRAME_BODY_NED
ou MAV_FRAME::BODY_NED
(ambos devem funcionar).
Obrigado @AlexisTM e @ TSC21. Sua resposta é útil. Vou tentar isso mais tarde.
@ TSC21 @AlexisTM Obrigado pela ajuda! Posso controlar a velocidade na estrutura corporal agora. O vídeo é gravado: https://www.youtube.com/watch?v=dyUQfFYX3pk&feature=youtu.be
rostopic pub /mavros/setpoint_raw/local mavros_msgs/PositionTarget '{header: {stamp: now, frame_id: "world"}, coordinate_frame: 8, type_mask: 3527, velocity: {x: 0.1, y: 0, z: 0}}' -r 10
@cnpcshangbo bom saber
oi @cnpcshangbo , obrigado pelo vídeo.
Eu posto isso para ajudar outros a esclarecer uma confusão que eu tive.
Mesmo que a máscara de quadro seja FRAME_BODY_NED = 8
, o comando ROS ainda deve estar em ENU . A conversão ENU -> NED é feita por mavros.
Na verdade, a partir do vídeo, o comportamento é:
Oi Hoang,
Obrigado pelo seu esclarecimento.
Lamento saber que você demorou tanto.
Seus esforços ajudam outros.
Obrigado
Bo
Hoang Minh Chung [email protected]于 2018 年 8 月 17 日 周五 上午 11:09 写道 :
oi @cnpcshangbo https://github.com/cnpcshangbo , obrigado pelo vídeo.
Eu posto isso para ajudar outros a esclarecer uma confusão que eu tive.
Mesmo que a máscara de quadro seja "FRAME_BODY_NED = 8", o comando ROSainda deve estar em ENU . A conversão ENU -> NED será feita por
mavros.
Na verdade, a partir do vídeo, o comportamento é:
- x = 0,1 ---> à direita
- y = 0,1 ---> Avançar
Obviamente, ainda está em ENU. No entanto, essa confusão me custou uma semana
de puxar cabelo ...-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/mavlink/mavros/issues/792#issuecomment-413745084 ou mudo
o segmento
https://github.com/notifications/unsubscribe-auth/AEm3NdefOViosyJKxQlf2h0ZweC8lO6uks5uRjP9gaJpZM4PDCb2
.
Não deveria ser x para a frente ey para a esquerda para BODY ex para o leste, y para o norte no quadro do mapa @Nuno?
Então, estou correto que, na verdade, temos 3 convenções aqui:
1) NED: estimativa e controle PX4 a bordo
2) ENU: formato de entrada padrão para mensagens de comando mavros
3) NWU: Sistema de coordenadas típico em ROS
Não. Não há NWU no ROS.
http://www.ros.org/reps/rep-0103.html
@AlexisTM norte ou leste não deve ser usado para especificar as convenções do corpo, mas sim orientações como frente, esquerda.
OK. Mas se não estou errado, acho que ainda temos 3 convenções?
1) NED: Controle de bordo
2) Right-Forward-Up: Como os mavros entendem os pontos de ajuste brutos (velocidade)
3) Forward-Left-Up: convenção ROS
@hmchung Estamos usando pontos de ajuste de velocidade dentro do quadro do mapa e é ENU (convenção ROS)
Observe que deve haver apenas 2 convenções! NED no Pixhawk e ENU: qualquer coisa que você fizer no ROS.
Forward-Left-Up (FLU) é a convenção ROS para a estrutura do corpo. East-North-Up (ENU) é a convenção ROS para o local / quadro de palavras.
Comentários muito úteis
Para
setpoint_velocity
, adicionarei uma correção que permitirá escolher entreLOCAL_NED
eBODY_NED
, já que atualmente éLOCAL_NED
(https: / /github.com/mavlink/mavros/blob/master/mavros/src/plugins/setpoint_velocity.cpp#L81). Nesse meio tempo, você pode usarsetpoint_raw
e definircoordinate_frame
paraFRAME_BODY_NED
ouMAV_FRAME::BODY_NED
(ambos devem funcionar).