46 #include <gtest/gtest.h>
52 static const std::string
LOGNAME =
"servo_cpp_interface_test";
57 class ServoFixture :
public ::testing::Test
63 ros::topic::waitForMessage<sensor_msgs::JointState>(
"/joint_states");
87 auto msg = ros::topic::waitForMessage<std_msgs::Int8>(
servo_->getParameters().status_topic,
nh_,
ros::Duration(1));
88 return static_cast<bool>(msg);
100 EXPECT_TRUE(waitForFirstStatus()) <<
"Timeout waiting for Status message";
101 servo_->setPaused(
true);
106 servo_->setPaused(
false);
107 EXPECT_TRUE(waitForFirstStatus()) <<
"Timeout waiting for Status message";
108 servo_->setPaused(
true);
111 TEST_F(ServoFixture, SendTwistStampedTest)
114 EXPECT_TRUE(waitForFirstStatus()) <<
"Timeout waiting for Status message";
116 auto parameters = servo_->getParameters();
119 size_t received_count = 0;
120 boost::function<void(
const trajectory_msgs::JointTrajectoryConstPtr&)> traj_callback =
121 [&received_count](
const trajectory_msgs::JointTrajectoryConstPtr& ) { ++received_count; };
122 auto traj_sub = nh_.subscribe(parameters.command_out_topic, 1, traj_callback);
125 auto twist_stamped_pub = nh_.advertise<geometry_msgs::TwistStamped>(parameters.cartesian_command_in_topic, 1);
127 constexpr
double test_duration = 1.0;
128 const double publish_period = parameters.publish_period;
129 const size_t num_commands =
static_cast<size_t>(test_duration / publish_period);
131 ros::Rate publish_rate(1. / publish_period);
134 for (
size_t i = 0; i < num_commands &&
ros::ok(); ++i)
136 auto msg = moveit::util::make_shared_from_pool<geometry_msgs::TwistStamped>();
138 msg->header.frame_id =
"panda_link0";
139 msg->twist.angular.y = 1.0;
142 twist_stamped_pub.publish(msg);
143 publish_rate.sleep();
146 EXPECT_GT(received_count, num_commands - 20);
147 EXPECT_GT(received_count, (
unsigned)0);
148 EXPECT_LT(received_count, num_commands + 20);
149 servo_->setPaused(
true);
152 TEST_F(ServoFixture, SendJointServoTest)
155 EXPECT_TRUE(waitForFirstStatus()) <<
"Timeout waiting for Status message";
157 auto parameters = servo_->getParameters();
160 size_t received_count = 0;
161 boost::function<void(
const trajectory_msgs::JointTrajectoryConstPtr&)> traj_callback =
162 [&received_count](
const trajectory_msgs::JointTrajectoryConstPtr& ) { ++received_count; };
163 auto traj_sub = nh_.subscribe(parameters.command_out_topic, 1, traj_callback);
166 auto joint_servo_pub = nh_.advertise<control_msgs::JointJog>(parameters.joint_command_in_topic, 1);
168 constexpr
double test_duration = 1.0;
169 const double publish_period = parameters.publish_period;
170 const size_t num_commands =
static_cast<size_t>(test_duration / publish_period);
172 ros::Rate publish_rate(1. / publish_period);
175 for (
size_t i = 0; i < num_commands &&
ros::ok(); ++i)
177 auto msg = moveit::util::make_shared_from_pool<control_msgs::JointJog>();
179 msg->header.frame_id =
"panda_link3";
180 msg->velocities.push_back(0.1);
183 joint_servo_pub.publish(msg);
184 publish_rate.sleep();
187 EXPECT_GT(received_count, num_commands - 20);
188 EXPECT_LT(received_count, num_commands + 20);
189 servo_->setPaused(
true);
195 EXPECT_TRUE(waitForFirstStatus()) <<
"Timeout waiting for Status message";
197 auto parameters = servo_->getParameters();
198 double publish_period = parameters.publish_period;
201 size_t received_count = 0;
202 trajectory_msgs::JointTrajectory joint_command_from_servo;
203 trajectory_msgs::JointTrajectory prev_joint_command_from_servo;
204 boost::function<void(
const trajectory_msgs::JointTrajectoryConstPtr&)> traj_callback =
205 [&](
const trajectory_msgs::JointTrajectoryConstPtr& msg) {
209 prev_joint_command_from_servo = joint_command_from_servo;
210 joint_command_from_servo = *msg;
213 if (received_count > 1)
216 EXPECT_GT(joint_command_from_servo.points.size(), (
unsigned)0);
217 EXPECT_GT(prev_joint_command_from_servo.points.size(), (
unsigned)0);
218 EXPECT_EQ(prev_joint_command_from_servo.points.size(), joint_command_from_servo.points.size());
220 for (
size_t joint_index = 0; joint_index < joint_command_from_servo.points[0].positions.size(); ++joint_index)
222 double joint_velocity = (joint_command_from_servo.points[0].positions[joint_index] -
223 prev_joint_command_from_servo.points[0].positions[joint_index]) /
229 auto traj_sub = nh_.subscribe(parameters.command_out_topic, 1, traj_callback);
232 auto twist_stamped_pub = nh_.advertise<geometry_msgs::TwistStamped>(parameters.cartesian_command_in_topic, 1);
234 constexpr
double test_duration = 1.0;
235 const size_t num_commands =
static_cast<size_t>(test_duration / publish_period);
237 ros::Rate publish_rate(1. / publish_period);
240 for (
size_t i = 0; i < num_commands &&
ros::ok(); ++i)
242 auto msg = moveit::util::make_shared_from_pool<geometry_msgs::TwistStamped>();
244 msg->header.frame_id =
"panda_link0";
245 msg->twist.linear.x = 10.0;
249 twist_stamped_pub.publish(msg);
250 publish_rate.
sleep();
253 EXPECT_GT(received_count, num_commands - 20);
254 EXPECT_LT(received_count, num_commands + 20);
255 servo_->setPaused(
true);
259 int main(
int argc,
char** argv)
262 testing::InitGoogleTest(&argc, argv);
267 int result = RUN_ALL_TESTS();