forte_rc_head_control.cpp
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   //ros::Subscriber sub_cmd_vel = n.subscribe("test_vel", 10, cmdVelReceived);
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       // velocities in regard to the robot's axis
00039       //float vx = 0.5, vy = 0.0;
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       // do not rotate more than 20%
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       // Average rolling window
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           //ROS_INFO("%f",rad_angle);
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 }


forte_rc_driver
Author(s): Ingeniarius, Ltd.
autogenerated on Sat Jun 8 2019 19:54:46