Go to the documentation of this file.00001 #include "ros/ros.h"
00002 #include "std_msgs/String.h"
00003 #include "ros_pololu_servo/MotorCommand.h"
00004 #include "geometry_msgs/Twist.h"
00005 #include <math.h>
00006
00007 float vx = 0;
00008 float vy = 0;
00009 const float PI = 3.14159;
00010 int zero_state_cnt = 0;
00011 float smooth_angle[5] = {0};
00012 const float head_offset = -90.0;
00013
00014 void cmdVelReceived(const geometry_msgs::Twist::ConstPtr& cmd_vel){
00015
00016 vx = cmd_vel->linear.x;
00017 vy = cmd_vel->linear.y;
00018 }
00019
00020
00021 int main(int argc, char **argv)
00022 {
00023
00024 ros::init(argc, argv, "head_controller");
00025 ros::NodeHandle n;
00026
00027 ros::Publisher pololu_servo_pub = n.advertise<ros_pololu_servo::MotorCommand>("pololu/command",1);
00028 ros::Subscriber sub_cmd_vel = n.subscribe("cmd_vel", 10, cmdVelReceived);
00029
00030
00031 ros::Rate loop_rate(5);
00032
00033 ROS_INFO("Forte RC head ready to receive cmd_vel...");
00034
00035 while (ros::ok())
00036 {
00037
00038
00039
00040
00041 float angle = atan2(vy,vx)*180.0/PI;
00042
00043 if (fabs(angle) > 90.0)
00044 angle = (fabs(angle)/angle) * 180.0 - angle;
00045
00046
00047 if (angle > 20.0)
00048 angle = 20.0;
00049
00050 if (angle < -40.0)
00051 angle = -40.0;
00052
00053 float rad_angle = ((head_offset + angle)*PI)/180.0;
00054
00055 ros_pololu_servo::MotorCommand msg;
00056
00057
00058 smooth_angle[0]=smooth_angle[1];
00059 smooth_angle[1]=smooth_angle[2];
00060 smooth_angle[2]=smooth_angle[3];
00061 smooth_angle[3]=smooth_angle[4];
00062 smooth_angle[4]=rad_angle;
00063
00064 for(int i=0; i<4; i++){
00065 rad_angle += smooth_angle[i];
00066 }
00067 rad_angle = rad_angle/5.0;
00068
00069
00070 msg.joint_name="neck_yaw_joint";
00071 msg.speed=0.005;
00072 msg.acceleration=0.005;
00073 msg.position=rad_angle;
00074
00075
00076
00077 if(rad_angle != 0.0 || zero_state_cnt==0){
00078
00079 pololu_servo_pub.publish(msg);
00080 zero_state_cnt=0;
00081 }
00082
00083 if(rad_angle == 0.0){
00084 zero_state_cnt++;
00085 }
00086
00087 ros::spinOnce();
00088 loop_rate.sleep();
00089 }
00090
00091
00092 return 0;
00093 }