Posts da série:
8. Nós controlamos a partir do telefone-ROS Control, GPS-node7. Localização do robô: gmapping, AMCL, pontos de referência no mapa da sala6. Odometria com codificadores de roda, mapa da sala, lidar5. 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 marcha2. Software1. FerroNa ú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.xacrotags 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"> <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