18 #include <sys/ioctl.h> 19 #include <linux/joystick.h> 23 #include <ros/package.h> 26 #include <sensor_msgs/Joy.h> 29 int main(
int argc,
char **argv){
31 ros::init(argc, argv,
"joy_publisher");
32 ros::NodeHandle nh(
"~");
34 ros::Publisher joy_pub = nh.advertise<sensor_msgs::Joy>(
"joy", 100);
40 nh.param<std::string>(
"joy_dev", joy_dev,
"/dev/input/js0");
42 ROS_INFO(
"Device: %s", joy_dev.c_str());
47 int num_of_buttons = 0;
48 char name_of_joystick[80];
49 std::vector<int32_t> joy_button;
50 std::vector<float> joy_axes;
53 if((joy_fd = open(joy_dev.c_str(), O_RDONLY)) < 0){
54 ROS_ERROR(
"Failed to open %s", joy_dev.c_str());
59 ioctl(joy_fd, JSIOCGAXES, &num_of_axes);
60 ioctl(joy_fd, JSIOCGBUTTONS, &num_of_buttons);
61 ioctl(joy_fd, JSIOCGNAME(80), &name_of_joystick);
64 joy_button.resize(num_of_buttons,0);
65 joy_axes.resize(num_of_axes,0);
67 ROS_INFO(
"Joystick: %s", name_of_joystick);
68 ROS_INFO(
"Axis: %d", num_of_axes);
69 ROS_INFO(
"Buttons: %d", num_of_buttons);
72 fcntl(joy_fd, F_SETFL, O_NONBLOCK);
87 auto _ = read(joy_fd, &js,
sizeof(js_event));
94 switch(js.type & ~JS_EVENT_INIT){
97 joy_axes.at((
int)js.number) = (float)(js.value)/SHRT_MAX;
98 }
catch(std::out_of_range& e){
103 case JS_EVENT_BUTTON:
105 joy_button.at((
int)js.number) = js.value;
106 }
catch(std::out_of_range& e){
112 joy_msg.axes = joy_axes;
113 joy_msg.buttons = joy_button;
115 joy_pub.publish(joy_msg);
sensor_msgs::Joy joy_msg
Storage for joystick input.
int main(int argc, char **argv)