SMACC2
Loading...
Searching...
No Matches
common.cpp
Go to the documentation of this file.
1// Copyright 2021 RobosoftAI Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15/*****************************************************************************************************************
16 *
17 * Authors: Pablo Inigo Blasco, Brett Aldrich
18 *
19 ******************************************************************************************************************/
20// #include <rclcpp/rclcpp.hpp>
21
22#include <angles/angles.h>
23#include <tf2/transform_datatypes.h>
24#include <tf2_geometry_msgs/tf2_geometry_msgs.h>
25#include <geometry_msgs/msg/quaternion.hpp>
26#include <geometry_msgs/msg/quaternion_stamped.hpp>
27
28#include <tf2/utils.h>
31
32#include <geometry_msgs/msg/pose_stamped.hpp>
33#include <geometry_msgs/msg/twist.hpp>
34
35namespace cl_nav2z
36{
37geometry_msgs::msg::PoseStamped makePureSpinningSubPlan(
38 const geometry_msgs::msg::PoseStamped & start, double dstRads,
39 std::vector<geometry_msgs::msg::PoseStamped> & plan, double radstep)
40{
41 double startYaw = tf2::getYaw(start.pose.orientation);
42 // RCLCPP_INFO(getLogger(),"pure spining start yaw: %lf", startYaw);
43 // RCLCPP_INFO(getLogger(),"pure spining goal yaw: %lf", dstRads);
44 // RCLCPP_WARN_STREAM(getLogger(),"pure spinning start pose: " << start);
45
46 double goalAngleOffset = angles::shortest_angular_distance(startYaw, dstRads);
47 // RCLCPP_INFO(getLogger(),"shortest angle: %lf", goalAngleOffset);
48
49 if (goalAngleOffset >= 0)
50 {
51 // angle positive turn counterclockwise
52 // RCLCPP_INFO(getLogger(),"pure spining counterclockwise");
53 for (double dangle = 0; dangle <= goalAngleOffset; dangle += radstep)
54 {
55 geometry_msgs::msg::PoseStamped p = start;
56 double yaw = startYaw + dangle;
57 // RCLCPP_INFO(getLogger(),"pure spining counterclockwise, current path yaw: %lf, dangle: %lf,
58 // angleoffset %lf, radstep %lf pathsize(%ld)", yaw, dangle, goalAngleOffset, radstep, plan.size());
59 tf2::Quaternion q;
60 q.setRPY(0, 0, yaw);
61 p.pose.orientation = tf2::toMsg(q);
62 plan.push_back(p);
63 }
64 }
65 else
66 {
67 // angle positive turn clockwise
68 // RCLCPP_INFO(getLogger(),"pure spining clockwise");
69 for (double dangle = 0; dangle >= goalAngleOffset; dangle -= radstep)
70 {
71 // RCLCPP_INFO(getLogger(),"dangle: %lf", dangle);
72 geometry_msgs::msg::PoseStamped p = start;
73 double yaw = startYaw + dangle;
74 // RCLCPP_INFO(getLogger(),"pure spining clockwise, yaw: %lf, dangle: %lf, angleoffset %lf radstep
75 // %lf", yaw, dangle, goalAngleOffset,radstep);
76 tf2::Quaternion q;
77 q.setRPY(0, 0, yaw);
78 p.pose.orientation = tf2::toMsg(q);
79 plan.push_back(p);
80 }
81 }
82
83 // RCLCPP_INFO(getLogger(),"pure spining end yaw: %lf", dstRads);
84 geometry_msgs::msg::PoseStamped end = start;
85 tf2::Quaternion q;
86 q.setRPY(0, 0, dstRads);
87 end.pose.orientation = tf2::toMsg(q);
88 plan.push_back(end);
89
90 return end;
91}
92
93geometry_msgs::msg::PoseStamped makePureStraightSubPlan(
94 const geometry_msgs::msg::PoseStamped & startOrientedPose, const geometry_msgs::msg::Point & goal,
95 double length, std::vector<geometry_msgs::msg::PoseStamped> & plan)
96{
97 double dx = 0.01; // 1 cm
98 double steps = length / dx;
99 double dt = 1.0 / steps;
100
101 // geometry_msgs::msg::PoseStamped end;
102 // end.pose.orientation = startOrientedPose.pose.orientation;
103 // end.pose.position = goal;
104 plan.push_back(startOrientedPose);
105
106 // RCLCPP_INFO_STREAM(nh_->get_logger(),"Pure straight, start: " << startOrientedPose << std::endl << "end: " <<
107 // goal);
108 for (double t = 0; t <= 1.0; t += dt)
109 {
110 geometry_msgs::msg::PoseStamped p = startOrientedPose;
111
112 p.pose.position.x = startOrientedPose.pose.position.x * (1 - t) + goal.x * t;
113 p.pose.position.y = startOrientedPose.pose.position.y * (1 - t) + goal.y * t;
114 p.pose.orientation = startOrientedPose.pose.orientation;
115
116 plan.push_back(p);
117 }
118
119 return plan.back();
120}
121
122} // namespace cl_nav2z
123
124std::ostream & operator<<(std::ostream & out, const geometry_msgs::msg::Twist & msg)
125{
126 out << "Twist [" << msg.linear.x << "m , " << msg.linear.y << "m , " << msg.angular.z << "rad ]";
127 return out;
128}
129
130std::ostream & operator<<(std::ostream & out, const geometry_msgs::msg::Pose & msg)
131{
132 out << "Position [" << msg.position.x << "m , " << msg.position.y << "m , " << msg.position.z
133 << "m ]";
134 out << " Orientation [" << msg.orientation.x << " , " << msg.orientation.y << " , "
135 << msg.orientation.z << ", " << msg.orientation.w << "]";
136 return out;
137}
138
139std::ostream & operator<<(std::ostream & out, const geometry_msgs::msg::Point & msg)
140{
141 out << "Position [" << msg.x << "m , " << msg.y << "m , " << msg.z << "m ]";
142 return out;
143}
144
145std::ostream & operator<<(std::ostream & out, const geometry_msgs::msg::Quaternion & msg)
146{
147 out << "Quaternion [" << msg.x << " , " << msg.y << " , " << msg.z << ", " << msg.w << "]";
148 return out;
149}
150
151std::ostream & operator<<(std::ostream & out, const geometry_msgs::msg::PoseStamped & msg)
152{
153 out << msg.pose;
154 return out;
155}
std::ostream & operator<<(std::ostream &out, const geometry_msgs::msg::Quaternion &msg)
Definition: common.cpp:26
geometry_msgs::msg::PoseStamped makePureSpinningSubPlan(const geometry_msgs::msg::PoseStamped &start, double dstRads, std::vector< geometry_msgs::msg::PoseStamped > &plan, double radstep=0.005)
Definition: common.cpp:37
geometry_msgs::msg::PoseStamped makePureStraightSubPlan(const geometry_msgs::msg::PoseStamped &startOrientedPose, const geometry_msgs::msg::Point &goal, double length, std::vector< geometry_msgs::msg::PoseStamped > &plan)
Definition: common.cpp:93