RobotControlMux.cpp
Go to the documentation of this file.
2 
3 namespace rsm {
4 
6  ros::NodeHandle privateNh("~");
7  privateNh.param<std::string>("autonomy_cmd_vel_topic",
8  _autonomy_operation_cmd_vel_topic, "autonomy/cmd_vel");
9  privateNh.param<std::string>("teleoperation_cmd_vel_topic",
10  _teleoperation_cmd_vel_topic, "teleoperation/cmd_vel");
11  privateNh.param<std::string>("cmd_vel_topic", _cmd_vel_topic, "cmd_vel");
12  privateNh.param<std::string>("joystick_topic", _joystick_topic, "joy");
13  privateNh.param("teleoperation_idle_timer",
15  privateNh.param("joystick_used", _joystick_used, false);
16 
17  ros::NodeHandle nh("rsm");
18  _set_operation_mode_service = nh.advertiseService("setOperationMode",
20 
21  _autonomy_cmd_vel_sub = _nh.subscribe(_autonomy_operation_cmd_vel_topic, 1,
23  _teleoperation_cmd_vel_sub = _nh.subscribe(_teleoperation_cmd_vel_topic, 1,
25  _joystick_sub = _nh.subscribe(_joystick_topic, 1,
27 
28  _cmd_vel_pub = _nh.advertise<geometry_msgs::Twist>(_cmd_vel_topic, 1);
29  _operation_mode_pub = nh.advertise<rsm_msgs::OperationMode>("operationMode",
30  1);
31 
35  false);
36 
38  _operation_mode = rsm_msgs::OperationMode::STOPPED;
39 }
40 
42 
43 }
44 
46  publishCmdVel();
48 }
49 
51  geometry_msgs::Twist cmd_vel;
53  if (_operation_mode == rsm_msgs::OperationMode::AUTONOMOUS) {
54  cmd_vel = _autonomy_cmd_vel;
55  } else if (_operation_mode == rsm_msgs::OperationMode::TELEOPERATION) {
56  cmd_vel = _teleoperation_cmd_vel;
57  }
58  }
59  _cmd_vel_pub.publish(cmd_vel);
60 }
61 
63  rsm_msgs::OperationMode msg;
64  msg.emergencyStop = _emergency_stop_active;
65  msg.mode = _operation_mode;
67 }
68 
69 bool RobotControlMux::setOperationMode(rsm_msgs::SetOperationMode::Request &req,
70  rsm_msgs::SetOperationMode::Response &res) {
71  _emergency_stop_active = req.operationMode.emergencyStop;
72  _operation_mode = req.operationMode.mode;
73  res.success = 1;
74  res.message = "Operation mode set";
75  return true;
76 }
77 
79  const geometry_msgs::Twist::ConstPtr& cmd_vel) {
80  _autonomy_cmd_vel = *cmd_vel;
81 }
82 
84  const geometry_msgs::Twist::ConstPtr& cmd_vel) {
85  _teleoperation_cmd_vel = *cmd_vel;
87  if (_teleoperation_cmd_vel.linear.x != 0.0
88  || _teleoperation_cmd_vel.linear.y != 0.0
89  || _teleoperation_cmd_vel.linear.z != 0.0
90  || _teleoperation_cmd_vel.angular.x != 0.0
91  || _teleoperation_cmd_vel.angular.y != 0.0
92  || _teleoperation_cmd_vel.angular.z != 0.0) {
93  _operation_mode = rsm_msgs::OperationMode::TELEOPERATION;
95  }
96  if (_operation_mode == rsm_msgs::OperationMode::TELEOPERATION) {
98  }
99  }
100 }
101 
102 void RobotControlMux::joystickCallback(const sensor_msgs::Joy::ConstPtr& joy) {
103  if (!_emergency_stop_active) {
104  if (checkJoystickCommand(joy)) {
105  _operation_mode = rsm_msgs::OperationMode::TELEOPERATION;
107  }
108  if (_operation_mode == rsm_msgs::OperationMode::TELEOPERATION) {
110  }
111  }
112 }
113 
115  const ros::TimerEvent& event) {
116  _operation_mode = rsm_msgs::OperationMode::STOPPED;
117  geometry_msgs::Twist empty_cmd_vel;
118  _teleoperation_cmd_vel = empty_cmd_vel;
120 }
121 
123  const sensor_msgs::Joy::ConstPtr& joy) {
124  bool movingCommand = false;
125  if (_joystick_cmd.axes.size() == joy->axes.size()) {
126  for (unsigned int i = 0; i < joy->axes.size(); i++) {
127  if ((std::abs(joy->axes[i]) - std::abs(_joystick_cmd.axes[i]))
128  > MOVE_THRESH) {
129  movingCommand = true;
130  }
131  }
132  }
133  if (_joystick_cmd.buttons.size() == joy->buttons.size()) {
134  for (unsigned int i = 0; i < joy->buttons.size(); i++) {
135  if (joy->buttons[i] && !_joystick_cmd.buttons[i]) {
136  movingCommand = true;
137  }
138  }
139  }
140  _joystick_cmd = *joy;
141  return movingCommand;
142 }
143 
144 } /* namespace rsm */
ros::Publisher _cmd_vel_pub
void teleoperationIdleTimerCallback(const ros::TimerEvent &event)
std::string _joystick_topic
ros::ServiceServer _set_operation_mode_service
void publish(const boost::shared_ptr< M > &message) const
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
void stop()
void start()
bool checkJoystickCommand(const sensor_msgs::Joy::ConstPtr &joy)
ros::Publisher _operation_mode_pub
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
geometry_msgs::Twist _teleoperation_cmd_vel
double _teleoperation_idle_timer_duration
std::string _teleoperation_cmd_vel_topic
ros::Subscriber _teleoperation_cmd_vel_sub
bool setOperationMode(rsm_msgs::SetOperationMode::Request &req, rsm_msgs::SetOperationMode::Response &res)
ros::NodeHandle _nh
ros::Timer _teleoperation_idle_timer
sensor_msgs::Joy _joystick_cmd
Definition: BaseState.h:8
bool param(const std::string &param_name, T &param_val, const T &default_val) const
void joystickCallback(const sensor_msgs::Joy::ConstPtr &joy)
void teleoperationCmdVelCallback(const geometry_msgs::Twist::ConstPtr &cmd_vel)
Timer createTimer(Rate r, Handler h, Obj o, bool oneshot=false, bool autostart=true) const
void autonomyCmdVelCallback(const geometry_msgs::Twist::ConstPtr &cmd_vel)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
ros::Subscriber _autonomy_cmd_vel_sub
#define MOVE_THRESH
std::string _cmd_vel_topic
std::string _autonomy_operation_cmd_vel_topic
ros::Subscriber _joystick_sub
geometry_msgs::Twist _autonomy_cmd_vel


rsm_core
Author(s): Marco Steinbrink
autogenerated on Tue Mar 16 2021 02:44:31