2016-07-04 1 views
5

Je m'abonne au sujet "/camera/depth/points" et le message PointCloud2 sur un turtlebot (version d'apprentissage en profondeur) avec la caméra ASUS Xtion PRO LIVE.Abonné Turtlebot pointcloud2 montre la couleur dans le simulateur Gazebo mais pas dans le robot

J'ai utilisé le script python ci-dessous sous l'environnement du simulateur de gazebo et je peux recevoir les valeurs x, y, z et rgb avec succès. Cependant, lorsque je l'exécute dans le robot, les valeurs rgb sont manquantes.

Est-ce un problème de ma version de turtlebot, ou appareil photo ou est-ce que je dois spécifier quelque part que je veux recevoir PointCloud2 type="XYZRGB"? ou est-ce un problème de synchronisation? Des indices s'il vous plaît merci!

#!/usr/bin/env python 
import rospy 
import struct 
import ctypes 
import sensor_msgs.point_cloud2 as pc2 
from sensor_msgs.msg import PointCloud2 

file = open('workfile.txt', 'w') 

def callback(msg): 

    data_out = pc2.read_points(msg, skip_nans=True) 

    loop = True 
    while loop: 
     try: 
      int_data = next(data_out) 
      s = struct.pack('>f' ,int_data[3]) 
      i = struct.unpack('>l',s)[0] 
      pack = ctypes.c_uint32(i).value 

      r = (pack & 0x00FF0000)>> 16 
      g = (pack & 0x0000FF00)>> 8 
      b = (pack & 0x000000FF) 

      file.write(str(int_data[0])+","+str(int_data[1])+","+str(int_data[2])+","+str(r)+","+str(g)+","+str(b)+"\n") 

     except Exception as e: 
      rospy.loginfo(e.message) 
      loop = False 
      file.flush 
      file.close 

def listener(): 

    rospy.init_node('writeCloudsToFile', anonymous=True) 
    rospy.Subscriber("/camera/depth/points", PointCloud2, callback) 
    rospy.spin() 

if __name__ == '__main__': 
    listener() 
+0

ASUS Xtion PRO EN DIRECT – fartagaintuxedo

+0

Je pense que je l'ai essayé 'la profondeur registered' aussi bien, mais je ne me souviens pas maintenant, je vais vérifier cette fois – fartagaintuxedo

+0

Ce pourrait aider, j'ai essayé avec openni, mais je ne pouvais pas le faire fonctionner même pas en utilisant la profondeur enregistrés. Mais je ne pense pas que je mets le paramètre comme indiqué dans votre lien 'depth_registration: = true' donc je vais essayer ça demain matin. 1 question, utilise openni pour cette approche la plus normale? – fartagaintuxedo

Répondre

2

Le contenu des sujets publiés sont déterminés par le logiciel qui les fournit - à savoir les pilotes de votre appareil photo. Pour résoudre ce problème, vous devez donc obtenir le bon pilote et utiliser le sujet qui contient les informations requises.

Vous pouvez trouver les pilotes recommandés pour vos caméras sur le ROS wiki ou sur certains sites Web communautaires - comme this. Dans votre cas, les périphériques ASUS doivent utiliser openni2 et définir depth_registration:=true - comme documenté here.

À ce stade, /camera/depth_registered/points doit maintenant afficher le nuage de points xyz et RVB combinés. Pour l'utiliser, votre nouveau code listener() devrait ressembler à ceci:

def listener(): 
    rospy.init_node('writeCloudsToFile', anonymous=True) 
    # Note the change to the topic name 
    rospy.Subscriber("/camera/depth_registered/points", PointCloud2, callback) 
    rospy.spin()