Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
homer_mapping
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
robbie
homer_mapping
Commits
13f45761
Commit
13f45761
authored
8 years ago
by
Florian Polster
Browse files
Options
Downloads
Patches
Plain Diff
refactor
parent
b849769a
No related branches found
No related tags found
1 merge request
!4
Recent changes
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
homer_mapping/include/homer_mapping/slam_node.h
+8
-2
8 additions, 2 deletions
homer_mapping/include/homer_mapping/slam_node.h
homer_mapping/src/slam_node.cpp
+85
-127
85 additions, 127 deletions
homer_mapping/src/slam_node.cpp
with
93 additions
and
129 deletions
homer_mapping/include/homer_mapping/slam_node.h
+
8
−
2
View file @
13f45761
...
@@ -93,12 +93,19 @@ private:
...
@@ -93,12 +93,19 @@ private:
*/
*/
void
sendMapDataMessage
(
ros
::
Time
mapTime
=
ros
::
Time
::
now
());
void
sendMapDataMessage
(
ros
::
Time
mapTime
=
ros
::
Time
::
now
());
void
sendTfAndPose
(
Pose
pose
);
void
sendPoseArray
(
std
::
vector
<
Pose
>*
poses
);
Pose
getInterpolatedPose
(
nav_msgs
::
Odometry
::
ConstPtr
pose1
,
nav_msgs
::
Odometry
::
ConstPtr
pose2
,
ros
::
Time
laserTime
);
/**
/**
* This variables stores the last odometry measurement as reference that is
* This variables stores the last odometry measurement as reference that is
* used
* used
* to compute the pose of the robot during a specific laserscan.
* to compute the pose of the robot during a specific laserscan.
*/
*/
Pose
m_ReferenceOdometryPose
;
Pose
m_lastUsedPose
;
Pose
m_lastUsedPose
;
Pose
m_LastLikeliestPose
;
Pose
m_LastLikeliestPose
;
...
@@ -117,7 +124,6 @@ private:
...
@@ -117,7 +124,6 @@ private:
*/
*/
ros
::
Time
m_LastMapSendTime
;
ros
::
Time
m_LastMapSendTime
;
/**
/**
* This variable stores a pointer to the hyper slam filter
* This variable stores a pointer to the hyper slam filter
*/
*/
...
...
This diff is collapsed.
Click to expand it.
homer_mapping/src/slam_node.cpp
+
85
−
127
View file @
13f45761
...
@@ -33,26 +33,8 @@ SlamNode::SlamNode(ros::NodeHandle* nh) : m_HyperSlamFilter(0)
...
@@ -33,26 +33,8 @@ SlamNode::SlamNode(ros::NodeHandle* nh) : m_HyperSlamFilter(0)
m_SLAMMapPublisher
=
m_SLAMMapPublisher
=
nh
->
advertise
<
nav_msgs
::
OccupancyGrid
>
(
"/homer_mapping/slam_map"
,
1
);
nh
->
advertise
<
nav_msgs
::
OccupancyGrid
>
(
"/homer_mapping/slam_map"
,
1
);
geometry_msgs
::
PoseStamped
poseMsg
;
sendTfAndPose
(
Pose
(
0
,
0
,
0
));
poseMsg
.
header
.
stamp
=
ros
::
Time
(
0
);
m_HyperSlamFilter
->
setRobotPose
(
Pose
(
0
,
0
,
0
),
m_ScatterVarXY
,
poseMsg
.
header
.
frame_id
=
"map"
;
poseMsg
.
pose
.
position
.
x
=
0.0
;
poseMsg
.
pose
.
position
.
y
=
0.0
;
poseMsg
.
pose
.
position
.
z
=
0.0
;
tf
::
Quaternion
quatTF
=
tf
::
createQuaternionFromYaw
(
0.0
);
geometry_msgs
::
Quaternion
quatMsg
;
tf
::
quaternionTFToMsg
(
quatTF
,
quatMsg
);
// conversion from tf::Quaternion
// to
poseMsg
.
pose
.
orientation
=
quatMsg
;
m_PoseStampedPublisher
.
publish
(
poseMsg
);
//// //broadcast transform map -> base_link
tf
::
Transform
transform
(
quatTF
,
tf
::
Vector3
(
0.0
,
0.0
,
0.0
));
m_tfBroadcaster
.
sendTransform
(
tf
::
StampedTransform
(
transform
,
poseMsg
.
header
.
stamp
,
"map"
,
"base_link"
));
Pose
userdef_pose
(
poseMsg
.
pose
.
position
.
x
,
poseMsg
.
pose
.
position
.
y
,
tf
::
getYaw
(
poseMsg
.
pose
.
orientation
));
m_HyperSlamFilter
->
setRobotPose
(
userdef_pose
,
m_ScatterVarXY
,
m_ScatterVarTheta
);
m_ScatterVarTheta
);
}
}
...
@@ -93,29 +75,12 @@ void SlamNode::resetMaps()
...
@@ -93,29 +75,12 @@ void SlamNode::resetMaps()
m_HyperSlamFilter
=
0
;
m_HyperSlamFilter
=
0
;
init
();
init
();
geometry_msgs
::
PoseStamped
poseMsg
;
sendTfAndPose
(
Pose
(
0
,
0
,
0
));
poseMsg
.
header
.
stamp
=
ros
::
Time
::
now
();
poseMsg
.
header
.
frame_id
=
"map"
;
poseMsg
.
pose
.
position
.
x
=
0.0
;
poseMsg
.
pose
.
position
.
y
=
0.0
;
poseMsg
.
pose
.
position
.
z
=
0.0
;
tf
::
Quaternion
quatTF
=
tf
::
createQuaternionFromYaw
(
0.0
);
geometry_msgs
::
Quaternion
quatMsg
;
tf
::
quaternionTFToMsg
(
quatTF
,
quatMsg
);
// conversion from tf::Quaternion
// to
poseMsg
.
pose
.
orientation
=
quatMsg
;
m_PoseStampedPublisher
.
publish
(
poseMsg
);
m_LastLikeliestPose
.
set
(
0.0
,
0.0
);
m_LastLikeliestPose
.
set
(
0.0
,
0.0
);
m_LastLikeliestPose
.
setTheta
(
0.0
f
);
m_LastLikeliestPose
.
setTheta
(
0.0
f
);
//// //broadcast transform map -> base_link
m_HyperSlamFilter
->
setRobotPose
(
Pose
(
0
,
0
,
0
),
m_ScatterVarXY
,
tf
::
Transform
transform
(
quatTF
,
tf
::
Vector3
(
0.0
,
0.0
,
0.0
));
m_tfBroadcaster
.
sendTransform
(
tf
::
StampedTransform
(
transform
,
poseMsg
.
header
.
stamp
,
"map"
,
"base_link"
));
Pose
userdef_pose
(
poseMsg
.
pose
.
position
.
x
,
poseMsg
.
pose
.
position
.
y
,
tf
::
getYaw
(
poseMsg
.
pose
.
orientation
));
m_HyperSlamFilter
->
setRobotPose
(
userdef_pose
,
m_ScatterVarXY
,
m_ScatterVarTheta
);
m_ScatterVarTheta
);
// sendMapDataMessage();
// sendMapDataMessage();
...
@@ -172,6 +137,49 @@ void SlamNode::callbackLaserScan(const sensor_msgs::LaserScan::ConstPtr& msg)
...
@@ -172,6 +137,49 @@ void SlamNode::callbackLaserScan(const sensor_msgs::LaserScan::ConstPtr& msg)
}
}
}
}
void
SlamNode
::
sendTfAndPose
(
Pose
pose
)
{
geometry_msgs
::
PoseStamped
poseMsg
;
poseMsg
.
header
.
stamp
=
ros
::
Time
(
0
);
poseMsg
.
header
.
frame_id
=
"map"
;
poseMsg
.
pose
.
position
.
x
=
pose
.
x
();
poseMsg
.
pose
.
position
.
y
=
pose
.
y
();
poseMsg
.
pose
.
position
.
z
=
0.0
;
tf
::
Quaternion
quatTF
=
tf
::
createQuaternionFromYaw
(
pose
.
theta
());
geometry_msgs
::
Quaternion
quatMsg
;
tf
::
quaternionTFToMsg
(
quatTF
,
quatMsg
);
// conversion from tf::Quaternion
// to
poseMsg
.
pose
.
orientation
=
quatMsg
;
m_PoseStampedPublisher
.
publish
(
poseMsg
);
//// //broadcast transform map -> base_link
tf
::
Transform
transform
(
quatTF
,
tf
::
Vector3
(
pose
.
x
(),
pose
.
y
(),
0.0
));
m_tfBroadcaster
.
sendTransform
(
tf
::
StampedTransform
(
transform
,
poseMsg
.
header
.
stamp
,
"map"
,
"base_link"
));
}
void
SlamNode
::
sendPoseArray
(
std
::
vector
<
Pose
>*
poses
)
{
// Pose Array publishing
geometry_msgs
::
PoseArray
poseArray
=
geometry_msgs
::
PoseArray
();
poseArray
.
header
.
stamp
=
ros
::
Time
::
now
();
poseArray
.
header
.
frame_id
=
"/map"
;
for
(
int
i
=
0
;
i
<
poses
->
size
();
i
++
)
{
geometry_msgs
::
Pose
tmpPose
=
geometry_msgs
::
Pose
();
tmpPose
.
position
.
x
=
poses
->
at
(
i
).
x
();
tmpPose
.
position
.
y
=
poses
->
at
(
i
).
y
();
tf
::
Quaternion
quatTF
=
tf
::
createQuaternionFromYaw
(
poses
->
at
(
i
).
theta
());
geometry_msgs
::
Quaternion
quatMsg
;
tf
::
quaternionTFToMsg
(
quatTF
,
quatMsg
);
tmpPose
.
orientation
=
quatMsg
;
poseArray
.
poses
.
push_back
(
tmpPose
);
}
delete
poses
;
m_PoseArrayPublisher
.
publish
(
poseArray
);
}
void
SlamNode
::
callbackOdometry
(
const
nav_msgs
::
Odometry
::
ConstPtr
&
msg
)
void
SlamNode
::
callbackOdometry
(
const
nav_msgs
::
Odometry
::
ConstPtr
&
msg
)
{
{
m_odom_queue
.
push_back
(
msg
);
m_odom_queue
.
push_back
(
msg
);
...
@@ -226,44 +234,12 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg)
...
@@ -226,44 +234,12 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg)
last_i
=
i
;
last_i
=
i
;
sensor_msgs
::
LaserScan
::
ConstPtr
laserData
=
m_laser_queue
.
at
(
j
);
sensor_msgs
::
LaserScan
::
ConstPtr
laserData
=
m_laser_queue
.
at
(
j
);
float
odoX
=
m_odom_queue
.
at
(
i
)
->
pose
.
pose
.
position
.
x
;
last_interpolatedPose
=
getInterpolatedPose
(
float
odoY
=
m_odom_queue
.
at
(
i
)
->
pose
.
pose
.
position
.
y
;
m_odom_queue
.
at
(
i
-
1
),
m_odom_queue
.
at
(
i
),
laserData
->
header
.
stamp
);
float
odoTheta
=
tf
::
getYaw
(
m_odom_queue
.
at
(
i
)
->
pose
.
pose
.
orientation
);
Pose
currentOdometryPose
(
odoX
,
odoY
,
odoTheta
);
currentOdometryTime
=
m_odom_queue
.
at
(
i
)
->
header
.
stamp
;
odoX
=
m_odom_queue
.
at
(
i
-
1
)
->
pose
.
pose
.
position
.
x
;
odoY
=
m_odom_queue
.
at
(
i
-
1
)
->
pose
.
pose
.
position
.
y
;
odoTheta
=
tf
::
getYaw
(
m_odom_queue
.
at
(
i
-
1
)
->
pose
.
pose
.
orientation
);
Pose
lastOdometryPose
(
odoX
,
odoY
,
odoTheta
);
m_ReferenceOdometryPose
=
lastOdometryPose
;
m_ReferenceOdometryTime
=
m_odom_queue
.
at
(
i
-
1
)
->
header
.
stamp
;
// laserscan in between current odometry reading and
// m_ReferenceOdometry
// -> calculate pose of robot during laser scan
ros
::
Duration
d1
=
laserData
->
header
.
stamp
-
m_ReferenceOdometryTime
;
ros
::
Duration
d2
=
currentOdometryTime
-
m_ReferenceOdometryTime
;
float
timeFactor
;
if
(
d1
.
toSec
()
==
0.0
)
{
timeFactor
=
0.0
f
;
}
else
if
(
d2
.
toSec
()
==
0.0
)
{
timeFactor
=
1.0
f
;
}
else
{
timeFactor
=
d1
.
toSec
()
/
d2
.
toSec
();
}
last_interpolatedPose
=
m_ReferenceOdometryPose
.
interpolate
(
currentOdometryPose
,
timeFactor
);
Transformation2D
trans
=
last_interpolatedPose
-
m_lastUsedPose
;
Transformation2D
trans
=
last_interpolatedPose
-
m_lastUsedPose
;
// Rotate transformation to pose theta
float
x
=
trans
.
x
()
*
cos
(
-
last_interpolatedPose
.
theta
())
-
float
x
=
trans
.
x
()
*
cos
(
-
last_interpolatedPose
.
theta
())
-
trans
.
y
()
*
sin
(
-
last_interpolatedPose
.
theta
());
trans
.
y
()
*
sin
(
-
last_interpolatedPose
.
theta
());
float
y
=
trans
.
y
()
*
cos
(
-
last_interpolatedPose
.
theta
())
+
float
y
=
trans
.
y
()
*
cos
(
-
last_interpolatedPose
.
theta
())
+
...
@@ -278,14 +254,7 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg)
...
@@ -278,14 +254,7 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg)
m_LastLikeliestPose
=
m_LastLikeliestPose
=
m_HyperSlamFilter
->
getBestSlamFilter
()
->
getLikeliestPose
();
m_HyperSlamFilter
->
getBestSlamFilter
()
->
getLikeliestPose
();
// broadcast transform map -> base_link
sendTfAndPose
(
m_LastLikeliestPose
);
tf
::
Transform
transform
(
tf
::
createQuaternionFromYaw
(
m_LastLikeliestPose
.
theta
()),
tf
::
Vector3
(
m_LastLikeliestPose
.
x
(),
m_LastLikeliestPose
.
y
(),
0.0
));
tf
::
TransformBroadcaster
tfBroadcaster
;
tfBroadcaster
.
sendTransform
(
tf
::
StampedTransform
(
transform
,
laserData
->
header
.
stamp
,
"/map"
,
"/base_link"
));
// send map max. every 500 ms
// send map max. every 500 ms
if
((
laserData
->
header
.
stamp
-
m_LastMapSendTime
).
toSec
()
>
0.5
)
if
((
laserData
->
header
.
stamp
-
m_LastMapSendTime
).
toSec
()
>
0.5
)
...
@@ -293,58 +262,47 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg)
...
@@ -293,58 +262,47 @@ void SlamNode::callbackOdometry(const nav_msgs::Odometry::ConstPtr& msg)
sendMapDataMessage
(
laserData
->
header
.
stamp
);
sendMapDataMessage
(
laserData
->
header
.
stamp
);
m_LastMapSendTime
=
laserData
->
header
.
stamp
;
m_LastMapSendTime
=
laserData
->
header
.
stamp
;
}
}
sendPoseArray
(
m_HyperSlamFilter
->
getBestSlamFilter
()
->
getParticlePoses
());
}
}
}
}
Pose
currentPose
=
m_LastLikeliestPose
;
}
// currentPose.setX(currentPose.x() - last_interpolatedPose.x());
// currentPose.setY(currentPose.y() - last_interpolatedPose.y());
// currentPose.setTheta(currentPose.theta() -
// last_interpolatedPose.theta());
// Add up Transformations
// for (int i = (last_i - 1 < 0 ? 0 : last_i - 1); i < m_odom_queue.size();
// i++)
//{
// currentPose.setX(currentPose.x() +
// m_odom_queue.at(i)->twist.twist.linear.x);
// currentPose.setY(currentPose.y() +
// m_odom_queue.at(i)->twist.twist.linear.y);
// currentPose.setTheta(currentPose.theta() +
// m_odom_queue.at(i)->twist.twist.angular.z);
//}
// Pose Publishing
Pose
SlamNode
::
getInterpolatedPose
(
nav_msgs
::
Odometry
::
ConstPtr
pose1
,
geometry_msgs
::
PoseStamped
poseMsg
;
nav_msgs
::
Odometry
::
ConstPtr
pose2
,
poseMsg
.
header
.
stamp
=
msg
->
header
.
stamp
;
ros
::
Time
laserTime
)
poseMsg
.
header
.
frame_id
=
"map"
;
{
poseMsg
.
pose
.
position
.
x
=
currentPose
.
x
();
ros
::
Time
currentOdometryTime
=
pose2
->
header
.
stamp
;
poseMsg
.
pose
.
position
.
y
=
currentPose
.
y
();
ros
::
Time
lastOdometryTime
=
pose1
->
header
.
stamp
;
poseMsg
.
pose
.
position
.
z
=
0.0
;
tf
::
Quaternion
quatTF
=
tf
::
createQuaternionFromYaw
(
currentPose
.
theta
());
geometry_msgs
::
Quaternion
quatMsg
;
tf
::
quaternionTFToMsg
(
quatTF
,
quatMsg
);
poseMsg
.
pose
.
orientation
=
quatMsg
;
m_PoseStampedPublisher
.
publish
(
poseMsg
);
// Pose Array publishing
Pose
lastOdometryPose
(
pose1
->
pose
.
pose
.
position
.
x
,
geometry_msgs
::
PoseArray
poseArray
=
geometry_msgs
::
PoseArray
();
pose1
->
pose
.
pose
.
position
.
y
,
poseArray
.
header
=
poseMsg
.
header
;
tf
::
getYaw
(
pose1
->
pose
.
pose
.
orientation
));
std
::
vector
<
Pose
>*
poses
=
m_HyperSlamFilter
->
getBestSlamFilter
()
->
getParticlePoses
();
for
(
int
i
=
0
;
i
<
poses
->
size
();
i
++
)
Pose
currentOdometryPose
(
pose2
->
pose
.
pose
.
position
.
x
,
pose2
->
pose
.
pose
.
position
.
y
,
tf
::
getYaw
(
pose2
->
pose
.
pose
.
orientation
));
m_ReferenceOdometryTime
=
pose1
->
header
.
stamp
;
ros
::
Duration
d1
=
laserTime
-
lastOdometryTime
;
ros
::
Duration
d2
=
currentOdometryTime
-
lastOdometryTime
;
float
timeFactor
;
if
(
d1
.
toSec
()
==
0.0
)
{
{
geometry_msgs
::
Pose
tmpPose
=
geometry_msgs
::
Pose
();
timeFactor
=
0.0
f
;
tmpPose
.
position
.
x
=
poses
->
at
(
i
).
x
();
tmpPose
.
position
.
y
=
poses
->
at
(
i
).
y
();
tf
::
Quaternion
quatTF
=
tf
::
createQuaternionFromYaw
(
poses
->
at
(
i
).
theta
());
geometry_msgs
::
Quaternion
quatMsg
;
tf
::
quaternionTFToMsg
(
quatTF
,
quatMsg
);
tmpPose
.
orientation
=
quatMsg
;
poseArray
.
poses
.
push_back
(
tmpPose
);
}
}
delete
poses
;
else
if
(
d2
.
toSec
()
==
0.0
)
m_PoseArrayPublisher
.
publish
(
poseArray
);
{
timeFactor
=
1.0
f
;
}
else
{
timeFactor
=
d1
.
toSec
()
/
d2
.
toSec
();
}
return
lastOdometryPose
.
interpolate
(
currentOdometryPose
,
timeFactor
);
}
}
void
SlamNode
::
callbackDoMapping
(
const
std_msgs
::
Bool
::
ConstPtr
&
msg
)
void
SlamNode
::
callbackDoMapping
(
const
std_msgs
::
Bool
::
ConstPtr
&
msg
)
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment