Carrinho de caminhão ROS. Parte 5. Trabalhando em rviz e gazebo: xacro, novos sensores

Posts da série:
8. Nós controlamos a partir do telefone-ROS Control, GPS-node
7. Localização do robô: gmapping, AMCL, pontos de referência no mapa da sala
6. Odometria com codificadores de roda, mapa da sala, lidar
5. Trabalhamos em rviz e gazebo: xacro, novos sensores.
4. Crie uma simulação de robô usando os editores rviz e gazebo.
3. Acelere, troque a câmera, conserte a marcha
2. Software
1. Ferro

Na última vez, foram alcançados os seguintes objetivos:

  • visualize o robô criando um arquivo xacro contendo a descrição urdf do robô;
  • crie dois arquivos de inicialização, um dos quais permite colocar o robô no Gazebo do editor-simulador;
  • controle o robô no simulador do Gazebo a partir do teclado.

Neste post, organizaremos o projeto na forma de módulos xacro para que fique mais legível (anteriormente, para maior clareza, colocamos toda a descrição em um arquivo xacro). Adicione uma câmera de vídeo virtual e imu. Vamos ver como adicionar gazebo a objetos estranhos no mundo ao nosso redor.

Primeiro, verifique se o terminal está navegando pelo sistema ROS usando os comandos roscd:

roscd rosbots_description/launch 

Se não funcionar, vá para a pasta com catkin_ws e execute o comando:

 source devel/setup.bash 

Agora vamos para a pasta com a descrição do robô:

 roscd rosbots_description/launch 

No arquivo spawn.launch criado anteriormente, foi indicado o seguinte:

 <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

O comando cat foi usado para carregar o conteúdo de rosbots.xacro no parâmetro robot_description.

Para aproveitar ao máximo o formato do comando xacro, o código precisa ser ligeiramente corrigido. Substitua a linha acima pelo seguinte:

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

Agora o sistema usará o xacro.py para executar o rosbots.xacro.

As mesmas alterações serão necessárias para o segundo arquivo de inicialização - rviz.launch.

Alterar

 <param name="robot_description" command="cat '$(find rosbots_description)/urdf/rosbots.xacro'" /> 

em

 <param name="robot_description" command="$(find xacro)/xacro.py '$(find rosbots_description)/urdf/rosbots.xacro'"/> 

Verifique se tudo funciona com a nova sintaxe.

Primeiro, observe o modelo no editor rviz:

 roslaunch rosbots_description rviz.launch 

Então, fechando o rviz, verifique o gazebo.

1º terminal:

 roslaunch gazebo_ros empty_world.launch 

2º:

 roslaunch rosbots_description spawn.launch 

* Você pode ver as mensagens
cor amarela


 xacro: Traditional processing is deprecated. Switch to --inorder processing! To check for compatibility of your document, use option --check-order. For more infos, see http://wiki.ros.org/xacro#Processing_Order xacro.py is deprecated; please use xacro instead 


Eles não dão o tempo, então você não pode prestar atenção.

Então, tudo funciona como antes, só que agora o formato xacro é usado.
O que ele dá? Este formato permite reorganizar o código. À medida que o projeto cresce, isso possibilita navegar melhor no futuro.

Trabalhando com xacro


Agora é hora de dividir o rosbots.xacro em suas partes constituintes e tirar proveito do xacro.

Mova tudo sobre o editor de gazebo (tags de gazebo) de rosbots.xacro para um novo arquivo.
Crie o arquivo rosbots.gazebo.xacro na pasta urdf:

 nano rosbots.gazebo.xacro 

E coloque o código lá:

rosbots.gazebo.xacro
 <?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="rosbots" > <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <legacyMode>false</legacyMode> <alwaysOn>true</alwaysOn> <publishWheelTF>true</publishWheelTF> <publishTf>1</publishTf> <publishWheelJointState>true</publishWheelJointState> <updateRate>100.0</updateRate> <leftJoint>wheel_left_joint</leftJoint> <rightJoint>wheel_right_joint</rightJoint> <wheelSeparation>1.1</wheelSeparation> <wheelDiameter>0.52</wheelDiameter> <wheelAcceleration>1.0</wheelAcceleration> <torque>20</torque> <commandTopic>/part2_cmr/cmd_vel</commandTopic> <odometryTopic>odom</odometryTopic> <odometryFrame>odom</odometryFrame> <robotBaseFrame>base_link</robotBaseFrame> </plugin> </gazebo> </robot> 


O mesmo código na tag
 <gazebo> </gazebo> 
excluir do arquivo rosbots.xacro.

Agora vamos anexar o arquivo recém-criado ao rosbots.xacro. De algum lugar, as mesmas informações sobre o componente gazebo do rosbots.xacro devem ser recebidas!

Portanto, adicione ao rosbots.xacro:

 <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" /> 

Insira esta linha após a linha com a tag
 <robot> 
. Agora, o início do arquivo fica assim:

 <robot name="rosbots" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find rosbots_description)/urdf/rosbots.gazebo.xacro" /> 

Verifique novamente se tudo funciona no novo formato:

1º terminal:

 roslaunch gazebo_ros empty_world.launch 

2º:

 roslaunch rosbots_description spawn.launch 

Assim, para o usuário, tudo permanece em seu lugar em termos de lançamento do modelo na simulação, os comandos são os mesmos.

Adicione novos sensores


Agora que o projeto adotou uma aparência mais ou menos estruturada, anexaremos sensores adicionais.

Para não sobrecarregar o robô com “kits corporais”, adicionamos apenas dois sensores: uma câmera e imu (módulo de medição inercial ou giroscópio).

Para esses fins, você precisará corrigir os arquivos rosbots.xacro e rosbots.gazebo.xacro.

Vamos começar com a câmera e o arquivo rosbots.xacro. Para que tudo dê certo, para o sensor, você precisa adicionar:

  • comunicação (link). Será representado por um arquivo dae.
  • articulação, que conectará a câmera ao corpo do robô.

Em outro arquivo - rosbots.gazebo.xacro - adicionaremos:

  • um plug-in que detectará o link criado acima como um sensor.

Colocamos em rosbots.xacro dentro da tag (por conveniência, você pode adicioná-lo no final):

rosbots.xacro
 <joint name="camera_joint" type="fixed"> <origin xyz="0.49 -0.03 0.75" rpy="0 0.21 0" /> <parent link="base_link"/> <child link="camera_link" /> </joint> <link name="camera_link"> <visual> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </visual> <collision> <geometry> <mesh filename="package://rosbots_description/meshes/camera.dae" scale="4.0 4.0 4.0"/> </geometry> <origin xyz="0.0 0 0" rpy="0 0 0"/> </collision> </link> 


O código acima adiciona link e junta à nossa câmera, permitindo que ela seja visualizada.

Veja isso.

1º terminal:

 roslaunch gazebo_ros empty_world.launch 

2º:

 roslaunch rosbots_description spawn.launch 

Se tudo estiver correto, você poderá ver a câmera adicionada no robô (branco):



Parece que tudo é simples. No entanto, deve-se entender que apenas a visualização da câmera foi adicionada. Como esta câmera se comportará no mundo das coisas físicas ainda não está claro. O comportamento dela é indefinido. A câmera ainda não é capaz de tirar fotos ou gravar vídeos.

É a vez de trabalhar no arquivo com o gazebo.

Adicionar a

rosbots.gazebo.xacro
tags internas

 <robot> </robot> 

adicionar:

 <gazebo reference="camera_link"> <sensor type="camera" name="camera1"> <update_rate>30.0</update_rate> <camera name="head"> <horizontal_fov>1.04</horizontal_fov> <image> <width>320</width> <height>240</height> <format>R8G8B8</format> </image> <clip> <near>0.1</near> <far>50</far> </clip> </camera> <plugin name="camera_controller" filename="libgazebo_ros_camera.so"> <alwaysOn>true</alwaysOn> <updateRate>0</updateRate> <cameraName>camera1</cameraName> <imageTopicName>image_raw</imageTopicName> <cameraInfoTopicName>camera_info</cameraInfoTopicName> <frameName>camera</frameName> <hackBaseline>0.07</hackBaseline> <distortionK1>0.0</distortionK1> <distortionK2>0.0</distortionK2> <distortionK3>0.0</distortionK3> <distortionT1>0.0</distortionT1> <distortionT2>0.0</distortionT2> </plugin> </sensor> </gazebo> 


Como é fácil adivinhar no código, determinamos os parâmetros da câmera:

  • update_rate: com que frequência os dados chegarão
  • largura / altura: resolução das fotos. Nesse caso, 320 x 240.
  • formato: formato de vídeo (R8G8B8).
  • imageTopicName: o nome do tópico para o qual os dados serão enviados
  • frameName: link-link ao qual a câmera será conectada.

Agora tudo está pronto para visualizar a câmera e sua simulação.

Se você agora reiniciar a simulação e ver a lista de tópicos, poderá ver que, entre eles, os tópicos gerados pela câmera foram adicionados:

 rostopic list 

 /rosbots/camera1/camera_info /rosbots/camera1/image_raw /rosbots/camera1/image_raw/compressed /rosbots/camera1/image_raw/compressed/parameter_descriptions /rosbots/camera1/image_raw/compressed/parameter_updates /rosbots/camera1/image_raw/compressedDepth /rosbots/camera1/image_raw/compressedDepth/parameter_descriptions /rosbots/camera1/image_raw/compressedDepth/parameter_updates /rosbots/camera1/image_raw/theora /rosbots/camera1/image_raw/theora/parameter_descriptions /rosbots/camera1/image_raw/theora/parameter_updates /rosbots/camera1/parameter_descriptions /rosbots/camera1/parameter_updates 

Existe todo um arsenal de tópicos! Mas, como regra, nem todos são usados ​​com tanta frequência, exceto os três primeiros.

Imagem em rviz do simulador de gazebo


* aqui, observe que na configuração atual da imagem para o gazebo da VMWare Workstation falha quando você tenta iniciar a transmissão para o rviz a partir de uma câmera de vídeo virtual. Uma possível solução é indicada no final do post na seção de erros.

Para maior clareza, ao trabalhar com a câmera na simulação, execute o rviz e coloque algum objeto na frente do robô.

Para fazer isso, primeiro você precisa do próprio objeto, que será adicionado ao gazebo.

Faça o download do arquivo object.urdf e coloque-o em ~ / catkin_ws / src /

Vamos correr.

1º terminal:

 roslaunch gazebo_ros empty_world.launch 

2º (coloque os modelos):

 rosrun gazebo_ros spawn_model -file /home/pi/catkin_ws/src/object.urdf -urdf -x 1 -y 0 -z 1 -model my_object 

 roslaunch rosbots_description spawn.launch 

Na simulação, temos a seguinte imagem:



Um modelo de robô e uma postagem que também foram adicionados como modelo.

Os itens podem ser adicionados ao editor de gazebo de maneira mais simples a partir da guia dentro do editor de inserção:



Agora vamos ver o que o robô vê.

Sem fechar os dois terminais anteriores, execute o rviz com a descrição do robô:

 roslaunch rosbots_description rviz.launch 

E adicione um novo monitor chamado "Imagem":



Uma nova tela com uma imagem da câmera será exibida e ... o editor do gazebo será exibido.

Infelizmente, ao trabalhar em uma máquina virtual com uma imagem VMWare, adicionar uma transmissão de uma câmera virtual resulta em um erro.

Se o trabalho não for realizado em uma máquina virtual, mas em uma máquina real, obteremos uma imagem de uma câmera virtual no gazebo com a imagem de uma figura de coluna:



Agora vamos adicionar IMU ao modelo.

IMU (giroscópio)


O processo de adição de imu é semelhante ao de adicionar uma câmera.

Primeiro, abra rosbots.gazebo.xacro e faça

código
 <gazebo> <plugin name="gazebo_ros_imu_controller" filename="libgazebo_ros_imu.so"> <!-- <robotNamespace></robotNamespace> --> <topicName>imu/data</topicName> <serviceName>imu/service</serviceName> <bodyName>base_link</bodyName> <gaussianNoise>0</gaussianNoise> <rpyOffsets>0 0 0</rpyOffsets> <updateRate>30.0</updateRate> <alwaysOn>true</alwaysOn> <gaussianNoise>0</gaussianNoise> </plugin> </gazebo> 


Nós adicionaremos esse código, bem como o código da câmera adicionada, na tag

  <robot></robot> 

Como não é difícil adivinhar a partir do código, ele publicará os dados no tópico / imu / data.

Agora, se você recolocar o modelo do robô no gazebo e executar o comando: rostopic list no terminal vizinho, poderá ver o tópico com dados imu, entre outros:



Você também pode dar uma olhada no que ele publica executando o comando:

 rostopic echo /imu/data -n1 



Em suma, o imu publica as seguintes informações:

  • orientação: a orientação do robô ao longo dos eixos x, y, z ew.
  • angular_velocity: velocidade angular do robô.
  • aceleração linear: aceleração linear.

Houve um pequeno toque

.
Adicione a rosbots.gazebo.xacro tudo também está dentro da tag

código
 <gazebo reference="wheel_left_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="wheel_right_link"> <mu1>1.0</mu1> <mu2>1.0</mu2> <kp>1000000.0</kp> <kd>100.0</kd> <minDepth>0.001</minDepth> <maxVel>1.0</maxVel> </gazebo> <gazebo reference="base_link"> <material>Gazebo/Blue</material> <mu1>0.3</mu1> <mu2>0.3</mu2> <sensor type="contact" name="bumpers"> <always_on>1</always_on> <update_rate>50.0</update_rate> <visualize>true</visualize> <contact> <collision>base_footprint_collision_base_link</collision> </contact> </sensor> </gazebo> <gazebo reference="camera_link"> <mu1>0.2</mu1> <mu2>0.2</mu2> </gazebo> 


Este código determinará parâmetros adicionais do robô: coeficientes de atrito para rodas, cores no gazebo, sensor de contato. O sensor de contato será acionado imediatamente após o pára-choques do robô tocar no obstáculo.

Agora reinicie o gazebo, coloque o modelo e, em rviz, adicione imu display como antes, adicione display com uma câmera:



Se tudo correu bem, veremos que imu está postando no tópico.

Em conclusão, controlaremos o robô na simulação e veremos como os dados mudam com imu:

1º terminal:

 roslaunch gazebo_ros empty_world.launch 

2º:

 roslaunch rosbots_description spawn.launch 

 roslaunch rosbots_description rviz.launch 

3º:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel 


Possíveis erros durante a operação :

1. O modelo do robô não aparece no gazebo (o pacote [rosbots_description] não possui um caminho) - feche o gazebo, execute a fonte devel / setup.bash no terminal, reinicie o gazebo.
2)

 gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: virtual void Ogre::RenderSystem::setDepthBufferFor(Ogre::RenderTarget*): Assertion `bAttached && "A new DepthBuffer for a RenderTarget was created, but after creation" "it says it's incompatible with that RT"' failed. Aborted (core dumped) 

Solução possível (não testada):

 https://bitbucket.org/osrf/gazebo/issues/1837/vmware-rendering-z-ordering-appears-random 

Source: https://habr.com/ru/post/pt467665/


All Articles