arm_joy_teleop_node.cpp
Go to the documentation of this file.
1 #include <ros/ros.h>
2 #include <sensor_msgs/Joy.h>
3 
4 #include <control_msgs/GripperCommandAction.h>
6 
9 
10 
11 #define DEBUG_JOY_ARM
12 
14 
15 
16 class ArmJoyNode {
17 private:
27  // arm state
35 
36  //buttons and axis indexs
47 
49 
50 
51 
52  void joyCallback(const sensor_msgs::Joy::ConstPtr &msg) {
53  bool isDeadManActive = msg->buttons[_deadManIndex] == 1;
54 
55  if(!isDeadManActive) {
56  if(msg->axes[_hardProfileIndex] == -1.0) {
57 
58  if(msg->axes[_rightLeftAxis] == 1) {
59  _rotation1State = 1;
60  } else if(msg->axes[_rightLeftAxis] == -1) {
61  _rotation1State = -1;
62  }
63 
64  if(msg->axes[_upDownAxis] == 1) {
65  _shoulder1State = -1;
66  } else if(msg->axes[_upDownAxis] == -1) {
67  _shoulder1State = 1;
68  }
69 
70  if(msg->buttons[_xButtonIndex] == 1) {
71  _rotation2State = -1;
72  } else if(msg->buttons[_bButtonIndex] == 1) {
73  _rotation2State = 1;
74  }
75  if(msg->buttons[_yButtonIndex] == 1) {
76  _shoulder2State = -1;
77  } else if(msg->buttons[_aButtonIndex] == 1) {
78  _shoulder2State = 1;
79  }
80 
81 
82  } else if(msg->axes[_softProfileIndex] == -1.0) {
83  if(msg->axes[_rightLeftAxis] == 1) {
84  _wristState = -1;
85  } else if(msg->axes[_rightLeftAxis] == -1) {
86  _wristState = 1;
87  }
88 
89  if(msg->axes[_upDownAxis] == 1) {
90  _shoulder3State = -1;
91  } else if (msg->axes[_upDownAxis] == -1) {
92  _shoulder3State = 1;
93  }
94 
95  if(msg->buttons[_yButtonIndex] == 1) {
96  _gripperState = 1;
97  } else if(msg->buttons[_aButtonIndex] == 1) {
98  _gripperState = -1;
99  }
100  }
101  }
102 
103  }
104  bool haveMoveGoal() {
105  return _rotation1State == 1 || _rotation1State == -1
106  || _rotation2State == 1 || _rotation2State == -1
107  || _shoulder1State == 1 || _shoulder1State == -1
108  || _shoulder2State == 1 || _shoulder2State == -1
109  || _shoulder3State == 1 || _shoulder3State == -1
110  || _wristState == 1 || _wristState == -1
111  || _gripperState == 1 || _gripperState == -1;
112  }
113 public:
114  ArmJoyNode(): _nodeHandle(), _spinner(2), _group("arm") {
115  ROS_INFO("[%s]: Arm joy node is active", ros::this_node::getName().c_str());
116  _rotation1State = 0;
117  _rotation2State = 0;
118  _shoulder1State = 0;
119  _shoulder2State = 0;
120  _shoulder3State = 0;
121  _wristState = 0;
122  _gripperState = 0;
123  _gripperWorking = false;
124  _joySub = _nodeHandle.subscribe<sensor_msgs::Joy>("joy", 10, &ArmJoyNode::joyCallback, this);
125  _group.setPlannerId("RRTConnectkConfigDefault");
126  _group.setPlanningTime(3.0);
127  _group.setNumPlanningAttempts(10);
128 
129 
130 
131  ros::param::param<int>("drive_joy_teleop_deadman_button", _deadManIndex, 7);
132  ros::param::param<int>("arm_joy_node_hard_profile_index", _hardProfileIndex, 4);
133  ros::param::param<int>("arm_joy_node_soft_profile_index", _softProfileIndex, 5);
134  ros::param::param<int>("arm_joy_node_x_button_index", _xButtonIndex, 3);
135  ros::param::param<int>("arm_joy_node_y_button_index", _yButtonIndex, 4);
136  ros::param::param<int>("arm_joy_node_a_button_index", _aButtonIndex, 0);
137  ros::param::param<int>("arm_joy_node_b_button_index", _bButtonIndex, 1);
138  ros::param::param<int>("arm_joy_node_up_down_index", _upDownAxis, 7);
139  ros::param::param<int>("arm_joy_node_left_right_index", _rightLeftAxis, 6);
140 
141  ros::param::param<float>("arm_joy_node_rotation1", _rotation1IncreamentValue, 0.025);
142  ros::param::param<float>("arm_joy_node_rotation2", _rotation2IncreamentValue, 0.1);
143  ros::param::param<float>("arm_joy_node_shoulder1", _shoulder1IncreamentValue, 0.05);
144  ros::param::param<float>("arm_joy_node_shoulder2", _shoulder2IncreamentValue, 0.05);
145  ros::param::param<float>("arm_joy_node_shoulder3", _shoulder3IncreamentValue, 0.05);
146  ros::param::param<float>("arm_joy_node_wrist", _wristIncreamentValue, 0.1);
147 
148  _spinner.start();
149  }
150 
151  void run() {
152  ros::Rate loopRate(40);
153 
154  ROS_INFO("Trying to move arm to 90 deg pos");
155  _group.setNamedTarget("ninety_deg");
157  if(_group.plan(start_plan)) //Check if plan is valid
158  {
159  ROS_INFO("valid pos");
160  _group.execute(start_plan);
161  }
162  ROS_INFO("continueing...");
163 
164 
165  std::vector<double> group_variable_values;
166  group_variable_values.reserve(6);
167  _group.getCurrentState()->copyJointGroupPositions(
168  _group.getCurrentState()->getRobotModel()->getJointModelGroup(_group.getName()),
169  group_variable_values);
170 
171  GripperClient ac("/gripper_controller/gripper_cmd", true);
172  ROS_INFO("Waiting for action server to start.");
173  // wait for the action server to start
174  ac.waitForServer(); //will wait for infinite time
175 
176  ROS_INFO("Action server started.");
177  control_msgs::GripperCommandGoal goal;
178  while(ros::ok()) {
179  if(haveMoveGoal()) {
180 
181  std::vector<double> prev_group_variable_values;
182  prev_group_variable_values.reserve(6);
183 
184  if(_rotation1State == -1) {
185  _rotation1State = 0;
186  group_variable_values[0] -= _rotation1IncreamentValue;
187  } else if(_rotation1State == 1) {
188  _rotation1State = 0;
189  group_variable_values[0] += _rotation1IncreamentValue;
190  }
191 
192  if(_shoulder1State == -1) {
193  _shoulder1State = 0;
194  group_variable_values[1] -= _shoulder1IncreamentValue;
195  } else if(_shoulder1State == 1) {
196  _shoulder1State = 0;
197  group_variable_values[1] += _shoulder1IncreamentValue;
198  }
199 
200  if(_shoulder2State == -1) {
201  _shoulder2State = 0;
202  group_variable_values[2] -= _shoulder2IncreamentValue;
203  } else if(_shoulder2State == 1) {
204  _shoulder2State = 0;
205  group_variable_values[2] += _shoulder2IncreamentValue;
206  }
207 
208  if(_rotation2State == -1) {
209  _rotation2State = 0;
210  group_variable_values[3] -= _rotation2IncreamentValue;
211  } else if(_rotation2State == 1) {
212  _rotation2State = 0;
213  group_variable_values[3] += _rotation2IncreamentValue;
214  }
215 
216  if(_shoulder3State == -1) {
217  _shoulder3State = 0;
218  group_variable_values[4] -= _shoulder3IncreamentValue;
219  } else if(_shoulder3State == 1) {
220  _shoulder3State = 0;
221  group_variable_values[4] += _shoulder3IncreamentValue;
222  }
223 
224  if(_wristState == -1) {
225  _wristState = 0;
226  group_variable_values[5] -= _wristIncreamentValue;
227  } else if(_wristState == 1) {
228  _wristState = 0;
229  group_variable_values[5] += _wristIncreamentValue;
230  }
231 
232  if(_gripperState == -1) {
233  _gripperState = 0;
234  if(!_gripperWorking) {
235  // send a goal to the action
236 
237 
238  goal.command.position=0.001;
239  goal.command.max_effort=5;
240  ac.sendGoal(goal);
241 
242  } else {
243  ROS_WARN("[%s]: Gripper already have a goal please wait", ros::this_node::getName().c_str());
244  }
245 
246  } else if(_gripperState == 1) {
247  _gripperState = 0;
248  if (!_gripperWorking) {
249  goal.command.position=0.1;
250  goal.command.max_effort=5;
251  ac.sendGoal(goal);
252 
253  } else {
254  ROS_WARN("[%s]: Gripper already have a goal please wait", ros::this_node::getName().c_str());
255  }
256 
257  }
258 
259  for (int i=0; i<6; i++)
260  prev_group_variable_values[i] = group_variable_values[i];
261 
262 
263  _group.setJointValueTarget(group_variable_values);
265  bool success = (_group.plan(my_plan)==moveit::planning_interface::MoveItErrorCode::SUCCESS);
266  if (success) {
267  _group.move();
268  }
269  else {
270  ROS_WARN("[%s]: Invalid goal", ros::this_node::getName().c_str());
271  //if fail, revert to prev values
272  for (int i=0; i<6; i++)
273  group_variable_values[i] = prev_group_variable_values[i];
274  }
275  }
276 
277  loopRate.sleep();
278  }
279  }
280 
281 
282 
283 };
284 
285 int main(int argc, char** argv) {
286 
287  ros::init(argc, argv, "arm_joy_node");
288  ArmJoyNode armJoy;
289  armJoy.run();
290 
291  return 0;
292 
293 }
ros::AsyncSpinner _spinner
bool waitForServer(const ros::Duration &timeout=ros::Duration(0, 0)) const
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
bool setJointValueTarget(const std::vector< double > &group_variable_values)
float _shoulder2IncreamentValue
int main(int argc, char **argv)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
ROSCPP_DECL const std::string & getName()
float _shoulder3IncreamentValue
void setPlannerId(const std::string &planner_id)
#define ROS_WARN(...)
float _rotation2IncreamentValue
void joyCallback(const sensor_msgs::Joy::ConstPtr &msg)
#define ROS_INFO(...)
ROSCPP_DECL bool ok()
float _rotation1IncreamentValue
ros::NodeHandle _nodeHandle
MoveItErrorCode execute(const Plan &plan)
bool sleep()
void setNumPlanningAttempts(unsigned int num_planning_attempts)
void sendGoal(const Goal &goal, SimpleDoneCallback done_cb=SimpleDoneCallback(), SimpleActiveCallback active_cb=SimpleActiveCallback(), SimpleFeedbackCallback feedback_cb=SimpleFeedbackCallback())
ros::Subscriber _joySub
robot_state::RobotStatePtr getCurrentState()
float _shoulder1IncreamentValue
moveit::planning_interface::MoveGroupInterface _group
bool setNamedTarget(const std::string &name)
actionlib::SimpleActionClient< control_msgs::GripperCommandAction > GripperClient


armadillo2_demos
Author(s):
autogenerated on Wed Jan 3 2018 03:47:44