{ "info": { "author": "Daniel Maturana", "author_email": "dimatura@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Topic :: Multimedia :: Graphics :: 3D Modeling", "Topic :: Multimedia :: Graphics :: Capture", "Topic :: Multimedia :: Graphics :: Graphics Conversion", "Topic :: Scientific/Engineering", "Topic :: Scientific/Engineering :: Artificial Intelligence" ], "description": "``pypcd``\n=========\n\nWhat?\n-----\n\nPure Python module to read and write point clouds stored in the\n`PCD file format `__,\nused by the `Point Cloud Library `__.\n\nWhy?\n----\n\nYou want to mess around with your point cloud data without writing C++\nand waiting hours for the template-heavy PCL code to compile.\n\nYou tried to get some of the Python bindings for PCL to compile\nand just gave up.\n\nHow does it work?\n-----------------\n\nIt parses the PCD header and loads the data (whether in ``ascii``,\n``binary`` or ``binary_compressed`` format) as a\n`Numpy `__ structured array. It creates an\ninstance of the ``PointCloud``\nclass, containing the point cloud data as ``pc_data``, and\nsome convenience functions for I/O and metadata access.\nSee the comments in ``pypcd.py`` for some info on the point cloud\nstructure.\n\nExample\n-------\n\n.. code:: python\n\n import pypcd\n # also can read from file handles.\n pc = pypcd.PointCloud.from_path('foo.pcd')\n # pc.pc_data has the data as a structured array\n # pc.fields, pc.count, etc have the metadata\n\n # center the x field\n pc.pc_data['x'] -= pc.pc_data['x'].mean()\n\n # save as binary compressed\n pc.save_pcd('bar.pcd', compression='binary_compressed')\n\n\nHow to install\n--------------\n\n.. code:: bash\n\n pip install pypcd\n\nThat's it! You may want to install optional dependencies such as `pandas\n`__.\n\nYou can also clone this repo and use setup.py. \n\n.. code:: bash\n\n git clone https://github.com/dimatura/pypcd\n\nNote that downloading data assets will\nrequire `git-lfs `__.\n\n\nUsing with ROS\n---------------\n\nYou can also use this library with ROS ``sensor_msgs``, but it is *not* a dependency.\nYou don't need to install this package with catkin -- using `pip` should be fine --\nbut if you want to it is possible:\n\nSteps:\n\n.. code:: bash\n # you need to do this manually in this case\n pip install python-lzf\n cd your_workspace/src\n git clone https://github.com/dimatura/pypcd\n mv setup_ros.py setup.py\n catkin build pypcd\n source ../devel/setup.bash\n\n\nThen you can do something like this:\n\n.. code:: python\n\n import pypcd\n import rospy\n from sensor_msgs.msg import PointCloud2\n\n\n def cb(msg):\n pc = PointCloud.from_msg(msg)\n pc.save('foo.pcd', compression='binary_compressed')\n # maybe manipulate your pointcloud\n pc.pc_data['x'] *= -1\n outmsg = pc.to_msg()\n # you'll probably need to set the header\n outmsg.header = msg.header\n pub.publish(outmsg)\n\n # ...\n sub = rospy.Subscriber('incloud', PointCloud2)\n pub = rospy.Publisher('outcloud', PointCloud2, cb)\n rospy.init('pypcd_node')\n rospy.spin()\n\n\n\nIs it beautiful, production-ready code?\n---------------------------------------\n\nNo.\n\nWhat else can it do?\n--------------------\n\nThere's a bunch of functionality accumulated\nover time, much of it hackish and untested.\nIn no particular order,\n\n- Supports ``ascii``, ``binary`` and ``binary_compressed`` data.\n The latter requires the ``lzf`` module.\n- Decode and encode RGB into a single ``float32`` number. If\n you don't know what I'm talking about consider yourself lucky.\n- Point clouds to `pandas `__ dataframes. \n This in particular is quite useful,\n since `pandas` is pretty powerful and makes various operations\n such as merging point clouds or manipulating values easy.\n Conceptually, data frames are a good match to the point cloud format, since\n many point clouds in reality have heterogeneous data types - e.g.\n `x`, `y` and `z` are float fields but `label` is an int.\n- Convert to and from `ROS `__ PointCloud2\n messages.\n Requires the ROS ``sensor_msgs`` package with Python bindings\n installed.\n This functionality uses code developed by Jon Binney under\n the BSD license, included as ``numpy_pc2.py``.\n\nWhat can't it do?\n-----------------\n\nThere's no synchronization between the metadata fields in\n``PointCloud``\nand the data in ``pc_data``. If you change the shape of ``pc_data``\nwithout updating the metadata fields you'll run into trouble.\n\nI've only used it for unorganized point cloud data\n(in PCD conventions, ``height=1``), not organized\ndata like what you get from RGBD.\nHowever, some things may still work.\n\nWhile padding and fields with count larger\nthan 1 seem to work, this is a somewhat\nad-hoc aspect of the PCD format, so be careful.\nIf you want to be safe, you're probably better off\nusing neither -- just name each component\nof your field something like ``FIELD_00``, ``FIELD_01``, etc.\n\nIt also can't run on Python 3, yet, but there's a PR to fix this\nthat might get pulled in the near future.\n\nIt's slow!\n----------\n\nTry using ``binary`` or ``binary_compressed``; using\nASCII is slow and takes up a lot of space, not to\nmention possibly inaccurate if you're not careful\nwith how you format your floats.\n\nI found a bug / I added a feature / I made your code cleaner\n------------------------------------------------------------\n\nThanks! You can submit a pull request. But honestly, I'm not too good\nat keeping up with my github :(\n\n\nTODO\n----\n\n- Better API for various operations.\n- Clean up, get rid of cruft.\n- Add a cli for common use cases like file type conversion.\n- Better support for structured point clouds, with tests.\n- Better testing.\n- Better docs. More examples.\n- More testing of padding\n- Improve handling of multicount fields\n- Better support for rgb nonsense\n- Export to ply?\n- Figure out if it's acceptable to use \"pointcloud\" as a single word.\n- Package data assets in pypi?\n\n\nCredits\n-------\n\nThe code for compressed point cloud data was informed by looking at\n`Matlab\nPCL `__.\n\n@wkentaro for some minor changes.\n\nI used `cookiecutter `__ to\nhelp with the packaging.\n\nThe code in ``numpy_pc2.py`` was developed by Jon Binney under\nthe BSD license for `ROS `__.\n\nI want to congratulate you / insult you\n---------------------------------------\n\nMy email is ``dimatura@cmu.edu``.\n\nCopyright (C) 2015-2017 Daniel Maturana\n\n\n=======\nHistory\n=======\n\n0.1.0 (2018-03-15)\n------------------\n\n* First release on PyPI.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/dimatura/pypcd", "keywords": "pypcd", "license": "BSD license", "maintainer": "", "maintainer_email": "", "name": "pypcd", "package_url": "https://pypi.org/project/pypcd/", "platform": "", "project_url": "https://pypi.org/project/pypcd/", "project_urls": { "Homepage": "https://github.com/dimatura/pypcd" }, "release_url": "https://pypi.org/project/pypcd/0.1.1/", "requires_dist": [ "numpy", "python-lzf" ], "requires_python": "", "summary": "Read and write PCL .pcd files in python.", "version": "0.1.1" }, "last_serial": 3674802, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "ab9c2cc6d14da49b0b933971078d9b6a", "sha256": "f141715710b97e92fec5f84bad9ab36f5c29ab22a1435ea09d1a9fb3a5e4ba2e" }, "downloads": -1, "filename": "pypcd-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ab9c2cc6d14da49b0b933971078d9b6a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21280, "upload_time": "2018-03-16T02:41:55", "url": "https://files.pythonhosted.org/packages/3f/d6/0ca3720d9f68dee015b9c3d646fc0fb98b89723eb8cc796b05a3c1577ff0/pypcd-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4d9fd08ea141351ed6894bc35af2362f", "sha256": "2b6a2ef7622c33d2294b3ce2a18ea288ad83e8c6ed54e09972ecaaf0945cde4d" }, "downloads": -1, "filename": "pypcd-0.1.0.tar.gz", "has_sig": false, "md5_digest": "4d9fd08ea141351ed6894bc35af2362f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18740, "upload_time": "2018-03-16T02:41:58", "url": "https://files.pythonhosted.org/packages/cb/a9/5fc332573561d7358f61ec77cfd52e0b60f4bc75191be9424f7de9ef1ae7/pypcd-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "0d4f31b7593b294695a6e06b69ec3f5e", "sha256": "7ed6c217fa9043813380043e7883c1afd8edde24394c00470e2f6d55dcac15ff" }, "downloads": -1, "filename": "pypcd-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0d4f31b7593b294695a6e06b69ec3f5e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 22124, "upload_time": "2018-03-16T03:52:07", "url": "https://files.pythonhosted.org/packages/44/2c/81a97605f112c3ecd01ae5d378f5c35f4eef843c71a031627788c650bc00/pypcd-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e5b82c88884d127026b81238900a6d0", "sha256": "32a14d37ffbfd4efe7a10191f26581c48986208ac9a1fdd02f25a6dfa9b144c2" }, "downloads": -1, "filename": "pypcd-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0e5b82c88884d127026b81238900a6d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19537, "upload_time": "2018-03-16T03:52:09", "url": "https://files.pythonhosted.org/packages/99/c5/f0b3003d36f50bb084c887e5277ceff0c7671f92690c8a69910b21a2519f/pypcd-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0d4f31b7593b294695a6e06b69ec3f5e", "sha256": "7ed6c217fa9043813380043e7883c1afd8edde24394c00470e2f6d55dcac15ff" }, "downloads": -1, "filename": "pypcd-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0d4f31b7593b294695a6e06b69ec3f5e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 22124, "upload_time": "2018-03-16T03:52:07", "url": "https://files.pythonhosted.org/packages/44/2c/81a97605f112c3ecd01ae5d378f5c35f4eef843c71a031627788c650bc00/pypcd-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e5b82c88884d127026b81238900a6d0", "sha256": "32a14d37ffbfd4efe7a10191f26581c48986208ac9a1fdd02f25a6dfa9b144c2" }, "downloads": -1, "filename": "pypcd-0.1.1.tar.gz", "has_sig": false, "md5_digest": "0e5b82c88884d127026b81238900a6d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19537, "upload_time": "2018-03-16T03:52:09", "url": "https://files.pythonhosted.org/packages/99/c5/f0b3003d36f50bb084c887e5277ceff0c7671f92690c8a69910b21a2519f/pypcd-0.1.1.tar.gz" } ] }