ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

lakshmen's profile - activity

2017-11-16 10:15:53 -0500 received badge  Nice Question (source)
2017-10-05 02:29:53 -0500 received badge  Student (source)
2014-04-20 06:47:39 -0500 marked best answer Getting point cloud data from the kinect

hi guys, i am new to kinect. I need point cloud data from the depth camera in kinect. Any of you have any idea how to go about doing it? i am using ROS diamondback and Ubuntu.

2014-01-28 17:22:30 -0500 marked best answer How does cloud_to_laserscan.cpp work

I have some more qns regarding cloud_to_scan.cpp. the post was previously posted[http://answers.ros.org/question/1561/doubts-about-pointcloud-to-laser-scan] but it was not answered. I am in need of urgent help.

Qn 1)if (output->ranges[index] * output->ranges[index] > range_sq) output->ranges[index] = sqrt(range_sq);, what is this statement trying to do.. not that sure...

qn 2) is the x, y and z in metres?or what are the units for the x,y and z?

qn 3) why is the angle = -atan2(x,z) and not angle = -atan2(z,x)

2014-01-28 17:22:28 -0500 marked best answer From Laserscan to obstacle avoidance

I have got the laser scan from the kinect using the openni_driver. Now i would like to use it for obstacle avoidance. For obstacle avoidance, i am using vector field histogram. Any suggestions or directions i could take?

2014-01-28 17:22:26 -0500 marked best answer Doubts about pointcloud to laser scan

I was referred to this code previously. I have some doubts about this code, like to clarify some of them.

#include "ros/ros.h"
#include "pluginlib/class_list_macros.h"
#include "nodelet/nodelet.h"
#include "sensor_msgs/LaserScan.h"
#include "pcl/point_cloud.h"
#include "pcl_ros/point_cloud.h"
#include "pcl/point_types.h"
#include "pcl/ros/conversions.h"




namespace pointcloud_to_laserscan
{
typedef pcl::PointCloud<pcl::PointXYZ> PointCloud;

class CloudToScan : public nodelet::Nodelet
{
public:
  //Constructor
  CloudToScan(): min_height_(0.10), max_height_(0.15), u_min_(100), u_max_(150), output_frame_id_("/openi_depth_frame")
  {
  };

private:
  virtual void onInit()
  {
    ros::NodeHandle& nh = getNodeHandle();
    ros::NodeHandle& private_nh = getPrivateNodeHandle();

    private_nh.getParam("min_height", min_height_);
    private_nh.getParam("max_height", max_height_);

    private_nh.getParam("row_min", u_min_);
    private_nh.getParam("row_max", u_max_);

    private_nh.getParam("output_frame_id", output_frame_id_);
    pub_ = nh.advertise<sensor_msgs::LaserScan>("scan", 10);
    sub_ = nh.subscribe<PointCloud>("cloud", 10, &CloudToScan::callback, this);
  };

  void callback(const PointCloud::ConstPtr& cloud)
  {
    sensor_msgs::LaserScanPtr output(new sensor_msgs::LaserScan());
    NODELET_DEBUG("Got cloud");
    //Copy Header
    output->header = cloud->header;
    output->header.frame_id = output_frame_id_;
    output->angle_min = -M_PI/2;
    output->angle_max = M_PI/2;
    output->angle_increment = M_PI/180.0/2.0;
    output->time_increment = 0.0;
    output->scan_time = 1.0/30.0;
    output->range_min = 0.45;
    output->range_max = 10.0;

    uint32_t ranges_size = std::ceil((output->angle_max - output->angle_min) / output->angle_increment);
    output->ranges.assign(ranges_size, output->range_max + 1.0);

    //pcl::PointCloud<pcl::PointXYZ> cloud;
    //pcl::fromROSMsg(*input, cloud);

    for (PointCloud::const_iterator it = cloud->begin(); it != cloud->end(); ++it)
    {
      const float &x = it->x;
      const float &y = it->y;
      const float &z = it->z;

    /*    for (uint32_t u = std::max((uint32_t)u_min_, 0U); u < std::min((uint32_t)u_max_, cloud.height - 1); u++)
      for (uint32_t v = 0; v < cloud.width -1; v++)
      {
        //NODELET_ERROR("%d %d,  %d %d", u, v, cloud.height, cloud.width);
        pcl::PointXYZ point = cloud.at(v,u); ///WTF Column major?
        const float &x = point.x;
        const float &y = point.y;
        const float &z = point.z;
    */  

      if ( std::isnan(x) || std::isnan(y) || std::isnan(z) )
      {
        NODELET_DEBUG("rejected for nan in point(%f, %f, %f)\n", x, y, z);
        continue;  
      }
      if (-y > max_height_ || -y < min_height_)
      {
        NODELET_DEBUG("rejected for height %f not in range (%f, %f)\n", x, min_height_, max_height_);
        continue;
      }
      double angle = -atan2(x, z);
      if (angle < output->angle_min || angle > output->angle_max)
      {
        NODELET_DEBUG("rejected for angle %f not in range (%f, %f)\n", angle, output->angle_min, output->angle_max);
        continue;
      }
      int index = (angle - output->angle_min) / output->angle_increment;
      //printf ("index xyz( %f %f %f) angle %f index %d\n", x, y, z, angle, index);
      double range_sq = z*z+x*x;
      if (output->ranges[index] * output->ranges[index] > range_sq)
        output->ranges[index] = sqrt(range_sq);


      }

    pub_.publish(output);
  }


  double min_height_, max_height_;
  int32_t u_min_, u_max_;
  std::string output_frame_id_;

  ros::Publisher pub_;
  ros::Subscriber sub_;

};


PLUGINLIB_DECLARE_CLASS(pointcloud_to_laserscan, CloudToScan, pointcloud_to_laserscan::CloudToScan, nodelet::Nodelet);
}

1) where does the M_PI/2 in the angle_min and angle_max come from?

2) why is it range_sq = x^2 + z^2? shldnt it be range_sq = y^2 + z^2?

correct me if i am wrong.. if x is the horizontal and y is the vertical, then z shld be in the negative direction(coming out of the image ... (more)

2014-01-28 17:22:26 -0500 marked best answer Problem launching pointcloud to laserscan

I am not able to launch the pointcloud to laserscan. I did this following steps:

1)launched the openni_camera by typing roslaunch openni_camera openni_node.launch

2)launched the pointcloud to laserscan by typing roslaunch pointcloud_to_laserscan kinect_laser.launch

3)ran rviz by typing rosrun rviz rviz

I am able to see the point cloud but I am not able to see the laser_scan. I was referring to this question,http://answers.ros.org/question/417/how-to-setup-pointcloud_to_laserscan. I am supposed to see /scan topic but i am not able to see it.

Am i supposed to change /openni_depth_frame?

Or what steps i shld take? Any suggestions?

Just like to check with you all.. is this sometime like this i should get?C:\fakepath\Screenshot-RViz-1.png

2014-01-28 17:22:25 -0500 marked best answer From point cloud to laser scan

Hi i can get the point cloud data from the OpenNI driver now, like to convert it into a laser scan.How do you do it? Any suggestions or directions that i can take?

2014-01-28 17:22:24 -0500 marked best answer Publishing data using OpenNI

Hi guys,

Although, i am able to find the depth pointer and find the depth value. Now i need to publish the data and want to visualize the point cloud in Rviz. I have written a code and would like to have your opinions.

    /* OpenCV Includes */
#include "opencv2\opencv.hpp"
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\imgproc\imgproc.hpp"

/* OpenNI Includes */
#include <XnCppWrapper.h>
#include <XnOpenNI.h>
#include <XnLog.h>
#include <XnOS.h>

/* PCL Includes */
#include "pcl/ModelCoefficients.h"
#include "pcl/console/parse.h"
#include "pcl/console/print.h"
#include "pcl/io/pcd_io.h"
#include "pcl/point_types.h"
#include <pcl/features/cvfh.h>
#include <pcl/features/vfh.h>
#include <pcl/features/normal_3d.h>
#include "pcl/filters/extract_indices.h"
#include "pcl/filters/passthrough.h"
#include "pcl/filters/statistical_outlier_removal.h"
#include "pcl/kdtree/kdtree.h"
#include "pcl/sample_consensus/method_types.h"
#include "pcl/sample_consensus/model_types.h"
#include "pcl/segmentation/sac_segmentation.h"
#include "pcl/segmentation/extract_clusters.h"
#include <boost/filesystem.hpp>

/* ROS Includes */
#include <ros/ros.h>
#include <pcl_ros/point_cloud.h>
#include <pcl/point_types.h>

#define SAMPLE_XML_PATH "C:/Program Files (x86)/OpenNI/Data/SamplesConfig.xml"
#define X_RES 640
#define Y_RES 480
#define MAX_DEPTH 10000

using namespace std;
using namespace xn;
using namespace pcl::console;

/* Globals */
Context         context;
ImageGenerator      g_image;
DepthGenerator      d_image;
ImageMetaData       g_imageMD;
EnumerationErrors   errors;
XnStatus        nRetVal = XN_STATUS_OK;
unsigned short      depth[MAX_DEPTH];
char *depth_data;

/* Typedefs */
typedef pcl::PointCloud<pcl::PointXYZRGBNormal> PointCloud;

void raw2depth(){
  for (int i=0; i<MAX_DEPTH; i++) {
  float v = (float)i/MAX_DEPTH;//for visualization purposes only
  v = powf(v, 2);
  v = v*36*256;
  depth[i] = v;
  }
}

void depth2rgb(const XnDepthPixel* Xn_disparity){
  for (int i=0; i<307200; i++) {
    int pval = depth[Xn_disparity[i]];
    int lb = pval & 0xff;
    switch (pval>>8) {
      case 0:
        depth_data[3*i+0] = 255;
        depth_data[3*i+1] = 255;
        depth_data[3*i+2] = 255-lb;
        break;
      case 1:
        depth_data[3*i+0] = 255;
        depth_data[3*i+1] = lb;
        depth_data[3*i+2] = 0;
        break;
      case 2:
        depth_data[3*i+0] = 255-lb;
        depth_data[3*i+1] = 255;
        depth_data[3*i+2] = 0;
        break;
      case 3:
        depth_data[3*i+0] = 0;
        depth_data[3*i+1] = 255;
        depth_data[3*i+2] = lb;
        break;
      case 4:
        depth_data[3*i+0] = 0;
        depth_data[3*i+1] = 255-lb;
        depth_data[3*i+2] = 255;
        break;
      case 5:
        depth_data[3*i+0] = 0;
        depth_data[3*i+1] = 0;
        depth_data[3*i+2] = 255-lb;
        break;
      default:
        depth_data[3*i+0] = 0;
        depth_data[3*i+1] = 0;
        depth_data[3*i+2] = 0;
        break;
    }
  }
}


void rgbdInit(){
  //Initialize context object
  nRetVal = context.Init();
  if (nRetVal != XN_STATUS_OK){
    print_error("Failed to initialize context: %s\n", xnGetStatusString(nRetVal));
  }

  // Create a DepthGenerator node
  nRetVal = d_image.Create(context);
  if (nRetVal != XN_STATUS_OK){
    print_error("Failed to create depth generator: %s\n", xnGetStatusString(nRetVal));
  }

  // Create a ImageGenerator node
  nRetVal = g_image.Create(context);
  if (nRetVal != XN_STATUS_OK){
    print_error("Failed to create image generator: %s\n", xnGetStatusString(nRetVal));
  }

  // Make it start generating data
  nRetVal = context.StartGeneratingAll();
  if (nRetVal != XN_STATUS_OK){
    print_error("Failed generating data: %s\n", xnGetStatusString(nRetVal));
  }

/*  //Sync the DepthGenerator with the ImageGenerator
  nRetVal = d_image.GetFrameSyncCap().FrameSyncWith(g_image);
  if (nRetVal ...
(more)
2014-01-28 17:22:24 -0500 marked best answer Problem with opencv2

i need to include the following files:

#include "opencv2\opencv.hpp"
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\imgproc\imgproc.hpp"

but i always get this error. Opencv2\opencv.hpp: No such file or directory

what shld i do?

will adding this line <depend package="opencv2"/> solve the problem?

2014-01-28 17:22:23 -0500 marked best answer Problem setting fixed frame in Rviz.

I am already able to publish the data, in the sense that when i type the rostopic hz -> i get the topic that i am publishing. But have difficulty visualizing the data and moreover, i can't select anything under fixed frame and target frame.there is a global warning saying that is no tf data and that Fixed Frame does not exist. I now know i need to have to a launch file that converts static_transform_publisher from /world to /kinect_depth and set the fixed frame to /kinect_depth.

1)i am not sure where to add this file to?

2) there is a statement args = " 0 0 1.10 -1.57 0 -1.57 /world /kinect_rgb 10" what does the 10 stand for and what are the other values(such as 0, 1.1) for?

having those two questions answered, i got a few more to ask( i apologise if the qns are wrong)..

3) what should i type to launch the kinect_camera. is it roslaunch kinect_camera kinect_with_tf.launch? if so, it is wrong to type roscore only? 4) must u have always have a launch file? can u work without a launch file?

5)is better to use tf::transformbroadcaster or it is better to use just launch file?

Please pardon me for the qns.. i am newbie in ROS, point cloud. Any help would be much appreciated.. thanks...

for env | grep ROS i get

ROS_ROOT=/opt/ros/diamondback/ros
ROS_PACKAGE_PATH=/opt/ros/diamondback/stacks:/home/user/workspace
ROS_MASTER_URI=http://localhost:11311
2014-01-28 17:22:18 -0500 marked best answer How to obtain the R and T of the kinect camera?

I am not sure how to obtain the Rotation(R) and Translation(T) matrices for the kinect camera. How can i find it?

2014-01-28 17:22:18 -0500 marked best answer How to construct the point cloud data from the depth data

I have already acheived the depth data from the Kinect using the openkinect driver. I have already got the data for the x, y and z of the point cloud.Now, I need to plot point cloud data and would like to visualize it in rviz.How do i go about doing it?

Any help would be appreciated..

2014-01-28 17:22:15 -0500 marked best answer Getting Point cloud data from Openni driver

Previously, I posted how to get started on the point cloud data for the Openni. Many of you posted that i need to get through the tutorials for ROS to have a better understanding. I have done that now.One posted this code(for the subscriber) for me... which was very helpful.I have some qns on this code: 1) We need to have both a publisher and subscriber node for the Kinect in order to get point cloud data.Am i right to say that? 2) how do u get the depth data from the point cloud data?

Really need of help. I am sorry if i ask stupid questions.

    #include <ros/ros.h>
    #include <pcl_ros/point_cloud.h>
    #include <sensor_msgs/PointCloud2.h>

using namespace ros;
using namespace sensor_msgs;

class processPoint {
    NodeHandle nh;
    Subscriber sub;

public:
    processPoint() {
        sub = nh.subscribe<sensor_msgs::PointCloud2>("/camera/rgb/points", 1, &processPoint::processCloud, this);
    }

    ~processPoint() {   
     }

    void processCloud( const sensor_msgs::PointCloud2ConstPtr& cloud );
};

void processPoint::processCloud( const sensor_msgs::PointCloud2ConstPtr& cloud ) {

}

int main(int argc, char **argv) {

    init(argc, argv, "processPoint");

    processPoint processPoint;

    Rate spin_rate(1);

    while( ok() ) {
        spinOnce();

        spin_rate.sleep();
    }
}
2014-01-28 17:22:14 -0500 marked best answer Problem with installing the Openni_kinect

when i try to install the openni_kinect, i face a few problems...

when i type: rosinstall ~/openni_kinect PATH_TO_EXISTING_ROS_TREE 'http://www.ros.org/wiki/openni_kinect?action=AttachFile&do=get&target=openni_kinect.rosinstall'

i get this as the answer: E: rosinstall operating on /home/user/openni_kinect from specifications in rosinstall files PATH_TO_EXISTING_ROS_TREE, http://www.ros.org/wiki/openni_kinect... ahhhh error opening file: [Errno 2] No such file or directory: '/home/user/drivers/PATH_TO_EXISTING_ROS_TREE' Usage: rosinstall PATH [ ...] [URI]...

rosinstall: error: None

what should i do?

2014-01-28 17:22:12 -0500 marked best answer Kinect Depth calculation

Sorry guys, i am desperate for answer. That is why i didn't follow the rules of this website. I sincerly apologise. For this code, i have come up with a better one. float cx = 320.0; float cy = 240.0; float minDistance = -10; float scaleFactor = 0.0021;

for (int v=0, n=0 ; v<480 ; v++) 
    {
        for (int u=0 ; u<640 ; u++, n++)
        {
                Vec3f result;
                result.x = float(((u - cx) * t_gamma[depth[n]]+ minDistance)   * scaleFactor * (cx/cy));
                result.y = float(((v - cy) * t_gamma[depth[n]]+ minDistance)   * scaleFactor);
                result.z = float(t_gamma[depth[n]]);


        }

    }   


// OS X requires GLUT to run on the main thread
gl_threadfunc(NULL);


return 0;

} is this code better? i have tried to save the depth data but all the data is zero. I don't know where is the problem?

2014-01-28 17:22:11 -0500 marked best answer Vector field histogram.

Any of you have used vector field histogram?I am trying to combine the Kinect and the vector field histogram but not sure how to do it. Any help would be appreciated.