building a map using slam_gmapping

Hello,

I am using ubuntu 14.04 and indigo version.

Also, I used kinect and custom made robot with encoders.

I published laser scan, odom, and tf information and now I'm starting building the map but I faced some problems

This the launch file for publishing laser scan information:

<launch>
<arg name="camera" default="camera"/>
<include file="$(find openni_launch)/launch/openni.launch"> <arg name="camera" default="$(arg camera)"/>
</include>
<node pkg="pointcloud_to_laserscan" type="pointcloud_to_laserscan_node" name="pointcloud_to_laserscan">
<remap from="cloud_in" to="/camera/depth/points"/>
</node>
</launch>


And I can view the laser scans successfully in rviz.

This is the node to publish odom information (the nodes assumes the robot is moving in circle):

#include <ros/ros.h>
#include <nav_msgs/Odometry.h>

int main(int argc, char** argv){
ros::init(argc, argv, "odometry_publisher");

ros::NodeHandle n;
ros::Publisher odom_pub = n.advertise<nav_msgs::Odometry>("odom", 50);

double x = 0.0;
double y = 0.0;
double th = 0.0;

double vx = 0.1;
double vy = -0.1;
double vth = 0.1;

ros::Time current_time, last_time;
current_time = ros::Time::now();
last_time = ros::Time::now();

ros::Rate r(1.0);
while(n.ok()){

ros::spinOnce();               // check for incoming messages
current_time = ros::Time::now();

//compute odometry in a typical way given the velocities of the robot
double dt = (current_time - last_time).toSec();
double delta_x = (vx * cos(th) - vy * sin(th)) * dt;
double delta_y = (vx * sin(th) + vy * cos(th)) * dt;
double delta_th = vth * dt;

x += delta_x;
y += delta_y;
th += delta_th;

//since all odometry is 6DOF we'll need a quaternion created from yaw
geometry_msgs::Quaternion odom_quat = tf::createQuaternionMsgFromYaw(th);

//first, we'll publish the transform over tf
geometry_msgs::TransformStamped odom_trans;

odom_trans.transform.translation.x = x;
odom_trans.transform.translation.y = y;
odom_trans.transform.translation.z = 0.0;
odom_trans.transform.rotation = odom_quat;

//send the transform

//next, we'll publish the odometry message over ROS
nav_msgs::Odometry odom;

//set the position
odom.pose.pose.position.x = x;
odom.pose.pose.position.y = y;
odom.pose.pose.position.z = 0.0;
odom.pose.pose.orientation = odom_quat;

//set the velocity
odom.twist.twist.linear.x = vx;
odom.twist.twist.linear.y = vy;
odom.twist.twist.angular.z = vth;

//publish the message
odom_pub.publish(odom);

last_time = current_time;
r.sleep();
}
}


I followed the steps in this tutorial

When I reached this command : rosbag play --clock mylaserdata.bag the other terminal gives this error:

Warning: TF_OLD_DATA ignoring data from the past for frame base_laser at time 1.4273e+09 according to authority unknown_publisher
Possible reasons are listed at http://wiki.ros.org/tf/Errors%20explained
at line 260 in /tmp/buildd/ros-indigo-tf2-0.5.7-0trusty-20141230-0040/src/buffer_core.cpp


Also, after typing this command: rosrun map_server map_saver it says Waiting for the map and didn't do any thing.

UPDATE:

I used robot_state_publisher package to publish the TF

and this is the TF of the robot:

edit retag close merge delete

Sort by » oldest newest most voted

Dear nouf,

did you remember to set use_sim_time param to true?

rosparam set use_sim_time true


Please note that your odometry publisher node has a problem in main loop:

ros::spinOnce();

[...]

[...]

odom_pub.publish(odom);

r.sleep();


Following execution flow you:

• publish odom topic;
• wait for rate;
• invoke ros::spinOnce().

I remember you that tf and topics are not really published until you invoke ros::spinOnce(): so, basically, you are publishing this information with one second delay. I suggest you to move ros::spinOnce() just after odom topic publisher line.

Hope this help...

UPDATE

First: I suggest you to modify your code in order to have tf published in right way. Further more you are broadcasting odom -> base_link transformation with at 1Hz rate and base_link -> base_laser transformation at 100Hz and this is not a good practice. I cannot tell you that this will fix your problem but you should fix them before go on.

Second: run

rosrun tf view_frames


and

roswtf


The first will create a PDF contains the tf tree pf your robot: you can us it in order to be sure tf chain is not broken. The second will start some automatic diagnostic tool in order to check your transformation health status.

UPDATE

Sorry for late reply.... there a lot of inconsistence in your tf tree:

• map -> odom transformation is missing. This should be provided by gmapping so if it was not running when you get view frames this is ok;
• posted log refer to a base_laser frame but in your tf tree you named it laser_link (I assume both them refer to laser frame of course :-) );
• base_link -> camera_link transformation is missing. If should be provided by robot_state_publisher too.

Try to fix those issues. Can you also post output from roswtf?

more

Yes I did set use_sim_time to true. and thank you for your suggestion. Although I think there is problem somewhere in TF. I think I missed something because I really got confused reading about it. I read all the tutorials and explanations in wiki.ros but I didn't get full understanding!

( 2015-03-27 12:19:59 -0500 )edit

May you please explain in brief what should I do in steps regarding TF? Thank you

( 2015-03-27 12:20:51 -0500 )edit

May you please see the update?

( 2015-03-28 06:08:15 -0500 )edit