Turtlebot 订阅者 pointcloud2 在 Gazebo 模拟器中显示颜色,但在机器人中不显示
Turtlebot subscriber pointcloud2 shows color in Gazebo simulator but not in robot
我正在使用 ASUS Xtion PRO LIVE 相机在 turtlebot(深度学习版)上订阅主题 "/camera/depth/points"
和消息 PointCloud2
。
我在gazebo模拟器环境下使用了下面的python脚本,可以成功接收到x、y、z和rgb值。
但是,当我 运行 它在机器人中时,rgb 值丢失。
这是我的 turtlebot 版本或相机的问题,还是我必须指定我想接收的地方 PointCloud2 type="XYZRGB"
?还是同步问题?有什么线索谢谢!
#!/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()
已发布主题的内容由提供它们的软件决定 - 即您相机的驱动程序。因此,要解决此问题,您需要获得正确的驱动程序并使用它所说的包含所需信息的主题。
您可以在 ROS wiki or on some community websites - like this. In your case, the ASUS devices should use openni2 and set depth_registration:=true
- as documented here.
上找到为您的相机推荐的驱动程序
此时,/camera/depth_registered/points
现在应该显示组合的 xyz 和 RGB 点云。要使用它,您的新 listener()
代码应如下所示:
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()
我正在使用 ASUS Xtion PRO LIVE 相机在 turtlebot(深度学习版)上订阅主题 "/camera/depth/points"
和消息 PointCloud2
。
我在gazebo模拟器环境下使用了下面的python脚本,可以成功接收到x、y、z和rgb值。
但是,当我 运行 它在机器人中时,rgb 值丢失。
这是我的 turtlebot 版本或相机的问题,还是我必须指定我想接收的地方 PointCloud2 type="XYZRGB"
?还是同步问题?有什么线索谢谢!
#!/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()
已发布主题的内容由提供它们的软件决定 - 即您相机的驱动程序。因此,要解决此问题,您需要获得正确的驱动程序并使用它所说的包含所需信息的主题。
您可以在 ROS wiki or on some community websites - like this. In your case, the ASUS devices should use openni2 and set depth_registration:=true
- as documented here.
此时,/camera/depth_registered/points
现在应该显示组合的 xyz 和 RGB 点云。要使用它,您的新 listener()
代码应如下所示:
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()