Skip to content

Commit cfeb05c

Browse files
committed
Added ability to programatically change robot pose
1 parent ffed6ca commit cfeb05c

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

src/stageros.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include <nav_msgs/Odometry.h>
4949
#include <geometry_msgs/Twist.h>
5050
#include <rosgraph_msgs/Clock.h>
51+
#include <geometry_msgs/Pose2D.h>
5152

5253
#include <std_srvs/Empty.h>
5354

@@ -61,6 +62,7 @@
6162
#define BASE_SCAN "base_scan"
6263
#define BASE_POSE_GROUND_TRUTH "base_pose_ground_truth"
6364
#define CMD_VEL "cmd_vel"
65+
#define POSE "pose"
6466

6567
// Our node
6668
class StageNode
@@ -96,6 +98,7 @@ class StageNode
9698
std::vector<ros::Publisher> laser_pubs; //multiple lasers
9799

98100
ros::Subscriber cmdvel_sub; //one cmd_vel subscriber
101+
ros::Subscriber pose_sub; //one pos subscriber
99102
};
100103

101104
std::vector<StageRobot const *> robotmodels_;
@@ -161,6 +164,9 @@ class StageNode
161164
// Message callback for a MsgBaseVel message, which set velocities.
162165
void cmdvelReceived(int idx, const boost::shared_ptr<geometry_msgs::Twist const>& msg);
163166

167+
// Message callback for a Pose2D message, which sets pose.
168+
void poseReceived(int idx, const boost::shared_ptr<geometry_msgs::Pose2D const>& msg);
169+
164170
// Service callback for soft reset
165171
bool cb_reset_srv(std_srvs::Empty::Request& request, std_srvs::Empty::Response& response);
166172

@@ -266,6 +272,18 @@ StageNode::cmdvelReceived(int idx, const boost::shared_ptr<geometry_msgs::Twist
266272
this->base_last_cmd = this->sim_time;
267273
}
268274

275+
void
276+
StageNode::poseReceived(int idx, const boost::shared_ptr<geometry_msgs::Pose2D const>& msg)
277+
{
278+
boost::mutex::scoped_lock lock(msg_lock);
279+
Stg::Pose pose;
280+
pose.x = msg->x;
281+
pose.y = msg->y;
282+
pose.z =0;
283+
pose.a = msg->theta;
284+
this->positionmodels[idx]->SetPose(pose);
285+
}
286+
269287
StageNode::StageNode(int argc, char** argv, bool gui, const char* fname, bool use_model_names)
270288
{
271289
this->use_model_names = use_model_names;
@@ -354,6 +372,7 @@ StageNode::SubscribeModels()
354372
new_robot->odom_pub = n_.advertise<nav_msgs::Odometry>(mapName(ODOM, r, static_cast<Stg::Model*>(new_robot->positionmodel)), 10);
355373
new_robot->ground_truth_pub = n_.advertise<nav_msgs::Odometry>(mapName(BASE_POSE_GROUND_TRUTH, r, static_cast<Stg::Model*>(new_robot->positionmodel)), 10);
356374
new_robot->cmdvel_sub = n_.subscribe<geometry_msgs::Twist>(mapName(CMD_VEL, r, static_cast<Stg::Model*>(new_robot->positionmodel)), 10, boost::bind(&StageNode::cmdvelReceived, this, r, _1));
375+
new_robot->pose_sub = n_.subscribe<geometry_msgs::Pose2D>(mapName(POSE, r, static_cast<Stg::Model*>(new_robot->positionmodel)), 10, boost::bind(&StageNode::poseReceived, this, r, _1));
357376

358377
for (size_t s = 0; s < new_robot->lasermodels.size(); ++s)
359378
{

0 commit comments

Comments
 (0)