Kinect 360 ubuntu 18.04 bionic ROS test

Teste Kinect 360 no ubuntu 18.04 bionic com ROS

Para ligar a Microsoft Kinect 360 ao computador é necessário ter um adaptador que consiste num transformador, um connector (onde vai ligar o cabo da Kinect 360) e um cabo com USB que sai da caixa do connector e vai ligar a uma porta USB no computador.

dav

Os testes foram efectuados num portatil Lenovo IdeaPad S145, com o Linux Ubuntu Bionic (18.04)

Informações sobre a distro

~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.4 LTS
Release: 18.04
Codename: bionic

Informações sobre o kernel

~$ uname -a
Linux ideapad 5.4.0-66-generic #74~18.04.2-Ubuntu SMP Fri Feb 5 11:17:31 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Informções USB da Kinect 360

~$ lsusb
Bus 001 Device 010: ID 045e:02ae Microsoft Corp. Xbox NUI Camera
Bus 001 Device 008: ID 045e:02b0 Microsoft Corp. Xbox NUI Motor
Bus 001 Device 009: ID 045e:02ad Microsoft Corp. Xbox NUI Audio

 

Exploração da Kinect 360 no linux sem o ROS

Podemos explorar a kinect fora do ros com o pacote libfreenect-bin. Este pacote pode ser instalado usando o apt.

Instalação no ubuntu do libfreenect-bin, ou do freenect, que o inclui.

sudo apt install freenect

Depois de instalado podemos executar um programa de exploração da kinect 360.

~$ freenect-glview

Este comando apresenta uma janela com a imagem da deep camera do lado esquerdo e uma imagem da camara rgb do lado direito.

Além disso permite controlar alguns aspectos da kinect, nomeadamente o controlo da inclinação. Os comandos disponiveis são os seguintes:

‘w’ – tilt up, ‘s’ – level, ‘x’ – tilt down,
‘0’-‘6’ – select LED mode,
‘+’ & ‘-‘ – change IR intensity
‘f’ – change video format, ‘m’ – mirror video,
‘o’ – rotate video with accelerometer
‘e’ – auto exposure, ‘b’ – white balance,
‘r’ – raw color, ‘n’ – near mode (K4W only)

Saida na consola após a execução do comando

Kinect camera test
Number of devices found: 1
GL thread
[Stream 70] Negotiated packet size 1920
write_register: 0x0105 <= 0x00
write_register: 0x0006 <= 0x00
write_register: 0x0012 <= 0x03
write_register: 0x0013 <= 0x01
write_register: 0x0014 <= 0x1e
write_register: 0x0006 <= 0x02
write_register: 0x0017 <= 0x00
[Stream 80] Negotiated packet size 1920
write_register: 0x000c <= 0x00
write_register: 0x000d <= 0x01
write_register: 0x000e <= 0x1e
write_register: 0x0005 <= 0x01
[Stream 70] Lost 240 total packets in 0 frames (inf lppf)
[Stream 70] Lost 270 total packets in 0 frames (inf lppf)
write_register: 0x0047 <= 0x00
(...)

A exploração do audio pode ser efectuada com o comando:

freenect-micview

No entanto o teste, conforme se pode verificar nas mensagens exibidas abaixo, correu mal.

~$ freenect-micview
Number of devices found: 1
Trying to open ./audios.bin as firmware...
Trying to open /home/inaciose/.libfreenect/audios.bin as firmware...
Trying to open /usr/local/share/libfreenect/audios.bin as firmware...
Trying to open /usr/share/libfreenect/audios.bin as firmware...
Trying to open ./../Resources/audios.bin as firmware...
upload_firmware: failed to find firmware file.
upload_firmware failed: -2
This is the libfreenect microphone waveform viewer. Press 'q' to quit or spacebar to pause/unpause the view.
audio: invalid magic in iso IN packet: 00000000

Pelos vistos o problema é que não consegue encontrar o ficheiro com o firmware (audios.bin).

Uma pesquisa na web referiu a necessidade de executar o scritp fwfetcher.py para gerar o ficheiro audio.bin, que posteriormente deve ser copiado para uma das localizações acima.

Tentei resolver o assunto instalando o pacote python-freenect com o seguinte comando, mas não resolveu.

sudo apt install python-freenect

Terei que pesquisar melhor este assunto mais tarde.

 

Exploração da Kinect 360 no ROS

As potencialidades da kinect 360 podem ser exploradas no ros com uma coleção de pacotes que podem ser instalados com o apt.

Pelos vistos existem há pelo menos duas soluções para a integração da kinect 360 no ROS melodic, uma baseada no openni e outra no freenect.

  • openni
    http://wiki.ros.org/openni_camera
    http://wiki.ros.org/openni_launch
  • freenect-stack
    http://wiki.ros.org/freenect_stack
    ros-melodic-freenect-stack

Numa primeira parte descrevo a instalação e a exploração da solução openni, que era a que conhecia.

Kinect 360 com o ros openni no ubuntu bionic

A instalação do ros openni no ubuntu  pode ser feita com o apt.

sudo apt-get install ros-melodic-vision-opencv
sudo apt-get install ros-melodic-openni-launch
sudo apt-get install ros-melodic-openni-camera
sudo apt-get install ros-melodic-rgbd-launch

Nas minhas experiencias anteriores tinha instalado o pacote freenect para o ros, no entanto o pacote libfreenect para o ros melodic não está disponvel no ubunto bionic. pelo menos quando o tentamos instalar com o comando:

sudo apt install ros-melodic-libfreenect

Aparece o seguinte erro:

E: Unable to locate package ros-melodic-libfreenect

Pelos vistos, e conforme exibido na pagina do pacote, o pacote libfreenect está apenas disponivel para o ros Kinectic.

http://wiki.ros.org/libfreenect

A pesquisa dos pacotes disponiveis cujo nome inclui libfreenect revelou algumas opções

apt search libfreenect

As opções a considerar foram as seguintes.

ros-melodic-freenect-camera
ros-melodic-freenect-stack

No entanto a descrição ‘A libfreenect-based ROS driver for the Microsoft Kinect’ é exactamente nas duas o que não ajuda muito, mas ambos tem uma página que os descreve na wiki do ROS, que já referi acima, e nela descobri que o freenect-camera faz parte do freenect-stack.

Indeciso sobre se devia instalar o pacote libfreenect-stack, resolvi experimentar se o seguinte comando funcionava (e funcionou).

roslaunch openni_launch openni.launch

O comando devolve algumas informações sobre a kinect e publicando alguns topicos que podem ser usados no rviz

[ INFO] [1615640624.323407153]: Number devices connected: 1
[ INFO] [1615640624.323701914]: 1. device on bus 001:10 is a SensorV2 (2ae) from PrimeSense (45e) with serial id 'A00361A02199045A'
[ INFO] [1615640624.324962821]: Searching for device with index = 1
[ INFO] [1615640624.372737787]: Opened 'SensorV2' on bus 1:10 with serial number 'A00361A02199045A'
[ INFO] [1615640624.406604267]: rgb_frame_id = 'camera_rgb_optical_frame'
[ INFO] [1615640624.406676036]: depth_frame_id = 'camera_depth_optical_frame'
[ WARN] [1615640624.412769205]: Camera calibration file /home/inaciose/.ros/camera_info/rgb_A00361A02199045A.yaml not found.
[ WARN] [1615640624.412859410]: Using default parameters for RGB camera calibration.
[ WARN] [1615640624.412937672]: Camera calibration file /home/inaciose/.ros/camera_info/depth_A00361A02199045A.yaml not found.
[ WARN] [1615640624.412998888]: Using default parameters for IR camera calibration.

 

Kinect 360 com openni no rviz

A exploração da kinect 360 no rviz pode ser efectuada recorrendo aos seguintes displays:

  • Image
  • Camera
  • Pointcloud2
  • DeepCloud

Os dois ultimos displays, têm configurações para atribuir cores aos pontos, sobreposição de imagem com a camera rgb, etc.

ros-melodic-freenect-stack
Numa primeira parte descrevo a instalação e a exploração da solução openni, que era a que conhecia.

Kinect 360 com o ros freenect-stack no ubuntu bionic

Nesta segunda parte descrevo a instalação e a exploração da soluçãofreenect-stack, que no decorrer deste processo me apercebi que é uma alternativa a solução baseada em openni.

A instalação do software necessário no ros é efectuada com o apt

sudo ros-melodic-freenect-stack

Decidi não instalar neste computador. Eventualmente vou tentar a instalação mais tarde no ros noetic.

Apendice

Tópicos publicados pelos programas lançados pelo comando:

roslaunch openni_launch openni.launch

Lista de tópicos

~$ rostopic list
/camera/depth/camera_info
/camera/depth/disparity
/camera/depth/image
/camera/depth/image/compressed
/camera/depth/image/compressed/parameter_descriptions
/camera/depth/image/compressed/parameter_updates
/camera/depth/image/compressedDepth
/camera/depth/image/compressedDepth/parameter_descriptions
/camera/depth/image/compressedDepth/parameter_updates
/camera/depth/image/theora
/camera/depth/image/theora/parameter_descriptions
/camera/depth/image/theora/parameter_updates
/camera/depth/image_raw
/camera/depth/image_raw/compressed
/camera/depth/image_raw/compressed/parameter_descriptions
/camera/depth/image_raw/compressed/parameter_updates
/camera/depth/image_raw/compressedDepth
/camera/depth/image_raw/compressedDepth/parameter_descriptions
/camera/depth/image_raw/compressedDepth/parameter_updates
/camera/depth/image_raw/theora
/camera/depth/image_raw/theora/parameter_descriptions
/camera/depth/image_raw/theora/parameter_updates
/camera/depth/image_rect
/camera/depth/image_rect/compressed
/camera/depth/image_rect/compressed/parameter_descriptions
/camera/depth/image_rect/compressed/parameter_updates
/camera/depth/image_rect/compressedDepth
/camera/depth/image_rect/compressedDepth/parameter_descriptions
/camera/depth/image_rect/compressedDepth/parameter_updates
/camera/depth/image_rect/theora
/camera/depth/image_rect/theora/parameter_descriptions
/camera/depth/image_rect/theora/parameter_updates
/camera/depth/image_rect_raw
/camera/depth/image_rect_raw/compressed
/camera/depth/image_rect_raw/compressed/parameter_descriptions
/camera/depth/image_rect_raw/compressed/parameter_updates
/camera/depth/image_rect_raw/compressedDepth
/camera/depth/image_rect_raw/compressedDepth/parameter_descriptions
/camera/depth/image_rect_raw/compressedDepth/parameter_updates
/camera/depth/image_rect_raw/theora
/camera/depth/image_rect_raw/theora/parameter_descriptions
/camera/depth/image_rect_raw/theora/parameter_updates
/camera/depth/points
/camera/depth_rectify_depth/parameter_descriptions
/camera/depth_rectify_depth/parameter_updates
/camera/depth_registered/camera_info
/camera/depth_registered/disparity
/camera/depth_registered/hw_registered/image_rect
/camera/depth_registered/hw_registered/image_rect/compressed
/camera/depth_registered/hw_registered/image_rect/compressed/parameter_descriptions
/camera/depth_registered/hw_registered/image_rect/compressed/parameter_updates
/camera/depth_registered/hw_registered/image_rect/compressedDepth
/camera/depth_registered/hw_registered/image_rect/compressedDepth/parameter_descriptions
/camera/depth_registered/hw_registered/image_rect/compressedDepth/parameter_updates
/camera/depth_registered/hw_registered/image_rect/theora
/camera/depth_registered/hw_registered/image_rect/theora/parameter_descriptions
/camera/depth_registered/hw_registered/image_rect/theora/parameter_updates
/camera/depth_registered/hw_registered/image_rect_raw
/camera/depth_registered/hw_registered/image_rect_raw/compressed
/camera/depth_registered/hw_registered/image_rect_raw/compressed/parameter_descriptions
/camera/depth_registered/hw_registered/image_rect_raw/compressed/parameter_updates
/camera/depth_registered/hw_registered/image_rect_raw/compressedDepth
/camera/depth_registered/hw_registered/image_rect_raw/compressedDepth/parameter_descriptions
/camera/depth_registered/hw_registered/image_rect_raw/compressedDepth/parameter_updates
/camera/depth_registered/hw_registered/image_rect_raw/theora
/camera/depth_registered/hw_registered/image_rect_raw/theora/parameter_descriptions
/camera/depth_registered/hw_registered/image_rect_raw/theora/parameter_updates
/camera/depth_registered/image
/camera/depth_registered/image/compressed
/camera/depth_registered/image/compressed/parameter_descriptions
/camera/depth_registered/image/compressed/parameter_updates
/camera/depth_registered/image/compressedDepth
/camera/depth_registered/image/compressedDepth/parameter_descriptions
/camera/depth_registered/image/compressedDepth/parameter_updates
/camera/depth_registered/image/theora
/camera/depth_registered/image/theora/parameter_descriptions
/camera/depth_registered/image/theora/parameter_updates
/camera/depth_registered/image_raw
/camera/depth_registered/image_raw/compressed
/camera/depth_registered/image_raw/compressed/parameter_descriptions
/camera/depth_registered/image_raw/compressed/parameter_updates
/camera/depth_registered/image_raw/compressedDepth
/camera/depth_registered/image_raw/compressedDepth/parameter_descriptions
/camera/depth_registered/image_raw/compressedDepth/parameter_updates
/camera/depth_registered/image_raw/theora
/camera/depth_registered/image_raw/theora/parameter_descriptions
/camera/depth_registered/image_raw/theora/parameter_updates
/camera/depth_registered/points
/camera/depth_registered/sw_registered/camera_info
/camera/depth_registered/sw_registered/image_rect
/camera/depth_registered/sw_registered/image_rect/compressed
/camera/depth_registered/sw_registered/image_rect/compressed/parameter_descriptions
/camera/depth_registered/sw_registered/image_rect/compressed/parameter_updates
/camera/depth_registered/sw_registered/image_rect/compressedDepth
/camera/depth_registered/sw_registered/image_rect/compressedDepth/parameter_descriptions
/camera/depth_registered/sw_registered/image_rect/compressedDepth/parameter_updates
/camera/depth_registered/sw_registered/image_rect/theora
/camera/depth_registered/sw_registered/image_rect/theora/parameter_descriptions
/camera/depth_registered/sw_registered/image_rect/theora/parameter_updates
/camera/depth_registered/sw_registered/image_rect_raw
/camera/depth_registered/sw_registered/image_rect_raw/compressed
/camera/depth_registered/sw_registered/image_rect_raw/compressed/parameter_descriptions
/camera/depth_registered/sw_registered/image_rect_raw/compressed/parameter_updates
/camera/depth_registered/sw_registered/image_rect_raw/compressedDepth
/camera/depth_registered/sw_registered/image_rect_raw/compressedDepth/parameter_descriptions
/camera/depth_registered/sw_registered/image_rect_raw/compressedDepth/parameter_updates
/camera/depth_registered/sw_registered/image_rect_raw/theora
/camera/depth_registered/sw_registered/image_rect_raw/theora/parameter_descriptions
/camera/depth_registered/sw_registered/image_rect_raw/theora/parameter_updates
/camera/depth_registered_rectify_depth/parameter_descriptions
/camera/depth_registered_rectify_depth/parameter_updates
/camera/driver/parameter_descriptions
/camera/driver/parameter_updates
/camera/ir/camera_info
/camera/ir/image_raw
/camera/ir/image_raw/compressed
/camera/ir/image_raw/compressed/parameter_descriptions
/camera/ir/image_raw/compressed/parameter_updates
/camera/ir/image_raw/compressedDepth
/camera/ir/image_raw/compressedDepth/parameter_descriptions
/camera/ir/image_raw/compressedDepth/parameter_updates
/camera/ir/image_raw/theora
/camera/ir/image_raw/theora/parameter_descriptions
/camera/ir/image_raw/theora/parameter_updates
/camera/ir/image_rect_ir
/camera/ir/image_rect_ir/compressed
/camera/ir/image_rect_ir/compressed/parameter_descriptions
/camera/ir/image_rect_ir/compressed/parameter_updates
/camera/ir/image_rect_ir/compressedDepth
/camera/ir/image_rect_ir/compressedDepth/parameter_descriptions
/camera/ir/image_rect_ir/compressedDepth/parameter_updates
/camera/ir/image_rect_ir/theora
/camera/ir/image_rect_ir/theora/parameter_descriptions
/camera/ir/image_rect_ir/theora/parameter_updates
/camera/ir_rectify_ir/parameter_descriptions
/camera/ir_rectify_ir/parameter_updates
/camera/projector/camera_info
/camera/rgb/camera_info
/camera/rgb/image_color
/camera/rgb/image_color/compressed
/camera/rgb/image_color/compressed/parameter_descriptions
/camera/rgb/image_color/compressed/parameter_updates
/camera/rgb/image_color/compressedDepth
/camera/rgb/image_color/compressedDepth/parameter_descriptions
/camera/rgb/image_color/compressedDepth/parameter_updates
/camera/rgb/image_color/theora
/camera/rgb/image_color/theora/parameter_descriptions
/camera/rgb/image_color/theora/parameter_updates
/camera/rgb/image_mono
/camera/rgb/image_mono/compressed
/camera/rgb/image_mono/compressed/parameter_descriptions
/camera/rgb/image_mono/compressed/parameter_updates
/camera/rgb/image_mono/compressedDepth
/camera/rgb/image_mono/compressedDepth/parameter_descriptions
/camera/rgb/image_mono/compressedDepth/parameter_updates
/camera/rgb/image_mono/theora
/camera/rgb/image_mono/theora/parameter_descriptions
/camera/rgb/image_mono/theora/parameter_updates
/camera/rgb/image_raw
/camera/rgb/image_raw/compressed
/camera/rgb/image_raw/compressed/parameter_descriptions
/camera/rgb/image_raw/compressed/parameter_updates
/camera/rgb/image_raw/compressedDepth
/camera/rgb/image_raw/compressedDepth/parameter_descriptions
/camera/rgb/image_raw/compressedDepth/parameter_updates
/camera/rgb/image_raw/theora
/camera/rgb/image_raw/theora/parameter_descriptions
/camera/rgb/image_raw/theora/parameter_updates
/camera/rgb/image_rect_color
/camera/rgb/image_rect_color/compressed
/camera/rgb/image_rect_color/compressed/parameter_descriptions
/camera/rgb/image_rect_color/compressed/parameter_updates
/camera/rgb/image_rect_color/compressedDepth
/camera/rgb/image_rect_color/compressedDepth/parameter_descriptions
/camera/rgb/image_rect_color/compressedDepth/parameter_updates
/camera/rgb/image_rect_color/theora
/camera/rgb/image_rect_color/theora/parameter_descriptions
/camera/rgb/image_rect_color/theora/parameter_updates
/camera/rgb/image_rect_mono
/camera/rgb/image_rect_mono/compressed
/camera/rgb/image_rect_mono/compressed/parameter_descriptions
/camera/rgb/image_rect_mono/compressed/parameter_updates
/camera/rgb/image_rect_mono/compressedDepth
/camera/rgb/image_rect_mono/compressedDepth/parameter_descriptions
/camera/rgb/image_rect_mono/compressedDepth/parameter_updates
/camera/rgb/image_rect_mono/theora
/camera/rgb/image_rect_mono/theora/parameter_descriptions
/camera/rgb/image_rect_mono/theora/parameter_updates
/camera/rgb_debayer/parameter_descriptions
/camera/rgb_debayer/parameter_updates
/camera/rgb_rectify_color/parameter_descriptions
/camera/rgb_rectify_color/parameter_updates
/camera/rgb_rectify_mono/parameter_descriptions
/camera/rgb_rectify_mono/parameter_updates
/rosout
/rosout_agg
/tf
/tf_static

 

Instructions for kinect 360 in ros noethic

Give your next Robot 3D vision: Kinect V1 with ROS Noetic

rospibot6

Pacote ROS para controlar base de robot móvel de propulsão diferencial com um RaspberryPi e um STM32F.

https://github.com/inaciose/rospibot6

O pacote do ROS inclui o seguinte software:

  • O node base que comunica por I2C com o  microcontrolador STM32F
  • Vários nodes em Python que implementam isoladamente algumas das funções incluídas no node base.
  • Conjuntos de  launch files e yaml com parâmetros de exemplo para a exploração da base em tarefas de navegação autónoma.

O node base depende do software para o microcontrolador STM32F.

O node base foi pensado para ser monolítico e incluir nele várias funções que podem estar dispersas por vários módulos.

  • twist_diff
  • pid controler
  • IMU MPU6050
  • odometria
  • interface de LCD e botões
  • interface MCU ROS

No entanto, apesar de todos estas funções estarem implementadas, até este momento momento as tarefas de navegação bem sucedidas fizeram uso dos node externo para a odometria e do controlo pid existente no microcontrolador,

Enumerando as funcionalidades no node base e o seu estado

O componente twist_diff que faz a conversão das velocidades expressas nas mensagens twist para as velocidades que cada um das duas rodas deve ter está a funcionar e a ser usado (se bem que foi desenhado de forma diferente da implementação do chefbot)

O pid controler tanto quanto me lembro está a funcionar, mas não está a ser usado.

O IMU está funcional e foi objeto de testes bem sucedidos com o pacote robot_pose_ekf.

A odometria, está implementada mas tanto quanto me lembro tem problemas e não está a ser usada, pois os robots estão a usar um node externo.

O interface de LCD e botões está funcional mas não está a ser usado, porque nenhum dos robots atuais tem o hardware necessário.

O interface MCU ROS está a funcionar.

O software para o microcontrolador STM32F será uma das versões disponíveis no seguinte repositório.

https://github.com/inaciose/rospibot6mcu

Sem uma averiguação mais detalhada o programa adequado deve ser um destes dois:

  • rospibot6_stm32d_v4
  • rospibot6_stm32d_v4d

A principal diferença entre estes dois programas é que o v4d faz uso de dois interrupts, um por cada canal do encoder , o que me faz apostar que este seja o programa adequado pois os pulsos por rotação que estão definidos nos parâmetros do node base são bastante elevados.

 

Pacote do ROS para calibrar o MPU6050

O pacote de calibração do MPU6050 está disponivel no seguinte endereço:

https://github.com/inaciose/ros_mpu6050_calibration

As instruções para instalar e usar estão no github.

Descrição do contexto que deu origem ao desenvolvimento do pacoteros_mpu6050_calibration.

Tenho estado a tentar fazer a fusão dos dados do IMU com a odometria usando o pacote robot_pose_ekf.

http://wiki.ros.org/robot_pose_ekf

O teste que efectuei não deu bons resultados, pois o resultado da fusão dos dados do IMU com a odometria, é uma pose completamente diferente daquela que é dada pela odometria e indubitavelmente de muito má qualidade.
Direi mesmo que o resultado no teste efectuado foi uma evolução da pose completamente divergente.

A represestação no rviz é feita com o visualização da: PoseWithCovariance tendo como fonte o topico: /robot_pose_ekf/odom_combined

O resultado deste teste pode ser obervado no seguinte video.

Após ter usado o programa para calibrar o mpu6050, e ter incluido na configuração do node adequado os offsets indicados nos parametros de configuração do mpu6050, efectuei outro teste e o resultado foi mais animador. Conforme se pode observar no seguinte video, a seta vermelha já não aponta para cima, nem diverge com o movimento do robot.

Outra coisa reparei foi que a visualização no topico imu/data, que antes da calibração dava uma seta enorme a apontar para a frente direita do robot e inclinada para cima, agora aparece uma seta ao principio que rapidamente desaparece.

https://github.com/inaciose/ros_mpu6050_calibration

Preparar um sdcard com o rospibot6

webid#sdcard0703

Download da imagem em:

https://downloads.ubiquityrobotics.com/pi.html

Gravar num sdcard

Fazer o login (password: ubuntu), ssh ubuntu@10.42.0.1

Trocar a password

locale-gen pt_PT.UTF-8

locale-gen en_US.UTF-8

sudo apt update (optional: sudo apt upgrade)

sudo systemctl disable magni-base (o serviço roscore continua a funcionar)

trocar o hostname, https://www.cyberciti.biz/faq/ubuntu-change-hostname-command/

pifi add sid password

reboot

Bibliotecas Instaladas

INSTALL I2Cdevlib:

sudo mkdir -p /usr/share/arduino/libraries cd /usr/share/arduino/libraries
sudo git clone https://github.com/chrisspen/i2cdevlib.git

 

INSTALL Bcm2835:

cd /tmp
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz 
tar zxvf bcm2835-1.50.tar.gz 
cd bcm2835-1.50 
./configure 
make 
sudo make check 
sudo make install

 

Pacotes ros instalados

sudo apt-get install ros-kinetic-xv-11-laser-driver

sudo apt-get install ros-kinetic-gmapping

sudo apt-get install ros-kinetic-amcl

sudo apt-get install ros-kinetic-dwa-local-planner

sudo apt install ros-kinetic-robot-pose-ekf

 

Instalar o pacote do rospibot6

catkin_make (compilar)

 

sudo bash -c “source /opt/ros/kinetic/setup.bash; source /home/ubuntu/catkin_ws/devel/setup.bash; roslaunch rospibot6 robot6.launch”

rostopic pub –once cmd std_msgs/Int16 “data: 3”

roslaunch rospibot6 teleop.launch

 

ros robot rover m1p1 – explorar a configuração antiga – entrada #m1p1t001

 

Comando de carregamento do software de controlo:

sudo bash -c “source /opt/ros/kinetic/setup.bash; source /home/ubuntu/catkin_ws/devel/setup.bash; roslaunch rospibot6 robot6.launch”

rospibot6 robot6.launch

Do log na consola destacam-se as seguintes mensagens:

Loading from pre-hydro parameter style

Laser is mounted upwards.

 

[ INFO] [1614954351.703713600]: Loading from pre-hydro parameter style
[ INFO] [1614954352.083740469]: Using plugin “static_layer”
[ INFO] [1614954352.229455264]: Requesting the map…
[ INFO] [1614985753.616958789]: send mcu cmd
[ INFO] [1614985755.049768675]: Laser is mounted upwards.
-maxUrange 4.99 -maxUrange 4.99 -sigma 0.05 -kernelSize 1 -lstep 0.05 -lobsGain 3 -astep 0.05
-srr 0.01 -srt 0.02 -str 0.01 -stt 0.02
-linearUpdate 0 -angularUpdate 0 -resampleThreshold 0.5
-xmin -20 -xmax 20 -ymin -20 -ymax 20 -delta 0.05 -particles 30
[ INFO] [1614985755.072079669]: Initialization complete
update frame 0
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 0
Registering First Scan
[ INFO] [1614985755.273691631]: Resizing costmap to 800 X 800 at 0.050000 m/pix
update frame 1
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 1
[ INFO] [1614985755.365691798]: Received a 800 X 800 map at 0.050000 m/pix
[ INFO] [1614985755.412055813]: Using plugin “obstacle_layer”
[ INFO] [1614985755.445002460]: Subscribed to Topics: scan
[ INFO] [1614985755.889149682]: Using plugin “inflation_layer”
[ INFO] [1614985756.562596619]: Loading from pre-hydro parameter style
[ INFO] [1614985757.029805666]: Using plugin “obstacle_layer”
[ INFO] [1614985757.060416381]: Subscribed to Topics: scan
Average Scan Matching Score=359.372
neff= 30
Registering Scans:Done
update frame 2
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 2
[ INFO] [1614985757.478907825]: Using plugin “inflation_layer”
[ INFO] [1614985758.071038374]: Created local_planner dwa_local_planner/DWAPlannerROS
[ INFO] [1614985758.111201517]: Sim period is set to 0.20
Average Scan Matching Score=359.367
neff= 30
Registering Scans:Done
update frame 3
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 3
Scan Matching Failed, using odometry. Likelihood=2.2233e-322
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Scan Matching Failed, using odometry. Likelihood=-1653.33
lp:0 0 -3.14159
op:0 0 -3.14159
Average Scan Matching Score=0
neff= 30
Registering Scans:Done
update frame 4
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 4
[ INFO] [1614985759.561529386]: Recovery behavior will clear layer obstacles
[ INFO] [1614985759.642187963]: Recovery behavior will clear layer obstacles
[ INFO] [1614985760.161254711]: odom received!
Average Scan Matching Score=248.398

 

Registering Scans:Done
update frame 336
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 336
[ INFO] [1614986217.014895384]: Got new plan
[ERROR] [1614986217.017267358]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986217.017687045]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986217.017925117]: Rotation cmd in collision
[ INFO] [1614986217.018889750]: Error when rotating.
[ INFO] [1614986217.214809329]: Got new plan
[ERROR] [1614986217.216441513]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986217.216707658]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986217.216893856]: Rotation cmd in collision
[ INFO] [1614986217.217095626]: Error when rotating.
[ INFO] [1614986217.415345356]: Got new plan
[ERROR] [1614986217.419742273]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986217.420922427]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986217.421750811]: Rotation cmd in collision
[ INFO] [1614986217.422566330]: Error when rotating.
[ INFO] [1614986217.614805187]: Got new plan
[ERROR] [1614986217.618715595]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986217.619072678]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986217.619268146]: Rotation cmd in collision
[ INFO] [1614986217.619450438]: Error when rotating.
Average Scan Matching Score=250.341
neff= 30
Registering Scans:Done
update frame 337
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 337
[ INFO] [1614986217.814768819]: Got new plan
[ERROR] [1614986217.815757776]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986217.816106265]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986217.816304702]: Rotation cmd in collision
[ INFO] [1614986217.816479441]: Error when rotating.
[ INFO] [1614986218.014802087]: Got new plan
[ERROR] [1614986218.015737866]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986218.016088855]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986218.016293438]: Rotation cmd in collision
[ INFO] [1614986218.016460052]: Error when rotating.
[ INFO] [1614986218.214981917]: Got new plan
[ERROR] [1614986218.216534466]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986218.216803996]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986218.216994465]: Rotation cmd in collision
[ INFO] [1614986218.217177798]: Error when rotating.
[ INFO] [1614986218.414858987]: Got new plan
[ERROR] [1614986218.416642316]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986218.416961274]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986218.417168305]: Rotation cmd in collision
[ INFO] [1614986218.417360752]: Error when rotating.
[ INFO] [1614986218.614830588]: Got new plan
[ERROR] [1614986218.616526001]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986218.616868761]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986218.617084125]: Rotation cmd in collision
[ INFO] [1614986218.617276468]: Error when rotating.
[ INFO] [1614986218.814832554]: Got new plan
[ERROR] [1614986218.816473227]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986218.816788018]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986218.816984372]: Rotation cmd in collision
[ INFO] [1614986218.817176142]: Error when rotating.
Average Scan Matching Score=251.385
neff= 30
Registering Scans:Done
[ INFO] [1614986219.014821967]: Got new plan
[ERROR] [1614986219.016056027]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986219.016495349]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986219.016715192]: Rotation cmd in collision
[ INFO] [1614986219.016911390]: Error when rotating.
[ INFO] [1614986219.214814297]: Got new plan
[ERROR] [1614986219.215764556]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986219.216048253]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986219.216215909]: Rotation cmd in collision
[ INFO] [1614986219.216369763]: Error when rotating.
[ INFO] [1614986219.414845586]: Got new plan
[ERROR] [1614986219.417001675]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986219.417336205]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986219.417555111]: Rotation cmd in collision
[ INFO] [1614986219.417732298]: Error when rotating.
[ INFO] [1614986219.617684004]: Got new plan
[ERROR] [1614986219.618530825]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986219.618792491]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986219.619027074]: Rotation cmd in collision
[ INFO] [1614986219.619233896]: Error when rotating.
[ INFO] [1614986219.814775038]: Got new plan
[ERROR] [1614986219.815719255]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986219.816048577]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986219.816252483]: Rotation cmd in collision
[ INFO] [1614986219.816419253]: Error when rotating.
[ WARN] [1614986220.014955649]: Clearing costmap to unstuck robot (3.000000m).
update frame 338
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 338
[ INFO] [1614986220.414804997]: Got new plan
[ERROR] [1614986220.415814005]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986220.416157703]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986220.416378327]: Rotation cmd in collision
[ INFO] [1614986220.416570566]: Error when rotating.
[ WARN] [1614986220.614916754]: Rotate recovery behavior started.
Average Scan Matching Score=248.312
neff= 30
Registering Scans:Done
update frame 339
update ld=0 ad=0
Laser Pose= 0 0 -3.14159
m_count 339
Average Scan Matching Score=245.378
neff= 30
Registering Scans:Done
update frame 340
update ld=6.04643e-06 ad=0.14672
Laser Pose= 1.13254e-07 -6.04537e-06 -2.99487
m_count 340
Average Scan Matching Score=252.347
neff= 30
Registering Scans:Done
update frame 341
update ld=0.000324289 ad=0.789049
Laser Pose= 0.000284651 0.000149524 -2.20582
m_count 341
Average Scan Matching Score=252.413
neff= 29.9054
Registering Scans:Done
update frame 342
update ld=0.00107552 ad=1.48459
Laser Pose= 0.000725708 -0.000831402 -0.72123
m_count 342
Average Scan Matching Score=243.093
neff= 29.9077
Registering Scans:Done
update frame 343
update ld=0.000697519 ad=1.24494
Laser Pose= 0.00140152 -0.00100407 0.523707
m_count 343
Average Scan Matching Score=246.577
neff= 29.9097
Registering Scans:Done
update frame 344
update ld=0.00032221 ad=0.737525
Laser Pose= 0.00161183 -0.000759963 1.26123
m_count 344
Average Scan Matching Score=254.526
neff= 29.9097
Registering Scans:Done
update frame 345
update ld=0.000509904 ad=1.12984
Laser Pose= 0.00181084 -0.00122942 2.39107
m_count 345
[ INFO] [1614986242.270013348]: Got new plan
[ INFO] [1614986242.470127084]: Got new plan
[ERROR] [1614986242.471078644]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986242.471501456]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986242.471912445]: Rotation cmd in collision
[ INFO] [1614986242.474185461]: Error when rotating.
[ WARN] [1614986242.670144102]: Clearing costmap to unstuck robot (1.840000m).
[ INFO] [1614986243.070122720]: Got new plan
[ERROR] [1614986243.071122874]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986243.071572978]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986243.072027925]: Rotation cmd in collision
[ INFO] [1614986243.072382143]: Error when rotating.
[ WARN] [1614986243.270217082]: Rotate recovery behavior started.
Average Scan Matching Score=241.443
neff= 29.9089
Registering Scans:Done
update frame 346
update ld=4.96068e-05 ad=0.584426
Laser Pose= 0.00176124 -0.00122878 2.9755
m_count 346
Average Scan Matching Score=258.135
neff= 29.8831
Registering Scans:Done
update frame 347
update ld=0.000353024 ad=1.06917
Laser Pose= 0.00199026 -0.00096012 -2.23851
m_count 347
Average Scan Matching Score=249.924
neff= 29.8827
Registering Scans:Done
update frame 348
update ld=0.000405898 ad=0.731359
Laser Pose= 0.00217308 -0.000597729 -1.50715
m_count 348
Average Scan Matching Score=247.097
neff= 29.8147
Registering Scans:Done
update frame 349
update ld=0.000351784 ad=1.06689
Laser Pose= 0.00196824 -0.000311737 -0.440266
m_count 349
Average Scan Matching Score=244.053
neff= 29.8141
Registering Scans:Done
update frame 350
update ld=0.00025601 ad=0.774083
Laser Pose= 0.00171582 -0.000269016 0.333816
m_count 350
Average Scan Matching Score=253.291
neff= 29.8143
Registering Scans:Done
update frame 351
update ld=0.000186742 ad=1.08347
Laser Pose= 0.00177727 -0.000445359 1.41729
m_count 351
Average Scan Matching Score=255.424
neff= 29.8064
Registering Scans:Done
update frame 352
update ld=0.000254807 ad=0.872823
Laser Pose= 0.00179861 -0.000699271 2.29011
m_count 352
[ INFO] [1614986263.875368486]: Got new plan
[ INFO] [1614986264.075149931]: Got new plan
[ERROR] [1614986264.076186648]: Footprint spec is empty, maybe missing call to setFootprint?
[ WARN] [1614986264.076505553]: Invalid Trajectory 0.000000, 0.000000, 0.400000, cost: -9.000000
[ WARN] [1614986264.076705501]: Rotation cmd in collision
[ INFO] [1614986264.076893886]: Error when rotating.
[ERROR] [1614986264.275270334]: Aborting because a valid control could not be found. Even after executing all recovery behaviors

 

 

 

rospibot6 robot6.launch

rospibot6 robot6.launch

<launch>

<arg name="use_map_topic" default="false"/>
<arg name="scan_topic" default="scan"/>
<arg name="initial_pose_x" default="0.0"/>
<arg name="initial_pose_y" default="0.0"/>
<arg name="initial_pose_a" default="0.0"/>

<rosparam param="base_width">0.1928</rosparam>
<rosparam param="ticks_meter">21140</rosparam>

<node name="diff_tf" pkg="rospibot6" type="diff_tf.py" output="screen">

<rosparam param="ticks_meter">21140</rosparam>
<rosparam param="base_width">0.1928</rosparam>
<rosparam param="base_frame_id">base_link</rosparam>
<rosparam param="odom_frame_id">odom</rosparam>
<rosparam param="rate">50</rosparam>
</node>

<node pkg="tf" type="static_transform_publisher" name="neato_laser_tf" args="0.0 0 0.10 0 0 0 /base_link /neato_laser 50" />

<node name="xv11" pkg="xv_11_laser_driver" type="neato_laser_publisher" respawn="true" output="screen">
<param name="port" value="/dev/ttyAMA0"/>
<!--<param name="firmware_version" value="2"/>-->
</node>

<node name="gmap" pkg="gmapping" type="slam_gmapping" respawn="true" respawn_delay="30" output="screen">
<param name="linearUpdate" type="double" value="0.0" />
<param name="angularUpdate" type="double" value="0.0" />
<param name="map_update_interval" type="double" value="5.0" />
<param name="throttle_scans" type="int" value="1" />

<!-- map size & resolution-->
<param name="xmin" type="double" value="-20.0" />
<param name="ymin" type="double" value="-20.0" />
<param name="xmax" type="double" value="20.0" />
<param name="ymax" type="double" value="20.0" />
<param name="delta" type="double" value="0.05" />

<!-- odometry error -->
<param name="srr" type="double" value="0.01" />
<param name="srt" type="double" value="0.02" />
<param name="str" type="double" value="0.01" />
<param name="stt" type="double" value="0.02" />
</node>

<node name="move_base" pkg="move_base" type="move_base" respawn="false" output="screen">
<rosparam file="$(find rospibot6)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find rospibot6)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam file="$(find rospibot6)/param/local_costmap_params.yaml" command="load" />
<rosparam file="$(find rospibot6)/param/global_costmap_params.yaml" command="load" />
<rosparam file="$(find rospibot6)/param/base_local_planner_params.yaml" command="load" />
<rosparam file="$(find rospibot6)/param/dwa_local_planner_params.yaml" command="load" />
<rosparam file="$(find rospibot6)/param/move_base_params.yaml" command="load" />
</node>

<!--
<node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf">
<param name="output_frame" value="odom"/>
<param name="freq" value="30.0"/>
<param name="sensor_timeout" value="1.0"/>
<param name="odom_used" value="true"/>
<param name="imu_used" value="true"/>
<param name="vo_used" value="false"/>
<param name="debug" value="true"/>
<param name="self_diagnose" value="true"/>
</node>
-->

<node pkg="amcl" type="amcl" name="amcl">
<param name="use_map_topic" value="$(arg use_map_topic)"/>
<!-- Publish scans from best pose at a max of 10 Hz -->
<param name="odom_model_type" value="diff"/>
<param name="odom_alpha5" value="0.1"/>
<param name="gui_publish_rate" value="10.0"/>
<param name="laser_max_beams" value="60"/>
<param name="laser_max_range" value="12.0"/>
<param name="min_particles" value="500"/>
<param name="max_particles" value="2000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.2"/>
<param name="odom_alpha2" value="0.2"/>
<!-- translation std dev, m -->
<param name="odom_alpha3" value="0.2"/>
<param name="odom_alpha4" value="0.2"/>
<param name="laser_z_hit" value="0.5"/>
<param name="laser_z_short" value="0.05"/>
<param name="laser_z_max" value="0.05"/>
<param name="laser_z_rand" value="0.5"/>
<param name="laser_sigma_hit" value="0.2"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_model_type" value="likelihood_field"/>
<!-- <param name="laser_model_type" value="beam"/> -->
<param name="laser_likelihood_max_dist" value="2.0"/>
<param name="update_min_d" value="0.25"/>
<param name="update_min_a" value="0.2"/>
<param name="odom_frame_id" value="odom"/>
<param name="base_frame_id" value="base_footprint"/>
<param name="resample_interval" value="1"/>
<!-- Increase tolerance because the computer can get quite busy -->
<param name="transform_tolerance" value="1.0"/>
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
<param name="initial_pose_x" value="$(arg initial_pose_x)"/>
<param name="initial_pose_y" value="$(arg initial_pose_y)"/>
<param name="initial_pose_a" value="$(arg initial_pose_a)"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>

<node name="base_node" pkg="rospibot6" type="base5" respawn="true" respawn_delay="30" output="screen">
<!--<rosparam file="$(find mypackage)/config/example.yaml" command="load" />-->
<remap from="wheel_left" to="lwheel"/>
<remap from="wheel_right" to="rwheel"/>
<param name="sample_rate" type="int" value="100" />
<param name="pid_enabled" type="bool" value="0" />
<param name="odom_enabled" type="bool" value="0" />
<param name="cmdvel_enabled" type="bool" value="1" />
<param name="cmdvel_k" type="double" value="0.3" />
<!-- BASE -->
<param name="wheel_rad" type="double" value="0.03385" />
<param name="wheel_sep" type="double" value="0.1928" />
<param name="wheel_encoder_pulses" type="double" value="4496.0" />
<!-- PID -->
<param name="pid_out_trh" type="double" value="0.0" />
<param name="pid_out_min" type="double" value="0.0" />
<param name="pid_out_max" type="double" value="64.0" />
<param name="pid_out_k" type="double" value="500.0" />
<param name="pid_sample_time" type="double" value="0.050" />
<param name="pid_setpoint_max" type="double" value="150000.0" />
<param name="pid_left_kp" type="double" value="0.7" />
<param name="pid_left_ki" type="double" value="0.01" />
<param name="pid_left_kd" type="double" value="0.0" />
<param name="pid_right_kp" type="double" value="0.7" />
<param name="pid_right_ki" type="double" value="0.01" />
<param name="pid_right_kd" type="double" value="0.0" />
<!-- IMU -->
<param name="frame_id" type="str" value="base_imu" />
<param name="ax" type="int" value="0" />
<param name="ay" type="int" value="0" />
<param name="az" type="int" value="0" />
<param name="gx" type="int" value="0" />
<param name="gy" type="int" value="0" />
<param name="gz" type="int" value="0" />
<param name="ado" type="bool" value="false" />
<param name="debug" type="bool" value="false" />
</node>

</launch>