这两天,为了把之前在win7系统下写好的点云分割程序在ROS系统里打包,供其他package调用,依照着官网开始学习pcl_ros.这里,简单记录下自己这两天学习的一点心得.(附:我安装的是ROS Diamondback版本,其他版本请参照之)
1.使用下面语句下载kinect的驱动openni,具体会在电脑的/opt/ros/diamondback/stacks目录(也可以自己定义一个PATH_TO_EXISTING_ROS_TREE)下新建一个openni_kinect的stack,里面包含了nite,openni, openni_camera, openni_ camera _unstable, openni_tracker这四个package.
$ sudo apt-get install ros-diamondback-openni-kinect
打开openni_camera/CMakeLists.txt文件,会看到语句"rosbuild_add_executable (openni_node src/openni_node. cpp)",这说明程序可以成功生成节点openni_node.将kinect连接到电脑上后,打开终端输入以下命令,有:
$ roscore
$ rosrun openni_camera openni_node
$ rostopic list
$ rosrun pcl_ros convert_pointcloud_to_image input:=/camera/rgb/points output:=/camera/rgb/cloud_image
$ rosrun image_view image_view image:=/camera/rgb/cloud_image
$ rxgraph
(进一步的代码实现部分,可以定位到pcl_ros,image_view具体package下的~/src文件夹里面查看源文件),这里需说明的是:当定义其他node来接受openni_node释放的topic,我们只需$rosrun openni_camera openni_node,再在运行当前node时,把input里面的值设置成以上list列表中的参数之一,至于想要publish的消息,就看具体code里面的类型定义了,不用在意openni_node的output;一个小tip:对于如何选择变量,在什么时候需要input:=,output:=,image:=这类输入输出语句对topic进行限定呢(当然,不可能让你在每使用一个现有的package时,都要去仔细阅读它的源码),我自己总结的方法是,在需要使用node1时,我们可以找到对应的package1下~/bin文件夹里面对应的.exe文件,把它拖进终端,回车,这时系统就会告诉你他是否需要参数,或者需要怎样的参数!对初学者很有效哈)
2.一个小小的纠正,在http://www.ros.org/wiki/pcl/Tutorials学习范例时,当运行至以下语句,系统报错.
$ rosrun my_pcl_tutorial example input:=/narrow_stereo_textured/points2
在上面list列表中,并没有发现narrow_stereo_textured这个topic,将input:=/camera/rgb/points代之,则topic正常接收.
3.以下代码段是基础,很有用:
sensor_msgs::PointCloud2 input;pcl::PointCloud<pcl::PointXYZ> cloud1; pcl::fromROSMsg (input, cloud1);sensor_msgs::Image image;pcl::PointCloud<pcl::PointXYZRGB> cloud2;//注意:引入彩色信息pcl::toROSMsg (cloud2,image);