ros-perception / perception_pcl Goto Github PK
View Code? Open in Web Editor NEWPCL (Point Cloud Library) ROS interface stack
Home Page: http://wiki.ros.org/perception_pcl
PCL (Point Cloud Library) ROS interface stack
Home Page: http://wiki.ros.org/perception_pcl
Consider the program:
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>
void
cloud_cb (const pcl::PointCloud<pcl::PointXY>::ConstPtr& input)
{
ROS_INFO("received a point cloud");
}
int
main (int argc, char** argv)
{
ros::init (argc, argv, "cloud_listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe<pcl::PointCloud<pcl::PointXY> > ("cloud", 1, cloud_cb);
ros::spin ();
}
We can get this program to freeze by sending the message:
$ rostopic pub /cloud sensor_msgs/PointCloud2 "{'width':0xffffffff, 'height':0xffffffff}" -1
The program gets stuck in this loop in pcl_ros/point_cloud.h:
// If not, do a lot of memcpys to copy over the fields
for (uint32_t row = 0; row < m.height; ++row) {
const uint8_t* stream_data = stream.advance(row_step);
for (uint32_t col = 0; col < m.width; ++col, stream_data += point_step) {
BOOST_FOREACH(const pcl::detail::FieldMapping& fm, mapping) {
memcpy(m_data + fm.struct_offset, stream_data + fm.serialized_offset, fm.size);
}
m_data += sizeof(T);
}
}
Two different ways this could be fixed:
assert(data_size > 0 || (m.width == 0 && m.height == 0));
This says that if the message has no data content, then its width and height fields are zero. This is better than just assert(data_size > 0)
because we don't want default empty messages to crash the node.
if (data_size > 0) { ...
so that no memcpy loop is attempted if it is known that the message has no data content. This would have the advantage of not crashing the node when such a message arrives.
(edited: data_size
is probably the right variable to check, not row_step
)
Need to add inverse of #76 to support reading compressed PCD files
Myself and several others have run into this problem when installing gazebo_ros_pkgs from source for ROS Hydro. I haven't figured out what is causing it but I have found a workaround where if you uninstall everything (using something like synaptic) related to pcl (libpcl, ros-hydro-pcl, etc) and then re-install them, it seems to work. There's probably some dependency issue that needs to be fixed.
The output:
Make Error at /opt/ros/hydro/share/pcl_ros/cmake/pcl_rosConfig.cmake:98 (message):
Project 'pcl_ros' specifies '/usr/include/ni' as an include dir, which is
not found. It does neither exist as an absolute directory nor in
'/opt/ros/hydro//usr/include/ni'. Ask the maintainer 'William Woodall
<[email protected]>, Julius Kammerl <[email protected]>' to fix it.
Call Stack (most recent call first):
/opt/ros/hydro/share/gazebo_plugins/cmake/gazebo_pluginsConfig.cmake:154 (find_package)
/opt/ros/hydro/share/gazebo_ros/cmake/gazebo_rosConfig.cmake:154 (find_package)
/opt/ros/hydro/share/catkin/cmake/catkinConfig.cmake:72 (find_package)
baxter/baxter_gazebo/CMakeLists.txt:4 (find_package)
Thanks!
Looks like hydro-devel and indigo-devel nodelets.xml don't agree, should be reconciled.
http://answers.ros.org/question/206352/pcl_ros-nodelets-do-not-exist/
More details here: ros/rosdistro#2805
With the 1.9 version of ogre I commited last time I got errors when
compiling pcl_ros package and gazebo from source. I got errors because the
file "OGRE/OgreFontManager.h" can not be founded. I search the filelist for
the 1.9 package (
http://packages.debian.org/sid/amd64/libogre-1.9-dev/filelist) and found
that the directory structure for the headers change. That file is now under
"OGRE/Overlay/OgreFontManager.h" Using 1.8 gave no problems during
compilation.
Not sure if this is a wont fix since fuerte stuff is being deprecated, but...
Building a dependent package I get the following:
# VERBOSE=1 make
mkdir -p bin
cd build && cmake -Wdev -DCMAKE_TOOLCHAIN_FILE=`rospack find rosbuild`/rostoolchain.cmake ..
Re-run cmake no build system arguments
[rosbuild] Building package package_name_redacted
[rosbuild] Cached build flags older than manifests; calling rospack to get flags
Failed to invoke /opt/ros/fuerte/bin/rospack cflags-only-I;--deps-only package_name_redacted
[rospack] Warning: ignoring duplicate cpp tag in export block
CMake Error at /usr/lib/vtk-5.8/VTKTargets.cmake:16 (ADD_EXECUTABLE):
Command add_executable() is not scriptable
Call Stack (most recent call first):
/usr/lib/vtk-5.8/VTKConfig.cmake:231 (INCLUDE)
/usr/share/cmake-2.8/Modules/FindVTK.cmake:73 (FIND_PACKAGE)
/home/username_redacted/tmp/perception_pcl/pcl/vtk_include.cmake:1 (find_package)
CMake Error at /opt/ros/fuerte/share/ros/core/rosbuild/public.cmake:129 (message):
Failed to invoke rospack to get compile flags for package
'package_name_redacted'. Look above for errors from rospack itself.
Aborting. Please fix the broken dependency!
Call Stack (most recent call first):
/opt/ros/fuerte/share/ros/core/rosbuild/public.cmake:227 (rosbuild_invoke_rospack)
CMakeLists.txt:13 (rosbuild_init)
I found this which seems to be the same problem from a year ago:
https://code.ros.org/trac/ros-pkg/ticket/5243
Unfortunately the patch doesn't work completely on the current version.
I was able to get around the problem by commenting out the contents of vtk_include.cmake
and vtk_library.cmake
and replacing them with hard coded MESSAGE( "/usr/include/vtk-5.8" )
and the like.
Hi, I was just wondering, why there are only two library components written in the pcl_nodelets.xml (branch hydro-devel)? why are the other libraries not added, such as "pcl_ros_segmentation"?
Thanks!
I am running pointcloud_to_laserscan .
Reinstatement of issue: I am using the gazebo kinetic camera plugin. If I send the /depth/points to pointcloud_to_laserscan it does not seem to produce as usable scan output. So that gmapping complains that it is no mounted as planer ...
Please release this package into ROS Jade as it is a blocking dependency of the navigation stack.
FilterChain use a hardcoded "filters" package name for searching for plugins. Registering all the pcl_ros plugins in the nodelet package makes them unavailable to the filters::FilterChain tool.
Moreover, the base_class_type (in pcl_nodelets.xml) is pointing on nodelet::Nodelet, shoudn't it be something like filters::FilterBase<sensor_msgs::PointCloud2>. Even though it is not really inheriting from it, it still implement the basic API (I think).
I might have missed something somewhere though.
When compiling against PCL without python-vtk installed, I get many warnings like:
-- The imported target "vtkPythonCore" references the file
"/usr/lib/libvtkPythonCore.so.5.8.0"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
"/usr/lib/vtk-5.8/VTKTargets-release.cmake"
but not all the files it references.
Installing python-vtk fixes this.
I get similar warnings that are resolved by installing libvtk-java:
-- The imported target "vtkHybridJava" references the file
"/usr/lib/jni/libvtkHybridJava.so.5.8.0"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
"/usr/lib/vtk-5.8/VTKTargets-release.cmake"
but not all the files it references.
building desktop-full from source, pcl_ros fails:
Adding "nodelet nodelet_topic_tools" to find_package fixes that.
Compile errors below:
In file included from /home/kruset/groovy_underlay/src/pcl_ros/src/pcl_ros/io/concatenate_fields.cpp:42:0:
/home/kruset/groovy_underlay/src/pcl_ros/include/pcl_ros/io/concatenate_fields.h:42:29: fatal error: nodelet/nodelet.h: No such file or directory
/home/kruset/groovy_underlay/src/pcl_ros/src/pcl_ros/io/io.cpp:42:45: fatal error: nodelet_topic_tools/nodelet_mux.h: No such file or directory
I have an issue with linking libraries to that executable. CMake does all right in finding all libs, but then in the making process i get:
Scanning dependencies of target bag_to_pcd
[ 5%] Building CXX object CMakeFiles/bag_to_pcd.dir/tools/bag_to_pcd.cpp.o
Linking CXX executable /Users/DeFrenZ/ros_catkin_ws/devel_isolated/pcl_ros/lib/pcl_ros/bag_to_pcd
Undefined symbols for architecture x86_64:
"pcl::PCDWriter::writeASCII(std::string const&, sensor_msgs::PointCloud2_std::allocator const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, int)", referenced from:
pcl::PCDWriter::write(std::string const&, sensor_msgs::PointCloud2_std::allocator const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, bool) in bag_to_pcd.cpp.o
"pcl::PCDWriter::writeBinary(std::string const&, sensor_msgs::PointCloud2_std::allocator const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&)", referenced from:
pcl::PCDWriter::write(std::string const&, sensor_msgs::PointCloud2_std::allocator const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, bool) in bag_to_pcd.cpp.o
ld: symbol(s) not found for architecture x86_64
Any idea why? those functions don't even appear in bag_to_pcd.cpp, even if savePCDFile(...) does. But <pcl/io/pcd_io.h> is the file where those should be defined, and I've also checked the CMake generated files and they correctly use the path of the .dylib and .h that I need...
Mac OS X 10.8, pcl got from trunk (and already builded with catkin)
Hi,
when i use the groovy-unstable-devel branch of PCL for my projects, i always get the following after starting a node that uses PCL:
AssertionMessage: claws-mail: /build/buildd/cairo-1.10.2/src/cairo-surface.c:1287: cairo_surface_set_device_offset: Assertion `status == CAIRO_STATUS_SUCCESS' failed.
Sorry, im not very familiar with ros and that stuff.
timestamp is not maintained if nodelets of pcl_ros are used because timestamp of pcl is in usec and timestamp of ROS is in nsec.
It means that we cannot use ExactTime policy of message_filters with pcl_ros nodelets.
Hi,
We're developing pcl::FIlter based PCL nodelet library at http://svn.code.sf.net/p/jsk-ros-pkg/code/trunk/jsk_pcl_ros, but it does not work since groovy.
Some of our code uses pcl_ros::Filter as a super class, for example resize_points_publisher.cpp, but it fails to load as following message.
However, the code works, if we remove
class_loader_hide_library_symbols(pcl_ros_filters)
from CMakeLists.txt,
So, why class_loader_hide_library_symbols is needed? if it is not important, is it possible to remove this line from CMakeLists.txt?
[ERROR] [1367521319.699211347]: Failed to load nodelet [/depth_image_creator_nodelet] of type [jsk_pcl/DepthImageCreator]: Failed to load library /home/k-okada/ros/groovy/jsk-ros-pkg/jsk_pcl_ros/lib/libjsk_pcl_ros.so. Make sure that you are calling the PLUGINLIB_EXPORT_CLASS macro in the library code, and that names are consistent between this macro and your XML. Error string: Could not load library (Poco exception = /home/k-okada/ros/groovy/jsk-ros-pkg/jsk_pcl_ros/lib/libjsk_pcl_ros.so: undefined symbol: _ZN7pcl_ros6Filter15config_callbackERNS_12FilterConfigEj)
[FATAL] [1367521319.699405536]: Service call failed!
PCDReader run main loop inside of onInit method, and it hangs nodelet initialization sequence.
In ubuntu precise (12.04), hydro packages compiled against pcl_ros
fails because:
/opt/ros/hydro/lib/pkgconfig/pcl_ros.pc
/opt/ros/hydro/share/pcl_ros/cmake/pcl_rosConfig.cmake
looks for
/usr/lib/libflann_cpp_s.a
However, system install of libflann-dev
does not provide a static version of the library in /usr/lib
, it is found in
/usr/lib/x86_64-linux-gnu/libflann_cpp_s.a
This worked in groovy because
/opt/ros/groovy/lib/pkgconfig/pcl_ros.pc
/opt/ros/groovy/share/pcl_ros/cmake/pcl_rosConfig.cmake
depends on groovy custom package of static libflann library:
/opt/ros/groovy/lib/libflann_cpp_s.a
Building indigo with Ubuntu 14.04
[ 34%] Building CXX object perception_pcl/pcl_ros/CMakeFiles/pcl_ros_tf.dir/src/transforms.cpp.o
In file included from /usr/include/boost/signals.hpp:9:0,
from /opt/ros/indigo/include/tf/tf.h:45,
from /opt/ros/indigo/include/tf/transform_listener.h:38,
from /home/lucid/catkin_ws/src/perception_pcl/pcl_ros/include/pcl_ros/transforms.h:43,
from /home/lucid/catkin_ws/src/perception_pcl/pcl_ros/src/transforms.cpp:41:
/usr/include/boost/signal.hpp:17:4: warning: #warning "Boost.Signals is no longer being maintained and is now deprecated. Please switch to Boost.Signals2. To disable this warning message, define BOOST_SIGNALS_NO_DEPRECATION_WARNING." [-Wcpp]
# warning "Boost.Signals is no longer being maintained and is now deprecated. Please switch to Boost.Signals2. To disable this warning message, define BOOST_SIGNALS_NO_DEPRECATION_WARNING."
Need to add some options parsing to improve usability
Boost.Program_options or getopt?
Restricting allowed values for filter_limit_min, filter_limit_max parameters to range [-5, 5] is very limiting and makes the filter useless for many use cases, especially for outdoor scenarios where corresponding values are often in the order of tens or hundreds. I don't understand why to introduce such limitations. (Having a nice step size for reconfigure_gui is not a good reason, IMHO.)
command line option to specify TF frame
Is there a way to generate deb packages for perception_pcl? I didn't see any make targets.
Should be about the same as #76
Hi,
I am currently getting the following cmake errors in packages using the binary pcl_ros package from the hydro repositories. I am using Ubuntu precise amd64. The current version is ros-hydro-pcl-ros 1.1.5-0precise-20130830-1312-+0000.
CMake Error at /opt/ros/hydro/share/pcl_ros/cmake/pcl_rosConfig.cmake:98 (message):
Project 'pcl_ros' specifies '/usr/include/ni' as an include dir, which is
not found. It does neither exist as an absolute directory nor in
'/opt/ros/hydro//usr/include/ni'. Ask the maintainer 'William Woodall
<[email protected]>, Julius Kammerl <[email protected]>' to fix it.
Call Stack (most recent call first):
/opt/ros/hydro/share/gazebo_plugins/cmake/gazebo_pluginsConfig.cmake:154 (find_package)
/opt/ros/hydro/share/catkin/cmake/catkinConfig.cmake:72 (find_package)
CMakeLists.txt:7 (find_package)
-- Configuring incomplete, errors occurred!
I do not have the include folder /usr/include/ni
on my system, although all dependencies are fulfilled. If I install the package libopenni-dev
which contains this folder manually, apt-get wants to remove ros-hydro-pcl-ros
and all kind of libpcl-*
packages. There seems to be a conflict / dependency error related to ros-hydro-pcl-ros
, openni-dev
and libopenni-dev
.
Johannes
This looks wrong to me
<build_depend>libpcl-all-dev</build_depend>
<run_depend>libpcl-all</run_depend>
<run_depend>libpcl-all-dev</run_depend>
https://github.com/ros-perception/perception_pcl/blob/indigo-devel/pcl_ros/package.xml#L32
https://github.com/ros-perception/perception_pcl/blob/indigo-devel/pcl_ros/package.xml#L49
Documentation about the pcl_ros::Filter class http://ros.org/doc/groovy/api/pcl_ros/html/classpcl__ros_1_1Filter.html makes it appear that it is a class which can be used by implementers of new pcl filter nodelets.
However as pointed out in #9 the CMakeLists.txt file includes the line "class_loader_hide_library_symbols(pcl_ros_filters)", and pcl_ros_filters is the only library containing the compiled contents of pcl_ros::Filter. Therefore pcl_ros::Filter is not actually usable by outside programmers. If it is really intended to be only an internal helper class for the pcl_ros_filters library, then it should be documented as such.
However it appears to be a more generally useful helper class, making it easy to write PCL filter nodelets without a bunch of boilerplate. To make this possible, a new library should be defined, say pcl_ros_filter or pcl_ros_filter_base which contains only pcl_ros::Filter. That library would naturally not have class_loader_hide_library_symbols() because it would not be defining a plugin. Then implementors of new filters would link against that library, as would the existing pcl_ros_filters library.
In the meantime the solution to my problem is to copy pcl_ros/filters/filter.cpp into my own code and do a bunch of renaming.
As a follow-up for #29, I'm trying to use the segmentation nodelets to get a plane model out of a point cloud.
First, I added the segmentation library to the pcl_nodelets.xml (don't know why this is missing here):
<!-- PCL Segmentation library component -->
<library path="lib/libpcl_ros_segmentation">
<class name="pcl/ExtractPolygonalPrismData" type="ExtractPolygonalPrismData" base_class_type="nodelet::Nodelet">
<description>
ExtractPolygonalPrismData uses a set of point indices that represent a planar model, and together with a given
height, generates a 3D polygonal prism. The polygonal prism is then used to segment all points lying inside it.
</description>
</class>
<class name="pcl/EuclideanClusterExtraction" type="EuclideanClusterExtraction" base_class_type="nodelet::Nodelet">
<description>
EuclideanClusterExtraction represents a segmentation class for cluster extraction in an Euclidean sense.
</description>
</class>
<class name="pcl/SACSegmentationFromNormals" type="SACSegmentationFromNormals" base_class_type="nodelet::Nodelet">
<description>
SACSegmentation represents the Nodelet segmentation class for Sample Consensus methods and models, in the sense that
it just creates a Nodelet wrapper for generic-purpose SAC-based segmentation.
</description>
</class>
<class name="pcl/SACSegmentation" type="SACSegmentation" base_class_type="nodelet::Nodelet">
<description>
SACSegmentation represents the Nodelet segmentation class for Sample Consensus methods and models, in the sense that
it just creates a Nodelet wrapper for generic-purpose SAC-based segmentation.
</description>
</class>
<class name="pcl/SegmentDifferences" type="SegmentDifferences" base_class_type="nodelet::Nodelet">
<description>
SegmentDifferences obtains the difference between two spatially aligned point clouds and returns the
difference between them for a maximum given distance threshold.
</description>
</class>
</library>
Then, I launch the nodelet in a launch file (which I found on ros answers):
<node pkg="nodelet" type="nodelet" name="voxel_grid" args="load pcl/VoxelGrid sensor_manager" output="screen">
<remap from="~input" to="/camera/depth/points" />
<rosparam>
filter_field_name: z
filter_limit_min: 0.3
filter_limit_max: 3
filter_limit_negative: False
leaf_size: 0.03
</rosparam>
</node>
<!-- Run a SACSegmentation filter to find the points lying on the floor -->
<node pkg="nodelet" type="nodelet" name="find_plane" args="load pcl/SACSegmentation sensor_manager" output="screen" machine="$(arg robot_machine)">
<remap from="~input" to="/voxel_grid/output"/>
<remap from="~inliers" to="find_plane/plane_indices"/>
<rosparam>
model_type: 9
method_type: 0
distance_threshold: 0.02
max_iterations: 500
optimize_coefficients: true
axis: [0.0, -0.906, -0.423]
eps_angle: 0.7
</rosparam>
</node>
Then, I got a memory problem(I change the NODELET_DEBUG to NODELET_WARN, because I don't know how to show the debug message...):
[ WARN] [1374738349.448059144]: [/find_plane::input_indices_callback] PointCloud with 28 data points, stamp 1374738349.399502, and frame /camera_depth_optical_frame on topic /voxel_grid/output received.
*** glibc detected *** /opt/ros/hydro/lib/nodelet/nodelet: free(): invalid pointer: 0xb0302ab0 ***
I figured this is also a shared pointer initialization problem, in the callback
pcl_ros::SACSegmentation::input_indices_callback
The IndicesPtr at line 307 is not initialized, since the PointIndicesConstPtr is empty. So, I did
IndicesPtr indices_ptr(new std::vector<int>);
in the callback function, but then, the segmentation algorithm doesn't work out anymore:
[ WARN] [1374738830.275080933]: [/find_plane::input_indices_callback] PointCloud with 60 data points, stamp 1374738830.219591, and frame /camera_depth_optical_frame on topic /voxel_grid/output received.
[pcl::SampleConsensusModel::getSamples] Can not select 0 unique points out of 0!
[pcl::RandomSampleConsensus::computeModel] No samples could be selected!
[pcl::SACSegmentation::segment] Error segmenting the model! No solution found.
[ WARN] [1374738830.276829872]: [/find_plane::input_indices_callback] No inliers found!
The subscriber I used in my program to get model and indices are initialized as:
message_filters::Subscriber<sensor_msgs::PointCloud2> sub_input_filter;
message_filters::Subscriber<pcl_msgs::PointIndices> sub_indices_filter;
message_filters::Subscriber<pcl_msgs::ModelCoefficients> sub_model_filter;
And these subscribers are placed in a boost shared pointer synchronizer.
Could anyone please check this problem?
Thanks!
pointcloud_to_laserscan
seems to have been broken by 331cd9c [1] on Fedora.
I can't really figure out how it is working on Ubuntu but not Fedora. I'd be more than willing to test fixes, or even supply a Fedora machine for you to test on, but I'm at my wit's end trying to find a solution...
This is blocking a pretty fair amount of packages from building on Fedora...
Thanks,
--scott
EDIT: Duh, I forgot to post the error:
Linking CXX executable ~/pcl_ws/devel_isolated/pointcloud_to_laserscan/lib/pointcloud_to_laserscan/pointcloud_to_laserscan_node
~/pcl_ws/devel_isolated/pointcloud_to_laserscan/lib/libpointcloud_to_laserscan.so: undefined reference to `void tf2::doTransform<geometry_msgs::Point32_<std::allocator<void> > >(geometry_msgs::Point32_<std::allocator<void> > const&, geometry_msgs::Point32_<std::allocator<void> >&, geometry_msgs::TransformStamped_<std::allocator<void> > const&)'
~/pcl_ws/devel_isolated/pointcloud_to_laserscan/lib/libpointcloud_to_laserscan.so: undefined reference to `std::string const& tf2::getFrameId<geometry_msgs::Point32_<std::allocator<void> > >(geometry_msgs::Point32_<std::allocator<void> > const&)'
~/pcl_ws/devel_isolated/pointcloud_to_laserscan/lib/libpointcloud_to_laserscan.so: undefined reference to `ros::Time const& tf2::getTimestamp<geometry_msgs::Point32_<std::allocator<void> > >(geometry_msgs::Point32_<std::allocator<void> > const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [~/pcl_ws/devel_isolated/pointcloud_to_laserscan/lib/pointcloud_to_laserscan/pointcloud_to_laserscan_node] Error 1
make[1]: *** [CMakeFiles/pointcloud_to_laserscan_node.dir/all] Error 2
make: *** [all] Error 2
This is just a request for there to be an indigo release of pcl_ros, so that people can track the maintainer's progress.
The executables for the pcl_ros package are installed to /opt/ros/groovy/bin, which means that rosrun cannot find them. See this page: http://answers.ros.org/question/54132/pcl_ros-bag_to_pcd-not-found/
ticket moved from https://code.ros.org/trac/ros-pkg/ticket/5585
I get a compilation error when trying to build the release 345, when using rosmake perception_pcl.
/opt/ros/fuerte/share/perception_pcl/pcl/build/pcl_trunk/tools/crop_to_hull.cpp:132:3: error: "ConcaveHull?" is not a member of "pcl"
Support for tf2 needed for Hydro and later
This is the quick way of fixing it.
Patch
diff --git a/pcl_ros/tools/bag_to_pcd.cpp b/pcl_ros/tools/bag_to_pcd.cpp
index b9114cf..d1ec14e 100644
--- a/pcl_ros/tools/bag_to_pcd.cpp
+++ b/pcl_ros/tools/bag_to_pcd.cpp
@@ -91,6 +91,7 @@ int
view.addQuery (bag, rosbag::TypeQuery ("sensor_msgs/PointCloud2"));
view.addQuery (bag, rosbag::TypeQuery ("tf/tfMessage"));
+ view.addQuery (bag, rosbag::TypeQuery ("tf2_msgs/TFMessage"));
view_it = view.begin ();
std::string output_dir = std::string (argv[3]);
If there is an example of the preferred migration approach I'd be happy to produce a patch.
I think #87 was the last merge for Hydro
Could you release the latest hydro-devel branch of pcl_ros?
It includes a lot of nodelets.
def6bae
user@system:~$ rosrun pcl_ros bag_to_pcd input.bag ./velodyne_points ./pcd
Error opening file ./input.bag
user@system:~$ rosbag info input.bag
ERROR bag unindexed: input.bag. Run rosbag reindex.
While pcl_ros exposes pcl_conversions headers it does not export it as a CATKIN_DEPENDS.
The list of other packages not being part of CATKIN_DEPENDS is long but I don't know if that is correct or if some of them are also missing. Adding pcl_conversions here (https://github.com/ros-perception/perception_pcl/blob/hydro-devel/pcl_ros/CMakeLists.txt#L39) made the isolated build work for me.
Tested using the latest Groovy debs and Ubuntu 12.04LTS. Also reported on answers.ros.org on Feb 9, 2013.
To reproduce:
Terminal 1:
$ rosrun nodelet nodelet manager __name:=nodelet_manager
[ INFO] [1362419668.982743970]: Initializing nodelet with 4 worker threads.
Terminal 2:
$ rosrun nodelet nodelet load pcl/PassThrough nodelet_manager ~input:="/camera/depth_registered/points"
[FATAL] [1362419158.720559530]: Service call failed!
and in Terminal 1 we get the error:
[ERROR] [1362419929.099306606]: Failed to load nodelet [/pcl_PassThrough] of type [pcl/PassThrough]: According to the loaded plugin descriptions the class pcl/PassThrough with base class type nodelet::Nodelet does not exist. Declared types are ccny_rgbd/RGBDImageProcNodelet cmd_vel_mux/CmdVelMuxNodelet depth_image_proc/convert_metric depth_image_proc/disparity depth_image_proc/point_cloud_xyz depth_image_proc/point_cloud_xyzrgb depth_image_proc/register depthimage_to_laserscan/DepthImageToLaserScanNodelet image_proc/crop_decimate image_proc/debayer image_proc/rectify image_view/disparity image_view/image kobuki_auto_docking/AutoDockingNodelet kobuki_bumper2pc/Bumper2PcNodelet kobuki_controller_tutorial/BumpBlinkControllerNodelet kobuki_node/KobukiNodelet kobuki_safety_controller/SafetyControllerNodelet nodelet_tutorial_math/Plus openni_camera/driver stereo_image_proc/disparity stereo_image_proc/point_cloud stereo_image_proc/point_cloud2 turtlebot_follower/TurtlebotFollower yocs_velocity_smoother/VelocitySmootherNodelet
Same error for VoxelGrid and StatisticalOutlierRemoval filters.
ticket from: https://code.ros.org/trac/ros-pkg/ticket/5257
bag_to_pcd assumes TF to be present in the bag which is absolutely not necessary for just converting a bag file to a pcd file. The fact that it requires the TF topic is not documented anywhere and even worse, it assumes to always see the frame base_link.
I suggest to make the transform part optional, document it, and make the frame name easily configurable through one single, documented, ROS parameter.
Restricting allowed values for filter_limit_min, filter_limit_max parameters to range [-1000,1000]
is still too low for the intenstity field for example. I am using a Hokuyo UTM-30lx and it's giving values up to 40000.0 so I am not able to filter the pointcloud properly.
Most of this can be done with #ifdef
tests in the client code.
But, there is least one problem with that: the new Hydro version requires pcl_conversions
, which did not exist before. We need some way to make that dependency conditional and testable within client code.
One idea is for the Hydro version of pcl_ros
to depend on pcl_conversions
. That dependency could be removed in Indigo as a tick-tock update.
Existing clients already depend on pcl_ros
. Maybe they could do some kind of conditional find_package()
and test the result. Then, clients could only use that dependency when PCL 1.7 is present. I don't understand all the details, yet.
Perhaps there is a better solution. I am still trying to figure out how to deal with this problem. See: ros-drivers/velodyne#11.
does not produce correct scans when using Gazebo kinetic plugin.Missing intensities and leading data does not match normal laser output values for simulated laser plugin.
As per discussions on the pcl mailing list (http://www.pcl-developers.org/Separating-pcl-and-ROS-td5707911.html) and github (PointCloudLibrary/pcl#110), we're looking to get rid of ROS/pcl conflicts. That means PointCloud2, Header, Image, and PointField will no longer directly be used in pcl.
To make this easier on ROS users, it'd be great to have code which converts between the two formats. I'm happy to write it (the two classes are almost identical), but since I'm not an active pcl_ros user, it might make more sense for someone on this end to write and test it. Or, if nothing else, let me know where and how you'd find migration code the most convenient.
You can find the new headers at http://stanford.edu/~sdmiller/dropbox/new_pcl_headers.tar.gz
I have a uniq PC sensor that can occasioanlly send a single PC that is large but all the values are 0. Obviously, there is an issue in the hardware driver that needs fixing, but this also highlighted an issue in the StatisticalOutlierRemoval class, where a cloud of all zeroes (and presumably any cloud with all the same points) will hang forver and the program must be killed with SIGTERM as CTRL-C not sufficient.
This is easy to reproduce. Make a pointcloud of size 200,000 containing all x=y=z=0; Then run StatisticalOutlierRemoval with that cloud as the input. The call to filter() hangs. This happens in 1.5 and 1.7.
I am running 12.04 with ROS Fuerte. Yesterday there was an update released to the official repositories that appears to have broken most (all?) nodes that use pcl libraries in them. I have simple nodes that just call one or two pcl functions, I have launch files that start various filter nodelets, as well as more complicated examples. Every node I have tried crashes. I tried reinstalling all of ROS, rebuilding things, different computers, etc., and nothing has fixed the situation.
To illustrate the typical issue, see the following simple launch file:
<launch>
<arg name="input" default="points" />
<include file="$(find openni_launch)/launch/openni.launch"/>
<!-- launch the nodelet manager -->
<node pkg="nodelet" type="nodelet" name="pcl_manager" args="manager" output="screen"
launch-prefix="gdb -ex run --args"/>
<group ns="/cloud_downsampler">
<node pkg="nodelet" type="nodelet" name="voxel" args="load pcl/VoxelGrid /pcl_manager" output="screen">
<remap from="~input" to="/camera/depth/$(arg input)" />
<rosparam>
filter_field_name: z
filter_limit_min: 0
filter_limit_max: 2.5
fiter_limit_negative: True
leaf_size: 0.01
</rosparam>
</node>
</group>
</launch>
This produces the following output+backtrace as soon as something subscribes to the output of the voxel filter:
Program received signal SIGILL, Illegal instruction.
[Switching to Thread 0x7fffe9ffb700 (LWP 3348)]
0x00007fffd088c933 in pcl::VoxelGrid<sensor_msgs::PointCloud2_<std::allocator<void> > >::applyFilter(sensor_msgs::PointCloud2_<std::allocator<void> >&) ()
from /opt/ros/fuerte/lib/libpcl_filters.so.1.5
[ INFO] [1368045397.119973387]: Bond broken, exiting
[cloud_downsampler/voxel-29] process has finished cleanly
log file: /home/jarvis/.ros/log/efe9d78e-b81e-11e2-9290-0026b914e003/cloud_downsampler-voxel-29*.log
(gdb) bt
#0 0x00007fffd088c933 in pcl::VoxelGrid<sensor_msgs::PointCloud2_<std::allocator<void> > >::applyFilter(sensor_msgs::PointCloud2_<std::allocator<void> >&) ()
from /opt/ros/fuerte/lib/libpcl_filters.so.1.5
#1 0x00007fffd07c6dd8 in pcl::Filter<sensor_msgs::PointCloud2_<std::allocator<void> > >::filter(sensor_msgs::PointCloud2_<std::allocator<void> >&) ()
from /opt/ros/fuerte/lib/libpcl_filters.so.1.5
#2 0x00007fffe859524d in pcl_ros::VoxelGrid::filter (this=0x7bad80, input=..., indices=..., output=...)
at /tmp/buildd/ros-fuerte-perception-pcl-1.2.3/debian/ros-fuerte-perception-pcl/opt/ros/fuerte/stacks/perception_pcl/pcl_ros/src/pcl_ros/filters/voxel_grid.cpp:64
#3 0x00007fffe8509c48 in pcl_ros::Filter::computePublish (this=0x7bad80, input=..., indices=...)
at /tmp/buildd/ros-fuerte-perception-pcl-1.2.3/debian/ros-fuerte-perception-pcl/opt/ros/fuerte/stacks/perception_pcl/pcl_ros/src/pcl_ros/filters/filter.cpp:68
#4 0x00007fffe850aa59 in pcl_ros::Filter::input_indices_callback (this=0x7bad80, cloud=..., indices=...)
at /tmp/buildd/ros-fuerte-perception-pcl-1.2.3/debian/ros-fuerte-perception-pcl/opt/ros/fuerte/stacks/perception_pcl/pcl_ros/src/pcl_ros/filters/filter.cpp:229
#5 0x00007fffe851676a in operator() (a0=..., this=<optimized out>) at /usr/include/boost/function/function_template.hpp:1013
#6 boost::detail::function::void_function_obj_invoker1<boost::function<void (boost::shared_ptr<sensor_msgs::PointCloud2_<std::allocator<void> > const> const&)>, void, boost::shared_ptr<sensor_msgs::PointCloud2_<std::allocator<void> > const> >::invoke(boost::detail::function::function_buffer&, boost::shared_ptr<sensor_msgs::PointCloud2_<std::allocator<void> > const>) (function_obj_ptr=..., a0=...) at /usr/include/boost/function/function_template.hpp:153
#7 0x00007fffe854ad96 in operator() (a0=<error reading variable: access outside bounds of object referenced via synthetic pointer>, this=0x852658)
at /usr/include/boost/function/function_template.hpp:1013
#8 ros::SubscriptionCallbackHelperT<boost::shared_ptr<sensor_msgs::PointCloud2_<std::allocator<void> > const> const&, void>::call (this=0x852650, params=...)
at /opt/ros/fuerte/include/ros/subscription_callback_helper.h:180
#9 0x00007ffff7b861d7 in ros::SubscriptionQueue::call() () from /opt/ros/fuerte/lib/libroscpp.so
#10 0x00007ffff7b38c09 in ros::CallbackQueue::callOneCB(ros::CallbackQueue::TLS*) () from /opt/ros/fuerte/lib/libroscpp.so
#11 0x00007ffff7b39a83 in ros::CallbackQueue::callOne(ros::WallDuration) () from /opt/ros/fuerte/lib/libroscpp.so
#12 0x00007ffff6dc2628 in callOne (this=0x7bcdd0) at /opt/ros/fuerte/include/ros/callback_queue.h:80
#13 nodelet::detail::CallbackQueue::callOne (this=0x7bcdb0)
at /tmp/buildd/ros-fuerte-nodelet-core-1.6.5/debian/ros-fuerte-nodelet-core/opt/ros/fuerte/stacks/nodelet_core/nodelet/src/callback_queue.cpp:78
#14 0x00007ffff6dc3962 in nodelet::detail::CallbackQueueManager::workerThread (this=0x71c230, info=0x7e4f08)
at /tmp/buildd/ros-fuerte-nodelet-core-1.6.5/debian/ros-fuerte-nodelet-core/opt/ros/fuerte/stacks/nodelet_core/nodelet/src/callback_queue_manager.cpp:272
#15 0x00007ffff5471ce9 in thread_proxy () from /usr/lib/libboost_thread.so.1.46.1
#16 0x00007ffff6459e9a in start_thread (arg=0x7fffe9ffb700) at pthread_create.c:308
#17 0x00007ffff6186dbd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#18 0x0000000000000000 in ?? ()
It seems like there might be some incompatibility between the *.so libs packaged with this release? Regardless, this is a major issue! Not absolutely sure if this is the right package/stack/metapackage/repository to be filing the bug report with.
Consider the following program.
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>
void
cloud_cb (const pcl::PointCloud<pcl::PointXY>::ConstPtr& input)
{
ROS_INFO("received a point cloud");
}
int
main (int argc, char** argv)
{
ros::init (argc, argv, "cloud_listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe<pcl::PointCloud<pcl::PointXY> > ("cloud", 1, cloud_cb);
ros::spin ();
}
We can get this program to segfault if we send the following message:
$ rostopic pub /cloud sensor_msgs/PointCloud2 "{'width':0xffffffff, 'height':0xffffffff, 'point_step':1, 'fields':[{'name':'x', 'datatype':7, 'count':1}, {'name':'y', 'datatype':7, 'offset':4, 'count':1}], 'data':[0]}" -1
The current version of pcl_ros/point_cloud.h attempts to guard against such messages with the assertion:
assert(data_size == m.height * m.width * point_step);
All of these variables have type uint32_t
, making the assertion vulnerable to overflows, as the above message shows.
It would be safer to have these two assertions:
assert((uint64_t) row_step == (uint64_t) m.width * point_step);
assert((uint64_t) data_size == (uint64_t) row_step * m.height);
It would perhaps be even better to throw an exception instead of triggering an assert failure here. Then the node would not die on receiving such a message.
Hey,
I just followed the procedure from this website: (http://felixendres.github.io/rgbdslam_v2/) to install rgbdslam, it goes well until the step 4: To build RGBDSLAMv2 go to your catkine workspace and execute "catkin_make".
After I execute "catkin_make", the following errors occurred:
CMake Error at /opt/ros/hydro/share/pcl_ros/cmake/pcl_rosConfig.cmake:106 (message):
Project 'pcl_ros' specifies '/usr/include/ni' as an include dir, which is
not found. It does neither exist as an absolute directory nor in
'/opt/ros/hydro//usr/include/ni'. Ask the maintainer 'Paul Bovbel
<[email protected]>, Bill Morris <[email protected]>' to fix it.
Call Stack (most recent call first):
/opt/ros/hydro/share/catkin/cmake/catkinConfig.cmake:72 (find_package)
rgbdslam_v2/CMakeLists.txt:42 (find_package)
-- Configuring incomplete, errors occurred!
make: *** [cmake_check_build_system] Error 1
Invoking "make cmake_check_build_system" failed
Could anyone provide some suggestions? Thank you so much in advance!
Best,
Lili
The pointcloud_to_laserscan package is not working properly in ROS Indigo. The Indigo build is done recently and seems to contain some error. As required by the node I have published the pointcloud data from Kinect in PointCloud2 format in /cloud_in topic. But the laserscan data that must be produced and published by Kinect in /scan topic seems erroneous. It returns an array full of 'Inf'. Please fix the error.
My code for publishing in /cloud_in is as follows,
#!/usr/bin/env python
import roslib
import rospy
import geometry_msgs.msg
from sensor_msgs.msg import PointCloud2
def callback(data):
pub = rospy.Publisher('/cloud_in', PointCloud2,queue_size=10)
pub.publish(data)
def pcl_2D():
rospy.init_node('pcl_2D', anonymous=True)
global listener
rospy.Subscriber("/camera/depth/points", PointCloud2, callback)
rospy.spin()
if __name__=='__main__':
pcl_2D()
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.