spacenav_commander.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Fraunhofer Institute for Manufacturing Engineering and Automation (IPA)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
18 #include <string>
19 #include <ros/ros.h>
20 #include <geometry_msgs/Twist.h>
21 #include <geometry_msgs/TwistStamped.h>
22 #include <sensor_msgs/Joy.h>
23 
24 #include <boost/thread/mutex.hpp>
25 
27 {
28 public:
30  {
33  twist_pub_ = nh_.advertise<geometry_msgs::TwistStamped> ("twist_controller/command_twist_stamped", 1);
34 
35  if (nh_.hasParam("root_frame"))
36  {
37  nh_.getParam("root_frame", root_frame_);
38  }
39  else
40  {
41  ROS_WARN("No 'root_frame' specified. Setting to 'base_link'!");
42  root_frame_ = "base_link";
43  }
44  if (nh_.hasParam("chain_tip_link"))
45  {
46  nh_.getParam("chain_tip_link", tip_frame_);
47  }
48  else
49  {
50  ROS_ERROR("No 'chain_tip_link' specified. Using 'root_frame' instead!");
52  }
53 
54  // could be made a parameter or even dynamically reconfigurable
55  ros::NodeHandle nh_priv("~");
56  nh_priv.param<double>("scaling_factor", scaling_factor_, 0.1);
57  dead_man_enabled_ = false;
59 
60  timer_ = nh_.createTimer(ros::Duration(0.01), &SpacenavCommander::timerCallback, this); // guarantee 100Hz
61  timer_.start();
62  }
63 
65  {
66  }
67 
69  void joySpacenavCallback(const sensor_msgs::Joy::ConstPtr& msg)
70  {
71  boost::mutex::scoped_lock lock(mutex_);
72 
73  if (msg->buttons[0]) // dead man
74  {
75  dead_man_enabled_ = true;
76  }
77  else
78  {
79  // publish one last zero-twist
81  {
82  geometry_msgs::TwistStamped ts;
83  ts.header.frame_id = root_frame_;
84  ts.header.stamp = ros::Time::now();
85  twist_pub_.publish(ts);
86  }
87  dead_man_enabled_ = false;
88  }
89 
90  if (msg->buttons[1]) // root_frame/tip_frame selection
91  {
93  }
94  else
95  {
97  }
98  }
99 
101  void twistSpacenavCallback(const geometry_msgs::Twist::ConstPtr& msg)
102  {
103  boost::mutex::scoped_lock lock(mutex_);
104 
105  ts_.twist.linear.x = scaling_factor_ * msg->linear.x;
106  ts_.twist.linear.y = scaling_factor_ * msg->linear.y;
107  ts_.twist.linear.z = scaling_factor_ * msg->linear.z;
108  ts_.twist.angular.x = scaling_factor_ * msg->angular.x;
109  ts_.twist.angular.y = scaling_factor_ * msg->angular.y;
110  ts_.twist.angular.z = scaling_factor_ * msg->angular.z;
111  }
112 
114  {
115  boost::mutex::scoped_lock lock(mutex_);
116 
117  if (dead_man_enabled_)
118  {
119  ts_.header.frame_id = frame_id_;
120  ts_.header.stamp = ros::Time::now();
121 
123  }
124  }
125 
126 private:
132 
134  boost::mutex mutex_;
137  geometry_msgs::TwistStamped ts_;
138 };
139 
140 
141 int main(int argc, char **argv)
142 {
143  ros::init(argc, argv, "spacenav_commander");
145  ros::spin();
146 }
SpacenavCommander::twist_spacenav_sub_
ros::Subscriber twist_spacenav_sub_
Definition: spacenav_commander.cpp:128
SpacenavCommander::twistSpacenavCallback
void twistSpacenavCallback(const geometry_msgs::Twist::ConstPtr &msg)
Receive Twist from a 6d input device (e.g. 3DConnexion SpaceNavigator)
Definition: spacenav_commander.cpp:101
ros::Publisher
SpacenavCommander::scaling_factor_
double scaling_factor_
Definition: spacenav_commander.cpp:135
SpacenavCommander::dead_man_enabled_
bool dead_man_enabled_
Definition: spacenav_commander.cpp:133
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
ros::NodeHandle::getParam
bool getParam(const std::string &key, bool &b) const
ros.h
SpacenavCommander::mutex_
boost::mutex mutex_
Definition: spacenav_commander.cpp:134
SpacenavCommander::timerCallback
void timerCallback(const ros::TimerEvent &)
Definition: spacenav_commander.cpp:113
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
SpacenavCommander
Definition: spacenav_commander.cpp:26
SpacenavCommander::joy_spacenav_sub_
ros::Subscriber joy_spacenav_sub_
Definition: spacenav_commander.cpp:129
SpacenavCommander::joySpacenavCallback
void joySpacenavCallback(const sensor_msgs::Joy::ConstPtr &msg)
Receive Joy from a 6d input device (e.g. 3DConnexion SpaceNavigator)
Definition: spacenav_commander.cpp:69
ROS_ERROR
#define ROS_ERROR(...)
ros::NodeHandle::hasParam
bool hasParam(const std::string &key) const
ROS_WARN
#define ROS_WARN(...)
ros::NodeHandle::subscribe
Subscriber subscribe(const std::string &topic, uint32_t queue_size, const boost::function< void(C)> &callback, const VoidConstPtr &tracked_object=VoidConstPtr(), const TransportHints &transport_hints=TransportHints())
ros::TimerEvent
SpacenavCommander::frame_id_
std::string frame_id_
Definition: spacenav_commander.cpp:136
SpacenavCommander::ts_
geometry_msgs::TwistStamped ts_
Definition: spacenav_commander.cpp:137
SpacenavCommander::nh_
ros::NodeHandle nh_
Definition: spacenav_commander.cpp:127
SpacenavCommander::~SpacenavCommander
~SpacenavCommander()
Definition: spacenav_commander.cpp:64
SpacenavCommander::twist_pub_
ros::Publisher twist_pub_
Definition: spacenav_commander.cpp:130
SpacenavCommander::tip_frame_
std::string tip_frame_
Definition: spacenav_commander.cpp:136
ros::NodeHandle::param
T param(const std::string &param_name, const T &default_val) const
ros::spin
ROSCPP_DECL void spin()
SpacenavCommander::SpacenavCommander
SpacenavCommander()
Definition: spacenav_commander.cpp:29
ros::Timer::start
void start()
ros::NodeHandle::createTimer
Timer createTimer(Duration period, const TimerCallback &callback, bool oneshot=false, bool autostart=true) const
ros::Duration
ros::Timer
SpacenavCommander::root_frame_
std::string root_frame_
Definition: spacenav_commander.cpp:136
SpacenavCommander::timer_
ros::Timer timer_
Definition: spacenav_commander.cpp:131
ros::NodeHandle
ros::Subscriber
ros::Time::now
static Time now()
main
int main(int argc, char **argv)
Definition: spacenav_commander.cpp:141


cob_frame_tracker
Author(s): Felix Messmer
autogenerated on Mon May 1 2023 02:44:25