3 #include <ros/node_handle.h>
4 #include <ros/subscribe_options.h>
5 #include <tf2/LinearMath/Transform.h>
6 #include <tf2_geometry_msgs/tf2_geometry_msgs.h>
7 #include <tf2/LinearMath/Quaternion.h>
8 #include <tf2/LinearMath/Matrix3x3.h>
10 #include <geometry_msgs/Twist.h>
11 #include <std_msgs/Empty.h>
12 #include <std_msgs/String.h>
24 ros::init(args,
"emc_system", ros::init_options::AnonymousName);
28 std::string laser_param, pose_param, odom_param, bumper_f_param, bumper_b_param, base_ref_param, open_door_param, speak_param, play_param;
29 if (!nh.getParam(
"laser_", laser_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"laser_" <<
" not set");};
30 if (!nh.getParam(
"pose_", pose_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"pose_" <<
" not set");};
31 if (!nh.getParam(
"odom_", odom_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"odom_" <<
" not set");};
32 if (!nh.getParam(
"bumper_f_", bumper_f_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"bumper_f_" <<
" not set");};
33 if (!nh.getParam(
"bumper_b_", bumper_b_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"bumper_b_" <<
" not set");};
34 if (!nh.getParam(
"base_ref_", base_ref_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"base_ref_" <<
" not set");};
35 if (!nh.getParam(
"open_door_", open_door_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"open_door_" <<
" not set");};
36 if (!nh.getParam(
"speak_", speak_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"speak_" <<
" not set");};
37 if (!nh.getParam(
"play_", play_param)) {ROS_ERROR_STREAM(
"Parameter " <<
"play_" <<
" not set");};
38 if (!nh.getParam(
"base_link_",
robot_frame_name)) {ROS_ERROR_STREAM(
"Parameter " <<
"base_link_" <<
" not set");};
44 sub_pose_ = nh.subscribe(pose_sub_options);
47 sub_odom_ = nh.subscribe(odom_sub_options);
55 pub_base_ref_ = nh.advertise<geometry_msgs::Twist>(base_ref_param, 1);
57 pub_open_door_ = nh.advertise<std_msgs::Empty>(open_door_param, 1);
59 pub_speak_ = nh.advertise<std_msgs::String>(speak_param, 1);
60 pub_play_ = nh.advertise<std_msgs::String>(play_param, 1);
62 pub_marker_ = nh.advertise<visualization_msgs::Marker>(
"/marker", 1);
125 tf2::Quaternion q(
pose_msg_->pose.orientation.x,
132 double roll, pitch, yaw;
133 T.getRPY(roll, pitch, yaw);
157 const geometry_msgs::Quaternion& q =
odom_msg_->pose.pose.orientation;
158 odom.
a = atan2(2 * (q.w * q.z + q.x * q.y), 1 - 2 * (q.y * q.y + q.z * q.z));
199 geometry_msgs::Twist ref;
226 std_msgs::String str;
233 std_msgs::String str;
241 tf2::Transform transform;
242 tf2::fromMsg(pose, transform);
243 geometry_msgs::Transform inverted_transform_msg;
244 inverted_transform_msg = tf2::toMsg(transform.inverse());
247 geometry_msgs::TransformStamped transformStamped;
248 transformStamped.header.stamp = ros::Time::now();
250 transformStamped.child_frame_id =
"map";
251 transformStamped.transform = inverted_transform_msg;
252 pub_tf2->sendTransform(transformStamped);
295 sensor_msgs::LaserScan msg{};
297 msg.angle_min = angle_min;
298 msg.angle_max = angle_max;
299 msg.angle_increment = angle_inc * subsample;
301 msg.range_min = 0.01;
304 msg.header.frame_id =
"robot_pose";
305 msg.header.stamp = ros::Time::now();
307 msg.ranges = prediction;
315 geometry_msgs::PoseArray msg{};
317 msg.header.frame_id =
"map";
318 msg.header.stamp = ros::Time::now();
320 msg.poses.reserve(N);
321 for (
int i = 0; i < N; i++)
323 geometry_msgs::Pose posemsg;
324 auto pose_i = particle_poses[i];
326 posemsg.position.x =
std::cos(mapOrientation) * pose_i[0] -
std::sin(mapOrientation) * pose_i[1];
327 posemsg.position.y =
std::sin(mapOrientation) * pose_i[0] +
std::cos(mapOrientation) * pose_i[1];
328 posemsg.position.z = 0;
330 a.setRPY(0, 0, pose_i[2] - mapOrientation);
331 posemsg.orientation.w = a.getW();
332 posemsg.orientation.x = a.getX();
333 posemsg.orientation.y = a.getY();
334 posemsg.orientation.z = a.getZ();
336 msg.poses.push_back(posemsg);
344 geometry_msgs::PoseArray msg;
346 msg.header.frame_id =
"map";
347 msg.header.stamp = ros::Time::now();
350 msg.poses.reserve(1);
352 geometry_msgs::Pose posemsg;
353 posemsg.position.x =
std::cos(mapOrientation) * pose[0] -
std::sin(mapOrientation) * pose[1];
354 posemsg.position.y =
std::sin(mapOrientation) * pose[0] +
std::cos(mapOrientation) * pose[1];
355 posemsg.position.z = 0;
357 a.setRPY(0, 0, pose[2] - mapOrientation);
358 posemsg.orientation.w = a.getW();
359 posemsg.orientation.x = a.getX();
360 posemsg.orientation.y = a.getY();
361 posemsg.orientation.z = a.getZ();
363 msg.poses.push_back(posemsg);