@@ -159,7 +159,9 @@ class YpspurRosNode
159
159
int device_error_state_prev_;
160
160
ros::Time device_error_state_time_;
161
161
162
- geometry_msgs::Twist cmd_vel_;
162
+ geometry_msgs::Twist::ConstPtr cmd_vel_;
163
+ ros::Time cmd_vel_time_;
164
+ ros::Duration cmd_vel_expire_;
163
165
164
166
int control_mode_;
165
167
@@ -180,7 +182,8 @@ class YpspurRosNode
180
182
}
181
183
void cbCmdVel (const geometry_msgs::Twist::ConstPtr &msg)
182
184
{
183
- cmd_vel_ = *msg;
185
+ cmd_vel_ = msg;
186
+ cmd_vel_time_ = ros::Time::now ();
184
187
if (control_mode_ == ypspur_ros::ControlMode::VELOCITY)
185
188
{
186
189
YP::YPSpur_vel (msg->linear .x , msg->angular .z );
@@ -464,6 +467,11 @@ class YpspurRosNode
464
467
pnh_.param (" ypspur_bin" , ypspur_bin_, std::string (" ypspur-coordinator" ));
465
468
pnh_.param (" param_file" , param_file_, std::string (" " ));
466
469
pnh_.param (" tf_time_offset" , tf_time_offset_, 0.0 );
470
+
471
+ double cmd_vel_expire_s;
472
+ pnh_.param (" cmd_vel_expire" , cmd_vel_expire_s, -1.0 );
473
+ cmd_vel_expire_ = ros::Duration (cmd_vel_expire_s);
474
+
467
475
std::string ad_mask (" " );
468
476
ads_.resize (ad_num_);
469
477
for (int i = 0 ; i < ad_num_; i++)
@@ -829,12 +837,23 @@ class YpspurRosNode
829
837
ros::Rate loop (params_[" hz" ]);
830
838
while (!g_shutdown)
831
839
{
832
- auto now = ros::Time::now ();
833
- float dt = 1.0 / params_[" hz" ];
840
+ const auto now = ros::Time::now ();
841
+ const float dt = 1.0 / params_[" hz" ];
842
+
843
+ if (cmd_vel_ && cmd_vel_expire_ > ros::Duration (0 ))
844
+ {
845
+ if (cmd_vel_time_ + cmd_vel_expire_ < now)
846
+ {
847
+ // cmd_vel is too old and expired
848
+ cmd_vel_ = nullptr ;
849
+ if (control_mode_ == ypspur_ros::ControlMode::VELOCITY)
850
+ YP::YPSpur_vel (0.0 , 0.0 );
851
+ }
852
+ }
834
853
835
854
if (mode_ == DIFF)
836
855
{
837
- double x, y, yaw, v, w;
856
+ double x, y, yaw, v ( 0 ) , w ( 0 ) ;
838
857
double t;
839
858
840
859
if (!simulate_control_)
@@ -847,8 +866,11 @@ class YpspurRosNode
847
866
else
848
867
{
849
868
t = ros::Time::now ().toSec ();
850
- v = cmd_vel_.linear .x ;
851
- w = cmd_vel_.angular .z ;
869
+ if (cmd_vel_)
870
+ {
871
+ v = cmd_vel_->linear .x ;
872
+ w = cmd_vel_->angular .z ;
873
+ }
852
874
yaw = tf::getYaw (odom.pose .pose .orientation ) + dt * w;
853
875
x = odom.pose .pose .position .x + dt * v * cosf (yaw);
854
876
y = odom.pose .pose .position .y + dt * v * sinf (yaw);
0 commit comments