int main(int argc, char** argv)
{
  Aria::init();
  ArArgumentParser argParser(&argc, argv);
  ArSimpleConnector con(&argParser);
  ArRobot robot;
  ArSonarDevice sonar;

  argParser.loadDefaultArguments();
  if(!Aria::parseArgs() || !argParser.checkHelpAndWarnUnparsed())
  {
    Aria::logOptions();
    return 1;
  }

  /* - the action group for teleoperation actions: */
  teleop = new ArActionGroup(&robot);

  // don't hit any tables (if the robot has IR table sensors)
  teleop->addAction(new ArActionLimiterTableSensor, 100);

  // limiter for close obstacles
  teleop->addAction(new ArActionLimiterForwards("speed limiter near", 
						300, 600, 250), 95);

  // limiter for far away obstacles
  teleop->addAction(new ArActionLimiterForwards("speed limiter far", 
					       300, 1100, 400), 90);

  // limiter so we don't bump things backwards
  teleop->addAction(new ArActionLimiterBackwards, 85);

  // the joydrive action (drive from joystick)
  ArActionJoydrive joydriveAct("joydrive", 400, 15);
  teleop->addAction(&joydriveAct, 50);

  // the keydrive action (drive from keyboard)
  teleop->addAction(new ArActionKeydrive, 45);
  


  /* - the action group for wander actions: */
  wander = new ArActionGroup(&robot);

  // if we're stalled we want to back up and recover
  wander->addAction(new ArActionStallRecover, 100);

  // react to bumpers
  wander->addAction(new ArActionBumpers, 75);

  // turn to avoid things closer to us
  wander->addAction(new ArActionAvoidFront("Avoid Front Near", 225, 0), 50);

  // turn avoid things further away
  wander->addAction(new ArActionAvoidFront, 45);

  // keep moving
  wander->addAction(new ArActionConstantVelocity("Constant Velocity", 400), 25);

  

  /* - use key commands to switch modes, and use keyboard
   *   and joystick as inputs for teleoperation actions. */

  // create key handler if Aria does not already have one
  ArKeyHandler *keyHandler = Aria::getKeyHandler();
  if (keyHandler == NULL)
  {
    keyHandler = new ArKeyHandler;
    Aria::setKeyHandler(keyHandler);
    robot.attachKeyHandler(keyHandler);
  }

  // set the callbacks
  ArGlobalFunctor teleopCB(&teleopMode);
  ArGlobalFunctor wanderCB(&wanderMode);
  keyHandler->addKeyHandler('w', &wanderCB);
  keyHandler->addKeyHandler('W', &wanderCB);
  keyHandler->addKeyHandler('t', &teleopCB);
  keyHandler->addKeyHandler('T', &teleopCB);

  // if we don't have a joystick, let 'em know
  if (!joydriveAct.joystickInited())
    printf("Note: Do not have a joystick, only the arrow keys on the keyboard will work.\n");
  
  // set the joystick so it won't do anything if the button isn't pressed
  joydriveAct.setStopIfNoButtonPressed(false);


  /* - connect to the robot, then enter teleoperation mode.  */

  robot.addRangeDevice(&sonar);
  if(!con.connectRobot(&robot))
  { 
    ArLog::log(ArLog::Terse, "actionGroupExample: Could not connect to the robot.");
    Aria::shutdown();
    return 1;
  }

  robot.enableMotors();
  teleopMode();
  robot.run(true);

  Aria::shutdown();
  return 0;
}
int main(int argc, char **argv)
{
  Aria::init();
  ros::init(argc, argv, "teleoparm");
 
  ArLog::init(ArLog::StdErr, ArLog::Normal);
  ArArgumentParser parser(&argc, argv);
  parser.loadDefaultArguments();
  //ArRobot robot;
 
  ArRobotConnector robotConnector(&parser, &robot);
  
  if(!robotConnector.connectRobot())
  {
    ArLog::log(ArLog::Terse, "terabotArmDemo: Could not connect to the robot.");
    if(parser.checkHelpAndWarnUnparsed())
    {
        Aria::logOptions();
        Aria::exit(1);
    }
  }
  if (!Aria::parseArgs() || !parser.checkHelpAndWarnUnparsed())
  {
    Aria::logOptions();
    Aria::exit(1);
  }
  //ArTerabotArm arm(&robot);
  ArLog::log(ArLog::Normal, "terabotArmDemo: Connected to mobile robot.");

   
  if(!arm.open())
  {
      ArLog::log(ArLog::Terse, "terabotArmDemo: Error opening serial connection to arm");
      Aria::exit(1);
  }

 
  robot.runAsync(true);

  arm.powerOn();
  arm.reset();
  arm.enable();
	
  arm.setAllJointSpeeds(defaultJointSpeed);

  ArLog::log(ArLog::Terse, "\nWARNING\n\nAbout to move the manipulator arm to the front of the robot in 5 seconds. Press Control-C to cancel and exit the program.\n...");
  ArUtil::sleep(5000);
  ArLog::log(ArLog::Terse, "Now moving the arm...");
 // arm.moveArm(forwardReady);
 //arm.moveArm(park);


  ArUtil::sleep(500); // need to have read some data from the arm for key handler to work
  robot.lock();
  
  ArModeUnguardedTeleop unguardedTeleopMode(&robot, "unguarded teleop", 'u', 'U');
  ArModeTeleop teleopMode(&robot, "teleop", 't', 'T');
  ArModeLaser laserMode(&robot, "laser", 'l', 'L');
  ArModeCommand commandMode(&robot, "direct robot commands", 'd', 'D');
 

 
  ros::NodeHandle n; 
  sensor_msgs::JointState joints;
  ros::Rate loop_rate(10);
  ros::Publisher joint_pub = n.advertise<sensor_msgs::JointState>("/joint_states", 50);//50 1000
  ros::Subscriber arm_sub_ = n.subscribe<sensor_msgs::JointState>("/joint_states", 10, move_arm);//it was 100

float positions[5];


// float park1 [5]= {50, -95,-50, -149, 0};
 float park1 [5]= {149, -94, 155, -149, 0};//this is th real park
float initial [5]= {-30.0, 0.0, 0.0, 0.0, 0.0};

// std::cout<<"Gripper Status before:"<<arm.getGripperStatus()<<"\n";
// std::cout<<"Gripper Status before:"<<arm.getGripperStatus()<<"\n";
// std::cout<<"Gripper Status before:"<<arm.getGripperStatus()<<"\n";
// std::cout<<"Gripper Status before:"<<arm.getGripperStatus()<<"\n";
// arm.grip(-100);
// std::cout<<"Gripper Status after:"<<arm.getGripperStatus()<<"\n";
// std::cout<<"Gripper Status after:"<<arm.getGripperStatus()<<"\n";
// std::cout<<"Gripper Status after:"<<arm.getGripperStatus()<<"\n";
// std::cout<<"Gripper Status after:"<<arm.getGripperStatus()<<"\n";

  //*********testing**************************
 // arm.moveArm(start);
  //arm.closeGripper();
   // arm.moveArm(park1); 
  arm.moveArm(forwardReady);// used when the manual control GUI is used

  ArUtil::sleep(20000);// time for the non blocking predefined movements to take place
  //******************************************
  while(ros::ok())
  {
	joints.name.push_back("j1");
        joints.name.push_back("j2");
	joints.name.push_back("j3");
        joints.name.push_back("j4");
	joints.name.push_back("j5");
         
	// why is there no joint 
	//joints.position.push_back(11);//<<
	 joints.position.clear();
         joints.position.push_back(positions[0]);
         joints.position.push_back(positions[1]);
	 joints.position.push_back(positions[2]);
         joints.position.push_back(positions[3]);
         joints.position.push_back(positions[4]);
        joint_pub.publish(joints);
	//arm.getJointStatus(&j1,&j2,&j3,&j4,&j5);
        arm.getArmPos(positions);
	// std::cout<<"j1:"<<j1<<"j2:"<<j2<<"j3:"<<j3<<"j4:"<<j4<<"j5:"<<j5<<"\n"; fflush(stdout);
	std::cout<<"position1:"<<positions[0]<<"position2:"<<positions[1]<<"position3:"<<positions[2]<<"position4:"<<positions[3]<<"position5:"<<positions[4]<<"\n"; fflush(stdout);
        //ros::spin(); 
        ros::spinOnce();
         loop_rate.sleep();
        // std::cout<<"loopend\n";
   }
  
  robot.enableMotors(); 
  robot.unlock();
  robot.waitForRunExit();


  ArLog::log(ArLog::Normal, "terabotArmDemo: Either mobile robot or arm disconnected. Exiting.");
  Aria::exit(0);
}