RPLIDAR现已支持ROS和Arduino

我们的RPLIDAR激光雷达目前支持了世界上2个著名的开源项目:ROS和Arduino。

ROS是机器人领域的开源操作系统。它的模块化设计节约了开发人员的大量时间,使他们可以更好的专注于机器人应用的开发。Arduino是一个非常易用的MCU开发平台,它使得任何人设计自己的电路成为可能。

我们为ROS设计了RPLIDAR的专门驱动node,方便开发人员将RPLIDAR整合到他们的机器人上。其驱动代码可以从github获得:https://github.com/robopeak/rplidar_ros.

rplidar_github

为Arduino,我们提供了RPLIDAR的驱动库。Arduino玩家可以像标准RPLIDAR sdk那样在Arduino上获取RPLIDAR的扫描数据了。另外,我们也提供了例程!

DSC00808rplidar_arduinoVoila_Capture 2014-05-17_12-03-07

该实例库目前已随着RPLIDAR开发套装的SDK一起发布。它的源代码也可在github找到:https://github.com/robopeak/rplidar_arduino.

RPLIDAR now supports ROS and Arduino

Now our RPLIDAR laser scanner supports two greatest opensource systems in the world: ROS and Arduino.

ROS is an open source operating system for Robotic applications. Its modular design (node) saves a lot efforts to build a new robot application. Arduino is an easy to use MCU development board, with Arduino, everyone can play with circuit now.

For ROS, we provide a driver node to help users integrate our RPLIDAR into their robots.  It is available on our github: https://github.com/robopeak/rplidar_ros.

rplidar_github

 

For Arduino, we made a driver library ready. Arduino users can use this library to fetch RPLIDAR data just as the standard RPLIDAR sdk does. Also, we provides related examples !

DSC00808

rplidar_arduinoVoila_Capture 2014-05-17_12-03-07

 

 

 

The library is included in our development kit SDK. You can find its source code at: https://github.com/robopeak/rplidar_arduino.

 

开源激光键盘第二代:更小更强大

由RoboPeak团队设计的开源激光键盘迎来了他的第二代版本!

新一代激光键盘更加的Cute,只有前代1/2的高度,足以放入您的口袋随身携带。

compare我们重新设计了光学系统,优化了键盘输入过程的精确性和稳定度。享受这美妙的使用体验吧:)

working

 

如今3D打印技术得到广泛应用,在我们的新一代激光键盘中,我们采用3D打印制造键盘的核心框架。这大大简化了组装的流程。只需要几步安装,您的激光键盘就可以工作。

thekit

 

如何购买?

目前DFRobot为我们的指定生产销售商,可以访问如下链接了解详情:

http://www.dfrobot.com.cn/goods-759.html

配套的使用文档:

配套的信号处理软件:

源代码:

代码许可:

在不做特殊说明前提下,这里给出的代码均使用LGPL授权。

Git Repos:

https://github.com/robopeak/laserkbd

注意:我们对提供的代码质量不做出任何保证,Play at your own risk. :P

如何编译源代码?

参考这篇教程

 

Laser Keyboard Kit II Comes: Smaller and Better

Our open-source laser projection keyboard kit now has its second generation!

The new generation only has 1/2 the height of its predecessor. It is so cute to allow you to put this little guy into your pocket.

compare

We also redesigned its optical system. You will feel the key input experience more reliable and precise. Enjoy it 🙂

working

 

3D print technology are used everywhere. In this new kit, 3d printed shell make the assemble process become simple and easy. Just a few steps, your laser keyboard II will work.

thekit
Where to buy?

Currently, DFRobot is our designated agent to sell Laser Keyboard Kit II:

Click the following link for details:

http://www.dfrobot.com/index.php?route=product/product&product_id=1122#.U05dpvmSySo

Related Documents:

Signal Processing Software:

The Source Code:

License Issue:

All the source code is licensed under LGPL by default.

Git Repos:

https://github.com/robopeak/laserkbd

NOTICE: no warranty for the sourcecode and the related software.

How to build from the source code?

Please refer to this article.

RPLidar Laser Scanner On Sale

We once announced our low cost Laser Scanner, RPLIDAR in the last year. After about half year, we have achieved better product quality through optimizing design as well as the production process. Currently the first batch of mass production RPLIDAR is ready for sale.

P1070717

Now, we are proud to announce, RPLIDAR will be released in the end of this April! And you can order it via support@robopeak.com.

RPLIDAR is a low cost LIDAR sensor suitable for indoor robotic SLAM application. It provides 360 degree scan field, 5.5hz rotating frequency with guaranteed 6 meter ranger distance.  By means of the high speed image processing engine designed by RoboPeak, the whole cost are reduced greatly, RPLIDAR is the ideal sensor in cost sensitive areas like robots consumer and hardware hobbyist.

rplidarmass-production version of RPLIDAR

Performance and Specification

The RPLIDAR core engine performs high speed distance measurement with more than 2000 samples per second. For a scan requires 360 samples per rotation, the 5.5hz scanning frequency can be achieved. Users can customized the scanning frequency from 2hz to 10hz freely by control the speed of the scanning motor. RPLIDAR will self-adapt the current scanning speed.

rplidar_specEach RPLIDAR to be produced must pass several strict tests and perform calibration to ensure more than 6-meters’ ranger distance with the laser output power still complies with CLASS I standard.

For more details, please refer to the datasheet.

SLAM Application

Good SLAM result can be achieved via RPLIDAR. The following video is based on RPLIDAR and our RPMini robot platform:

mergedWe will release the related ROS node to help users integrate RPLIDAR into ROS system. For product level application, we are developing our high performance SLAM solution which is optimized for RPLIDAR. Our SLAM solution can work greatly within embedded systems.

Development Kit

To help user to quickly evaluate our RPLIDAR, the first mass production volume is provided as development kits. A development kit includes an RPLIDAR with build-in motor driver and a usb adaptor to allow the RPLIDAR to be connected to PC. Besides, the open source SDK and demo applications are provided.

kitimageItems included in a Development Kit

rplidarsdk_en

the related SDK and Documents

Order Information

Please contact our support email for details: support@robopeak.com

 

 

RPLIDAR激光雷达正式发售

去年我们对外发布了RPLIDAR的原型机,这是一款测量半径6米以上、360度全向视角、扫描频率5.5hz的2D激光雷达,同时它也是一款机器人SLAM的理想传感器。与动辄上万的同类传感器相比,RPLIDAR采用了自主研发的光学图像引擎,极大地消减了成本,使之更适合于成本敏感的领域,诸如消费级产品和广大机器人爱好者。

rplidar

RPLIDAR产量版本的外观图

经过半年多的努力,我们对设计工艺进行了诸多优化,目前RPLIDAR已经顺利完成了首批量产。我们宣布RPLIDAR将于今年四月底正式对外发售!

目前我们已开始接受预订订单,请联系support@robopeak.com了解详情。

P1070717

性能指标与规格

RPLIDAR的激光测距引擎可以实现每秒2000次的测距操作,在保证每周360个角度采样解析度的条件下,可实现5.5hz的扫描频率。用户也可以自行调制扫描电机转速,实现2hz-10hz不等的扫描频率,RPLIDAR仍然自适应当前的实际转速正确输出每一个角度位置所对应的距离值。

rplidar_spec

我们在出厂时对每台RPLIDAR都进行了各项严格校正和检测,保证6米以上的测距距离,并且确保激光发射功率符合Class I要求。

具体的性能指标请参考 RPLIDAR说明文档

机器人同步定位与自主建图 (SLAM)

基于RPLIDAR进行SLAM可以实现非常优秀的SLAM效果,如下是我们的RPmini机器人采用RPLIDAR进行实时室内SLAM建图的视频。

merged

与此同时,我们也即将发布对应的ROS Node,方便用户将RPLIDAR快速整合进入ROS当中。此外,对于产品级别应用,我们也专门开发了针对RPLIDAR优化的SLAM以及自主运动的解决方案,它无需PC参与,可以在嵌入式设备中高效进行SLAM:

开发者套装

为了方便用户能够快速的评估RPLIDAR的性能并且整合到自己的系统当中,我们的首批量产机型是以开发套装的形式发售的。开发套件集成了扫描电机的驱动器,可以通过USB连接PC的适配器,以及开源的SDK和实例程序。

kitimage

 

RPLIDAR开发者套装

rplidarsdk_cn随开发套装配套的SDK与文档

订购信息

请联系support@robopeak.com询问订购的具体事宜

 

激光键盘软件源代码编译和修改指南

English Version: http://www.robopeak.net/blog/?p=332

I. 简介

RoboPeak 开源虚拟激光投影键盘设计的所有源代码已经发布在Github上。该源代码遵循LGPL许可。只要遵循LGPL许可的规范,您可以随意的使用或者修改本源代码。

本文旨在介绍如何在Windows以及MacOS平台上编译RoboPeak 开源虚拟激光投影键盘的信号处理软件。此外,也介绍了一些技术细节问题,帮助您理解代码并开发新的酷功能。

快速参考:

  • 如何在Windows上编译运行代码
  • 如何在MacOS上编译运行代码
  • 更多细节

II.  从源代码编译的理由

首先,从源代码编译允许您体验到我们为激光键盘开发的最新功能,这些功能并不会立刻在稳定版本中发布。您可以成为最早体验这些功能的人。

其次,如果您需要对我们的软件做出修改或者做改进。能编译源代码就是必经之路了。

此外,如果我们的信号处理软件无法在您的系统运行,那么在我们团队做出修正前,您可先尝试自己编译源代码来解决此问题。

III. 先要准备的

  • Windows

Windows XP 以及更高版本

Visual Studio 2010 (带有VC++包) 或者 Visual C++ 2010 express (更高的版本也可工作,但我们暂不作保证)

Git工具支持 (例如: msysgit)

  • MacOS

OS10.7 或更高版本 (我们使用OS10.8)

XCode 4.5 或者带有gcc支持的更高版本 (我们不使用 llvm-gcc进行编译)

GIT 工具(您可使用 macport or homebrew 来安装它)

除了上述的系统环境需求外,我们默认您具有基本的软件开发基础,例如:了解如何在Windows/MacOS上开发编译C++的程序,知道OpenCV是什么,GIT是什么。此外,您需要知道如何从github clone源代码

IV. 在Windows上编译运行源代码

STEP1: 从Github clone源代码

我们推荐您使用tortoise-git clone源代码到您本地的文件夹中,如下图例子那样;
tutorisegit_clone 或者直接基于如下命令行:

git clone https://github.com/robopeak/laserkbd.git

在Cl0ne完毕后,您应该看到如下的文件结构: cloned_source

STEP2: 在VS2010中编译

进入laser_kbd_neo 文件夹并打开VS项目文档:laser_kbd.sln:

vs2010

您只需要选择Release编译配置并开始编译即可。编译完毕后,您可以在 laser_kbd_neoRelease文件夹中找到编译好的可执行文件:laser_kbd.exe

vs_compiled

STEP3: 将必要的依赖文件复制并打包

上述编译产生的可执行文件需要其他依赖文件才能执行,并且这些依赖文件需要与可执行文件位于同一个目录。因此您需要将这些文件复制过来。我们推荐您创建一个新的目录,例如在代码根目录下建立一个output这样的目录,并将laser_kbd.exe以及下列文件夹、文件复制进来:

  • laser_kbd_neores 文件夹
  • sdkpackrefdll*.dll

最终的软件包应该看起来像这样: vs_released

大功告成!

现在您自己编译的信号处理软件已经可以工作了! win32_done

V. 在MacOS下编译源代码

STEP#1 Clone源代码

使用如下命令将Github的源代码clone至您本地的文件系统:

$ git clone https://github.com/robopeak/laserkbd.git

在clone完毕后您应该看到如下的文件结构

Shikais-MacBook-Pro:laserkbd csk$ ls
README.md laser_kbd_neo sdkpack

STEP#2 在XCode中编译运行

进入目录laser_kbd_neo/xcode, 打开项目文件LaserKeyborad.xcodeproj.

xcode_compile

您可以直接点击运行按钮就可以编译出可以执行的软件包了(Debug版本)

macos_compiled

VI. 实现细节浅析

1. 文件组织

本源代码文件按照如下的结构进行组织

<source root>
      +---- laser_kbd_neo/            <--- 所有的源代码、IDE用到的工程文档
      |          +---- ref/           <--- 第三方库的源代码
      |          +---- res/           <--- 软件所用到的图片、数据等文件
      |          +---- src/           <--- 信号处理软件自身的源代码
      |          |      +---- port/      <--- 平台相关的源代码
      |          +---- xcode/         <--- MacOS/xcode相关的源代码和项目文档
      |          |---- laser_kbd.sln  <--- Visual Studio 2010项目文档
      +---- sdkpack
                 +---- license_and_copyrights/   <--- 第三方库的许可协议和README文档
                 +---- ref/
                        +---- dll/               <--- 第三方库的预编译dll (win32)
                        +---- lib/               <--- 第三方库的预编译lib (win32)
                        +---- inc/               <--- 第三方库的头文件
                        +---- dylib/             <--- 第三方库的预编译dll (MacOS)

 

2. 如何将代码移植到其他平台下?

本信号处理软件在开发初期就考虑了高度可移植性,表现在:

1) 所有的核心处理逻辑都是平台无关的代码

2) 所有平台相关的代码都放在了目录 src/port 里

3) 在平台相关/平台无关代码之间有明确的接口作桥梁

4) 所有依赖到的第三方库也是高度跨平台的,例如: OpenCV

如果您打算将源代码移植到新的平台下,您需要为这个新平台实现一个新的移植层(port layer)。这个移植层至少需要提供如下功能:

  • 按键事件注入

当“键盘”按下后,往OS注入对应的键盘事件

  • 摄像头视频捕捉已经曝光控制

由于OpenCV本身不允许用户代码控制摄像头的曝光参数,因此移植层需要实现这个机制。

所有对平台相关代码的调用接口都定义在了src/port/common文件夹里面。如果您确定要开始移植工作,则应该从这些接口定义开始入手。

此外,您也可以参考目前Windows和MacOS上的移植层。

3. 如何修改键盘布局?kbd_layout

位于src/keyboard_emu/layout_provider.cpp 的代码控制信号处理软件内部的键盘布局信息。 (实际的虚拟键盘投射元件也需要做出修改).

通过修改 _key_mapper[] 描述数组,可以实现对软件中键盘布局的修改。

4. 如何实现在“按键”时播放声音提示?

该功能已经在Windows平台中实现.

由于播放音频的方法是与具体操作系统相关的,因此推荐将这个功能放在移植层里面实现。这里将举例说明如何在Windows上实现这个功能。

我们使用如下的Win32 api实现播放一段制定的wav音频:

BOOL sndPlaySound(
 LPCTSTR lpszSound,
 UINT fuSound
 );

在这个例子里,我们使用的音频文件叫做type.wav. 当用户“按键”后,windows就会播放这个声音:

在移植层中定义了接口OSKeyInjector::injectKeyEvents用于操作用户“按键”以后的事情. 可以从这里入手加入播放声音的功能:

如下是Windows平台中该接口的原始实现代码 (keyinjector_win32.cpp)

    virtual bool injectKeyEvents( const std::vector<KeyEventDesc> & intputlist)
    {
        if (!intputlist.size()) return false;

        INPUT * inputs = new INPUT[intputlist.size()];

        do
        {
            for (int pos=0; pos<intputlist.size(); ++pos)
            {
                inputs[pos].type = INPUT_KEYBOARD;
                inputs[pos].ki.wVk = intputlist[pos].keyval;

                if (intputlist[pos].type == KEY_EVENT_PRESSED) {
                    hasinputs = true;
                    inputs[pos].ki.dwFlags =  0;
                } else {
                    inputs[pos].ki.dwFlags =  KEYEVENTF_KEYUP;
                }

                inputs[pos].ki.time = 0;
            }

            SendInput(intputlist.size(), inputs, sizeof(INPUT));

        }while(0);

        delete [] inputs;

        return true;
    }

我们将它修改如下:

    virtual bool injectKeyEvents( const std::vector<KeyEventDesc> & intputlist)
    {
        if (!intputlist.size()) return false;

+        bool hasinputs = false;

        INPUT * inputs = new INPUT[intputlist.size()];

        do
        {
            for (int pos=0; pos<intputlist.size(); ++pos)
            {
                inputs[pos].type = INPUT_KEYBOARD;
                inputs[pos].ki.wVk = intputlist[pos].keyval;

                if (intputlist[pos].type == KEY_EVENT_PRESSED) {
+                    hasinputs = true;
                    inputs[pos].ki.dwFlags =  0;
                } else {
                    inputs[pos].ki.dwFlags =  KEYEVENTF_KEYUP;
                }

                inputs[pos].ki.time = 0;
            }

            SendInput(intputlist.size(), inputs, sizeof(INPUT));

        }while(0);

        delete [] inputs;

+        if (hasinputs && g_config_bundle.playsound) {
+            // play sound feedback
+            std::string soundfile = FILEPATH_RESOURCE_SOUND_FOLDER;
+            soundfile += "type.wav";
+            ::sndPlaySoundA( soundfile.c_str(), SND_ASYNC);
+        }

        return true;
    }

这样按键声音反馈功能就实现好了。您可以自行编译github的源代码体验一下:)

Tips for Compiling the Laser Keyboard Software Source Code

I. Introduction

Currently, the full source code of RoboPeak open source laser projection keyboard design has been published on Github. The released source code applies the LGPL license. You can freely use the code and modify it as long as you follow the terms described in LGPL. This article describes how to compile the source code of the  signal processing software for RoboPeak Laser Projection Keyboard on Windows and MacOS systems. Besides, some in-depths implementation details are provided to help you understand the source code and make cool modifications.

Quick Ref:

  • Compile the source on Windows
  • Compile the source on MacOS
  • More details

II.  Reasons to compile the source code

Firstly, compiling the source code allows you to experience the latest features which hasn’t been included in the stable release version yet. You can be the very first personal to trail these cool features.

Secondly, if you want to make some modifications/improvements to the current design, compiling the source code is the first step.

Thirdly, if you find our released signal processing software cannot work on your system, compiling the source code by yourself may be a quick solution before RoboPeak team release bug fix to your issues.

III. Prerequisite

  • Windows

Windows XP or higher version

Visual Studio 2010 (with VC++ package installed) or Visual C++ 2010 express (higher version may work as well, but they haven’t been tested yet)

Git Tool support (e.g. msysgit)

  • MacOS

OS10.7 or higher (we use OS10.8)

XCode 4.5 or higher with GCC support (we don’t use llvm-gcc)

GIT tool (you can install it using macport or homebrew)

Besides the above requirements, we also assume you have some basic ideas related to software developement: e.g. how to compile a C++ program on Windows/MacOS, what OpenCV is , what GIT is , etc Also, you need to clone the latest source on github.

IV. Compile the source code on Windows

STEP1: clone the source code from github

We recommend you to use tortoise-git to clone the source code to your local folder. The following is an example: tutorisegit_clone or using the following command:

git clone https://github.com/robopeak/laserkbd.git

You should get the following file structure after the clone operation has been finished: cloned_source

STEP2: Compile the source using VS2010

Enter the laser_kbd_neo folder and open the VS solution file laser_kbd.sln:

vs2010

To build the source code, simply using the Release configuration and start build. You will find the compiled binary file laser_kbd.exe under the folder: laser_kbd_neoRelease:

vs_compiled

STEP3: Copy the essential files to build the working package

The generated executable requires its dependencies to be present in the same folder. You need to copy these dependencies to make the compiled software work. It is recommended to create a clean folder like output under the root of the source code: i.e.   laserkbd_source_rootoutput Copy the above laser_kbd.exe into this folder, and the following files as well:

  • laser_kbd_neores folder
  • sdkpackrefdll*.dll files

The final package should look like the following: vs_released

Done!

The signal processing software build by your own is ready to go now! win32_done

V. Compile the source code on MacOS

STEP#1 Clone the source code

Clone the laser keyboard source code to your local folder using the following command:

$ git clone https://github.com/robopeak/laserkbd.git

You should find the following files/folders in the cloned source folder:

Shikais-MacBook-Pro:laserkbd csk$ ls
README.md laser_kbd_neo sdkpack

STEP#2 Compile the source using XCode

Enter the folder laser_kbd_neo/xcode, open the project file: LaserKeyborad.xcodeproj.

xcode_compile

You can execute the final workable software package simply click the Run button (for debug version)

macos_compiled

VI. Implementation tips

1. file organization

The source code tree is organized based on the following structure:

<source root>
      +---- laser_kbd_neo/            <--- All the source code/IDE project files/3rd party libs src
      |          +---- ref/           <--- source code of the 3rd party libs
      |          +---- res/           <--- image/data required by the software
      |          +---- src/           <--- source code of the signal processing software
      |          |      +---- port/      <--- target platform dependent code
      |          +---- xcode/         <--- MacOS/xcode related code and the project file
      |          |---- laser_kbd.sln  <--- Visual Studio 2010 solution file
      +---- sdkpack
                 +---- license_and_copyrights/   <--- license/readme files of the 3rd party libs
                 +---- ref/
                        +---- dll/               <--- prebuilt dll binaries of the 3rd party libs (win32)
                        +---- lib/               <--- prebuilt static lib binaries of the 3rd party libs (win32)
                        +---- inc/               <--- header source of the 3rd party libs
                        +---- dylib/             <--- prebuilt dll binaries of the 3rd party libs (MacOS)

 

2. How to port the code to other platforms?

The signal processing software is inherently designed with highly portability:

1) all the core logic is implemented as platform independent

2) all the target specific code. is located under the src/port folder

3) there is a clean interface between the platform independent code and the target specific code.

4) all the 3rd libs required by the software are highly portable as well, e.g. OpenCV

If you want to port the code to a new platform, you should implement a new port layer for that platform. The port layer should provide at least the  following functions:

  • Key event injection

Inject key events to the target OS when virtual keys is pressed

  • Camera video capture and exposure control

As openCV doesn’t provide interface to allow user code to control a camera’s exposure value. The port layer should implement it.

The interfaces to  the target specific code are defined in the header files under the src/port/common folder. If you really want to do the port work, you should start from that place.

Also, the existing Windows and MacOS port layers are good reference for you.

3. how to change the keyboard layout?kbd_layout

The code inside the file src/keyboard_emu/layout_provider.cpp controls the keyboard layout used by the software (the actual keyboard layout projector should be changed as well).

You can modify the _key_mapper[] array to change the layout.

4. how to add sound feedback when a “key” has been pressed?

This feature has been implemented on Windows target.

As the way to playing a sound is target specific, it is recommended to implement the code inside the port layer. Here is the example to show you how to do this on Windows platform.

We use the following Win32 API to play a sound from a given wav file:

BOOL sndPlaySound(
 LPCTSTR lpszSound,
 UINT fuSound
 );

In the example, we choose a wav file called type.wav. When user press “keys”, Windows will play the sound.

The interface OSKeyInjector::injectKeyEvents defined in the port  layer will be invoked when user pressed “keys”. It should be a good place for us to added the sound feedback.

Here is a snapshot of the injectKeyEvents implementation on Windows platform (keyinjector_win32.cpp)

    virtual bool injectKeyEvents( const std::vector<KeyEventDesc> & intputlist)
    {
        if (!intputlist.size()) return false;

        INPUT * inputs = new INPUT[intputlist.size()];

        do
        {
            for (int pos=0; pos<intputlist.size(); ++pos)
            {
                inputs[pos].type = INPUT_KEYBOARD;
                inputs[pos].ki.wVk = intputlist[pos].keyval;

                if (intputlist[pos].type == KEY_EVENT_PRESSED) {
                    hasinputs = true;
                    inputs[pos].ki.dwFlags =  0;
                } else {
                    inputs[pos].ki.dwFlags =  KEYEVENTF_KEYUP;
                }

                inputs[pos].ki.time = 0;
            }

            SendInput(intputlist.size(), inputs, sizeof(INPUT));

        }while(0);

        delete [] inputs;

        return true;
    }

We changed the above code to the following:

    virtual bool injectKeyEvents( const std::vector<KeyEventDesc> & intputlist)
    {
        if (!intputlist.size()) return false;

+        bool hasinputs = false;

        INPUT * inputs = new INPUT[intputlist.size()];

        do
        {
            for (int pos=0; pos<intputlist.size(); ++pos)
            {
                inputs[pos].type = INPUT_KEYBOARD;
                inputs[pos].ki.wVk = intputlist[pos].keyval;

                if (intputlist[pos].type == KEY_EVENT_PRESSED) {
+                    hasinputs = true;
                    inputs[pos].ki.dwFlags =  0;
                } else {
                    inputs[pos].ki.dwFlags =  KEYEVENTF_KEYUP;
                }

                inputs[pos].ki.time = 0;
            }

            SendInput(intputlist.size(), inputs, sizeof(INPUT));

        }while(0);

        delete [] inputs;

+        if (hasinputs && g_config_bundle.playsound) {
+            // play sound feedback
+            std::string soundfile = FILEPATH_RESOURCE_SOUND_FOLDER;
+            soundfile += "type.wav";
+            ::sndPlaySoundA( soundfile.c_str(), SND_ASYNC);
+        }

        return true;
    }

Now the sound feedback feature has been implemented. You may checkout the latest source to have a try:)