项目上需要使用罗技(logitech) G29 游戏方向盘来进行演示远程驾驶。
罗技(logitech) G29 游戏方向盘与window系统有专门的“logitech 游戏软件”,可以对其驱动与设置,但是window系统要获取方向盘数据,并进行定制开发好像要借助unity来实现,这个与我们主研方向不一致,所以没必要时就不走这条路。
在linux系统下,有没有办法获取方向盘数据?答案是肯定的。
当我们将G29连接上电脑时,在/proc/bus/input/devices 中会多出一个设备:/dev/input/event11 (或者 /dev/input/js0)
这个设备文件就是我们的G29的input节点,当我们转动方向,或者踩油门时,这个节点上都会有数据产生。
可以通过以下命令查看:
cat /dev/input/js0 | hexdump
但这个打印出来的是原始的hex数据,没有可读性,那现在问题就是:如何将这个数据解析成具体的可读的数据?
从网上找了许久的资料,没有找到可参考的。无意间却发现了一个操纵杆的校准工具:jstest-gtk
可以通过命令进行安装:
apt-get install jstest-gtk
运行后(jstest-gtk /dev/input/js0 ),有一图形界面,可以看到当操作g29时,数据在界面上都有对应的显示,
方向盘、油门、刹车等,都有数据条,也就是说这个工具已经帮我们把 cat /dev/input/js0 | hexdump 进行了转换,
那我们就可以基于这个源码去开发了,(源码下载地址:https://download.csdn.net/download/amlinsan/12274982)
拿到jstest-gtk-0.1.0后,要安装以下工具:
apt-get install scons
apt-get install cmake
apt-get install sigc++
apt-get install gtkmm-2.4
apt-get install libboost-all-dev
如果是ubuntu 14.04的话,需要在软件中心安装:gtkglextmm
编译时可能会报错,在joystick.cpp中加下头文件
#include
#include
编译方式,执行: scons
运行方式: jstest-gtk /dev/input/event11
关于方向盘与按钮等数据对应的接口是:
joystick_test_widget.cpp中的:
void
JoystickTestWidget::axis_move(int number, int value)
{
axes.at(number)->set_fraction((value + 32767) / (double)(2*32767));
std::ostringstream str;
str << value;
axes.at(number)->set_text(str.str());
axis_callbacks[number](value / 32767.0);
std::cout << "amlinsan axis_move-number:" << number << "; value:" << value << std::endl;
}
void
JoystickTestWidget::button_move(int number, bool value)
{
if (value)
buttons.at(number)->set_down(true);
else
buttons.at(number)->set_down(false);
std::cout << "amlinsan button_move-number:" << number << "; value:" << value << std::endl;
}
接下来就在这里改就好了。