9
9
10
10
-- aj / 23rd Nov, 2017.
11
11
*/
12
- #include < cmath>
13
- #include < ros/ros.h>
14
- #include < std_msgs/UInt8.h>
15
- #include < freyja_msgs/ReferenceState.h>
12
+
13
+ #include " temporal_provider.h"
16
14
17
15
#define ROS_NODE_NAME " trajectory_provider"
18
- typedef freyja_msgs::ReferenceState TrajRef;
16
+ #define UPDATE_RATE 50 // update rate of the trajectory (Hz)
17
+
18
+ Temporal_Traj::Temporal_Traj () : Node( ROS_NODE_NAME )
19
+ {
20
+ init_time = now ();
21
+
22
+ declare_parameter<std::string>(" traj_type" , traj_type);
23
+ declare_parameter<int >(" agg_level" , agg_level);
19
24
20
- #define DEG2RAD (D ) ((D)*3.1415326 /180.0 )
25
+ get_parameter (" traj_type" , traj_type);
26
+ get_parameter (" agg_level" , agg_level);
21
27
22
- // global decl for "start time". This can be reset by a callback
23
- ros::Time init_time;
28
+ time_reset_sub_ = create_subscription<std_msgs::msg::UInt8>(
29
+ " /reset_trajectory_time" , 1 , std::bind (&Temporal_Traj::timer_reset_cb, this , _1));
30
+
31
+ traj_pub_ = create_publisher<TrajRef>(" /reference_state" , 1 );
32
+
33
+ traj_update_timer_ = create_wall_timer (
34
+ 20ms, std::bind (&Temporal_Traj::traj_update_cb, this ));
35
+ }
24
36
25
- void timeResetCallback ( const std_msgs::UInt8::ConstPtr & msg )
37
+ void Temporal_Traj::timer_reset_cb ( std_msgs::msg:: UInt8::SharedPtr msg )
26
38
{
27
- if ( msg -> data == 1 )
28
- {
29
- init_time = ros::Time:: now ();
30
- ROS_WARN ( " %s: Time reset requested!" , ROS_NODE_NAME );
31
- }
39
+ if ( msg-> data == 1 )
40
+ {
41
+ init_time = now ();
42
+ RCLCPP_WARN ( get_logger (), " %s: Time reset requested!" , ROS_NODE_NAME);
43
+ }
32
44
}
33
45
34
- // HOVER AT A POINT
35
- TrajRef getHoverReference ( const ros::Duration &cur_time )
46
+ void Temporal_Traj::traj_update_cb ()
47
+ {
48
+ get_parameter (" traj_type" , traj_type);
49
+
50
+ if (traj_type == " hover" )
51
+ {
52
+ ref_state = Temporal_Traj::getHoverReference (now () - init_time);
53
+ RCLCPP_INFO (get_logger (), " Publishing Hover Reference States" );
54
+ }
55
+ else if (traj_type == " circle" )
56
+ {
57
+ ref_state = Temporal_Traj::getCircleReference (now () - init_time, agg_level);
58
+ RCLCPP_INFO (get_logger (), " Publishing Circle Reference States" );
59
+ }
60
+ else if (traj_type == " lemiscate" )
61
+ {
62
+ ref_state = Temporal_Traj::getLemiscateReference (now () - init_time, agg_level);
63
+ RCLCPP_INFO (get_logger (), " Publishing Lemiscate Reference States" );
64
+ }
65
+ else
66
+ {
67
+ RCLCPP_ERROR (get_logger (), " Invalid trajectory parameters given." );
68
+ }
69
+
70
+ traj_pub_->publish (ref_state);
71
+ }
72
+
73
+ // HOVER AT A POINT
74
+ TrajRef Temporal_Traj::getHoverReference ( rclcpp::Duration cur_time )
36
75
{
37
76
TrajRef ref_state;
38
77
ref_state.pn = 0.0 ;
@@ -45,19 +84,25 @@ TrajRef getHoverReference( const ros::Duration &cur_time )
45
84
ref_state.an = 0.0 ;
46
85
ref_state.ae = 0.0 ;
47
86
ref_state.ad = 0.0 ;
48
- ref_state.header .stamp = ros::Time:: now ();
87
+ ref_state.header .stamp = now ();
49
88
return ref_state;
50
89
}
51
90
52
- // CIRCLE: pn = A*sin(wt), pe = A*cos(wt), vn = A*w*cos(wt) ..
53
- TrajRef getCircleReference ( const ros::Duration &cur_time, const int agg_level)
91
+ /* * CIRCLE:
92
+ * pn = A*sin(wt)
93
+ * pe = A*cos(wt)
94
+ * vn = A*w*cos(wt)
95
+ * vn = -A*w*sin(wt)
96
+ */
97
+ TrajRef Temporal_Traj::getCircleReference ( const rclcpp::Duration cur_time, const int agg_level)
54
98
{
55
99
// A is amplitude (radius); w angular rate such that 2pi/w = (seconds for one rev)
56
100
float A = 0.5 ;
57
101
float w = 0.5 ;
58
102
59
103
// Set A and w based on agg_level
60
- switch (agg_level) {
104
+ switch (agg_level)
105
+ {
61
106
case 1 :
62
107
break ;
63
108
case 2 :
@@ -69,30 +114,31 @@ TrajRef getCircleReference( const ros::Duration &cur_time, const int agg_level)
69
114
w = 3 ;
70
115
break ;
71
116
default :
72
- ROS_WARN_STREAM ( " Circle aggression " << agg_level << " not supported, defaulting to agg_level 1" );
73
- }
117
+ RCLCPP_WARN ( get_logger (), " Circle aggression %d not supported, defaulting to agg_level 1" , agg_level );
118
+ }
74
119
75
- float t = cur_time.toSec ();
120
+ float t = cur_time.seconds ();
76
121
77
- // Create reference state
78
- TrajRef ref_state;
79
- ref_state.header .stamp = ros::Time:: now ();
122
+ // Create reference state
123
+ TrajRef ref_state;
124
+ ref_state.header .stamp = now ();
80
125
81
- ref_state.pn = A*std::sin ( w*t );
82
- ref_state.pe = A*std::cos ( w*t );
83
- ref_state.pd = -1.0 ;
84
-
85
- ref_state.vn = A*w*std::cos ( w*t );
86
- ref_state.ve = -A*w*std::sin ( w*t );
87
- ref_state.vd = 0.0 ;
126
+ ref_state.pn = A*std::sin ( w*t );
127
+ ref_state.pe = A*std::cos ( w*t );
128
+ ref_state.pd = -4.0 ;
88
129
89
- ref_state.yaw = 0.0 ;
130
+ ref_state.vn = A*w*std::cos ( w*t );
131
+ ref_state.ve = -A*w*std::sin ( w*t );
132
+ ref_state.vd = 0.0 ;
133
+
134
+ ref_state.yaw = 0.0 ;
135
+
136
+ // set an, ae, ad to second derivatives if needed for FF..
137
+ return ref_state;
90
138
91
- // set an, ae, ad to second derivatives if needed for FF..
92
- return ref_state;
93
139
}
94
140
95
- TrajRef getDefaultReference ( const ros ::Duration & cur_time )
141
+ TrajRef Temporal_Traj:: getDefaultReference ( rclcpp ::Duration cur_time )
96
142
{
97
143
TrajRef ref_state;
98
144
ref_state.pn = 0.5 ;
@@ -105,48 +151,20 @@ TrajRef getDefaultReference( const ros::Duration &cur_time )
105
151
ref_state.an = 0.0 ;
106
152
ref_state.ae = 0.0 ;
107
153
ref_state.ad = 0.0 ;
108
- ref_state.header .stamp = ros::Time::now ();
109
- return ref_state;
154
+ ref_state.header .stamp = now ();
155
+
156
+ return ref_state;
110
157
}
111
158
112
- int main ( int argc, char ** argv )
113
159
{
114
- ros::init ( argc, argv, ROS_NODE_NAME );
115
- ros::NodeHandle nh, priv_nh (" ~" );
116
160
117
- /* Publisher for trajectory */
118
- ros::Publisher traj_pub;
119
- traj_pub = nh.advertise <TrajRef> ( " /reference_state" , 1 , true );
120
-
121
- /* Create subscriber for resetting time -- restart the trajectory */
122
- ros::Subscriber time_reset_sub;
123
- time_reset_sub = nh.subscribe ( " /reset_trajectory_time" , 1 , timeResetCallback );
124
-
125
- std::string traj_type;
126
- priv_nh.param ( " example_traj_type" , traj_type, std::string (" hover" ) );
127
-
128
- /* How fast should a trajectory update be made? */
129
- ros::Rate update_rate (50 );
130
- init_time = ros::Time::now ();
131
-
132
- while ( ros::ok () )
133
- {
134
- TrajRef ref_state;
135
- if ( traj_type == " circle1" )
136
- ref_state = getCircleReference ( ros::Time::now () - init_time, 1 );
137
- else if ( traj_type == " circle2" )
138
- ref_state = getCircleReference ( ros::Time::now () - init_time, 2 );
139
- else if ( traj_type == " circle3" )
140
- ref_state = getCircleReference ( ros::Time::now () - init_time, 3 );
141
- else if ( traj_type == " hover" )
142
- ref_state = getHoverReference ( ros::Time::now () - init_time );
143
- else
144
- ref_state = getDefaultReference ( ros::Time::now () - init_time );
145
- traj_pub.publish ( ref_state );
146
-
147
- ros::spinOnce ();
148
- update_rate.sleep ();
149
- }
150
161
162
+
163
+ int main (int argc, char * argv[])
164
+ {
165
+ rclcpp::init (argc, argv);
166
+ rclcpp::spin (std::make_shared<Temporal_Traj>());
167
+ rclcpp::shutdown ();
151
168
return 0 ;
152
169
}
170
+
0 commit comments