Merge lp:sr-ros-interface into lp:sr-ros-interface/release1.2

Proposed by Ugo
Status: Merged
Approved by: Ugo
Approved revision: 117
Merged at revision: 2
Proposed branch: lp:sr-ros-interface
Merge into: lp:sr-ros-interface/release1.2
Diff against target: 27147 lines (+25444/-0) (has conflicts)
283 files modified
.bzrignore (+96/-0)
shadow_robot/README.txt (+17/-0)
shadow_robot/cyberglove/.cproject (+575/-0)
shadow_robot/cyberglove/.project (+116/-0)
shadow_robot/cyberglove/CMakeLists.txt (+34/-0)
shadow_robot/cyberglove/Makefile (+1/-0)
shadow_robot/cyberglove/Ogre.log (+419/-0)
shadow_robot/cyberglove/cmake_install.cmake (+44/-0)
shadow_robot/cyberglove/create_eclipse_project (+9/-0)
shadow_robot/cyberglove/cyberglove.launch (+20/-0)
shadow_robot/cyberglove/include/cyberglove/cyberglove_publisher.h (+71/-0)
shadow_robot/cyberglove/include/cyberglove/cyberglove_service.h (+47/-0)
shadow_robot/cyberglove/include/cyberglove/serial_glove.h (+48/-0)
shadow_robot/cyberglove/include/cyberglove/xml_calibration_parser.h (+119/-0)
shadow_robot/cyberglove/mainpage.dox (+32/-0)
shadow_robot/cyberglove/manifest.xml (+29/-0)
shadow_robot/cyberglove/model/cyberglove.xml (+129/-0)
shadow_robot/cyberglove/python_lib/cyberglove_calibrer.py (+317/-0)
shadow_robot/cyberglove/python_lib/cyberglove_library.py (+152/-0)
shadow_robot/cyberglove/python_lib/cyberglove_mapper.py (+355/-0)
shadow_robot/cyberglove/src/cyberglove_node.cpp (+53/-0)
shadow_robot/cyberglove/src/cyberglove_publisher.cpp (+222/-0)
shadow_robot/cyberglove/src/cyberglove_service.cpp (+40/-0)
shadow_robot/cyberglove/src/serial_glove.c (+236/-0)
shadow_robot/cyberglove/src/xml_calibration_parser.cpp (+308/-0)
shadow_robot/cyberglove/srv/Calibration.srv (+3/-0)
shadow_robot/cyberglove/srv/Start.srv (+3/-0)
shadow_robot/cyberglove/test/cyberglove_test.cal (+19/-0)
shadow_robot/cyberglove/test/test_calibration.cpp (+136/-0)
shadow_robot/dataglove/CMakeLists.txt (+17/-0)
shadow_robot/dataglove/Makefile (+1/-0)
shadow_robot/dataglove/dataglove_processing/CMakeLists.txt (+34/-0)
shadow_robot/dataglove/dataglove_processing/Makefile (+1/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/data_analyser.h (+41/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/database_mapping.h (+41/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/hand_model.h (+52/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/joint_data.h (+46/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/message_publisher.h (+56/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/optical_dataglove.h (+45/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/position_mapper.h (+44/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/reverse_kinematics.h (+32/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/three_dimensions.h (+32/-0)
shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/two_dimensions.h (+32/-0)
shadow_robot/dataglove/dataglove_processing/launch/usb_camera.launch (+11/-0)
shadow_robot/dataglove/dataglove_processing/mainpage.dox (+43/-0)
shadow_robot/dataglove/dataglove_processing/manifest.xml (+23/-0)
shadow_robot/dataglove/dataglove_processing/src/database_mapping.cpp (+62/-0)
shadow_robot/dataglove/dataglove_processing/src/message_publisher.cpp (+55/-0)
shadow_robot/dataglove/dataglove_processing/src/optical_dataglove.cpp (+60/-0)
shadow_robot/dataglove/dataglove_processing/src/optical_dataglove_node.cpp (+47/-0)
shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Start.py (+199/-0)
shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Stop.py (+199/-0)
shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/__init__.py (+2/-0)
shadow_robot/dataglove/dataglove_processing/src/reverse_kinematics.cpp (+62/-0)
shadow_robot/dataglove/dataglove_processing/src/three_dimensions.cpp (+31/-0)
shadow_robot/dataglove/dataglove_processing/src/two_dimensions.cpp (+31/-0)
shadow_robot/dataglove/dataglove_processing/srv/Start.srv (+2/-0)
shadow_robot/dataglove/dataglove_processing/srv/Stop.srv (+2/-0)
shadow_robot/dataglove/dataglove_processing/test/test_usb_cam.launch (+13/-0)
shadow_robot/dataglove/optical_acquisition/CMakeLists.txt (+30/-0)
shadow_robot/dataglove/optical_acquisition/Makefile (+1/-0)
shadow_robot/dataglove/optical_acquisition/camera_left.yaml (+19/-0)
shadow_robot/dataglove/optical_acquisition/camera_left_backup.yaml (+19/-0)
shadow_robot/dataglove/optical_acquisition/camera_right.yaml (+19/-0)
shadow_robot/dataglove/optical_acquisition/launch_left.launch (+11/-0)
shadow_robot/dataglove/optical_acquisition/launch_right.launch (+9/-0)
shadow_robot/dataglove/optical_acquisition/mainpage.dox (+26/-0)
shadow_robot/dataglove/optical_acquisition/manifest.xml (+18/-0)
shadow_robot/dataglove/optical_synchronizer/CMakeLists.txt (+32/-0)
shadow_robot/dataglove/optical_synchronizer/Makefile (+1/-0)
shadow_robot/dataglove/optical_synchronizer/PARAM_VALUES.txt (+13/-0)
shadow_robot/dataglove/optical_synchronizer/include/camera_synchronizer.h (+52/-0)
shadow_robot/dataglove/optical_synchronizer/mainpage.dox (+26/-0)
shadow_robot/dataglove/optical_synchronizer/manifest.xml (+15/-0)
shadow_robot/dataglove/optical_synchronizer/src/camera_synchronizer.cpp (+136/-0)
shadow_robot/dataglove/optical_synchronizer/src/camera_synchronizer_node.cpp (+32/-0)
shadow_robot/dataglove/optical_synchronizer/start_all.launch (+27/-0)
shadow_robot/dataglove/optical_synchronizer/startsync.launch (+16/-0)
shadow_robot/dataglove/stack.xml (+9/-0)
shadow_robot/doc/doxygen/sr_hand.config (+1551/-0)
shadow_robot/doc/generate_doc.sh (+33/-0)
shadow_robot/rosdep.yaml (+10/-0)
shadow_robot/sr_control_gui/CMakeLists.txt (+30/-0)
shadow_robot/sr_control_gui/Makefile (+1/-0)
shadow_robot/sr_control_gui/epydoc.config (+9/-0)
shadow_robot/sr_control_gui/mainpage.dox (+23/-0)
shadow_robot/sr_control_gui/manifest.xml (+24/-0)
shadow_robot/sr_control_gui/param/GloveToHandMappings (+22/-0)
shadow_robot/sr_control_gui/param/GloveToHandMappings_generic (+22/-0)
shadow_robot/sr_control_gui/param/cyberglove.cal (+91/-0)
shadow_robot/sr_control_gui/param/shadowhandtocybergrasp.cal (+31/-0)
shadow_robot/sr_control_gui/rosdoc.yaml (+2/-0)
shadow_robot/sr_control_gui/saved_scripts/example.xml (+30/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/config.py (+88/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/dock_widgets/generic_dock_widget.py (+31/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/dock_widgets/robot_and_libraries_backend.py (+201/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/dock_widgets/robot_and_libraries_dock_widget.py (+387/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/main_widget.py (+137/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/main_window.py (+128/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/arm_joint_sliders.yapsy-plugin (+9/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/arm_joint_sliders/__init__.py (+27/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/cyberglove_calibrator_plugin.yapsy-plugin (+9/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/cyberglove_calibrator_plugin/__init__.py (+342/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/cyberglove_generic_plugin.py (+42/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/generic_plugin.py (+58/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/grasp_controller.yapsy-plugin (+9/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/grasp_controller/__init__.py (+360/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/hand_joint_sliders.yapsy-plugin (+9/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/hand_joint_sliders/__init__.py (+44/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/joint_slider.py (+140/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/movement_recorder.yapsy-plugin (+9/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/movement_recorder/__init__.py (+511/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/plugins/shadow_generic_plugin.py (+32/-0)
shadow_robot/sr_control_gui/src/sr_control_gui/sr_control_gui (+14/-0)
shadow_robot/sr_convenient_dependencies/CMakeLists.txt (+30/-0)
shadow_robot/sr_convenient_dependencies/Makefile (+1/-0)
shadow_robot/sr_convenient_dependencies/mainpage.dox (+8/-0)
shadow_robot/sr_convenient_dependencies/manifest.xml (+21/-0)
shadow_robot/sr_display/.project (+110/-0)
shadow_robot/sr_display/CMakeLists.txt (+32/-0)
shadow_robot/sr_display/Makefile (+1/-0)
shadow_robot/sr_display/include/sr_display/display_check.h (+60/-0)
shadow_robot/sr_display/include/sr_display/motor_data.h (+153/-0)
shadow_robot/sr_display/include/sr_display/motor_info_publisher.h (+76/-0)
shadow_robot/sr_display/include/sr_display/xml_name_parser.h (+47/-0)
shadow_robot/sr_display/mainpage.dox (+65/-0)
shadow_robot/sr_display/manifest.xml (+21/-0)
shadow_robot/sr_display/sr_display.launch (+5/-0)
shadow_robot/sr_display/src/display_check.cpp (+88/-0)
shadow_robot/sr_display/src/display_check_client.cpp (+48/-0)
shadow_robot/sr_display/src/motor_data.cpp (+411/-0)
shadow_robot/sr_display/src/motor_info_publisher.cpp (+222/-0)
shadow_robot/sr_display/src/motor_info_publisher_node.cpp (+46/-0)
shadow_robot/sr_display/src/xml_name_parser.cpp (+82/-0)
shadow_robot/sr_display/srv/display_check.srv (+5/-0)
shadow_robot/sr_hand/CMakeLists.txt (+70/-0)
shadow_robot/sr_hand/Makefile (+1/-0)
shadow_robot/sr_hand/examples/link_joints.cpp (+127/-0)
shadow_robot/sr_hand/examples/link_joints.py (+49/-0)
shadow_robot/sr_hand/examples/shadowhand_publisher.py (+53/-0)
shadow_robot/sr_hand/examples/shadowhand_subscriber.py (+31/-0)
shadow_robot/sr_hand/include/sr_hand/hand/real_shadowhand.h (+60/-0)
shadow_robot/sr_hand/include/sr_hand/hand/sr_articulated_robot.h (+322/-0)
shadow_robot/sr_hand/include/sr_hand/hand/virtual_arm.h (+102/-0)
shadow_robot/sr_hand/include/sr_hand/hand/virtual_shadowhand.h (+114/-0)
shadow_robot/sr_hand/include/sr_hand/sr_diagnosticer.h (+87/-0)
shadow_robot/sr_hand/include/sr_hand/sr_publisher.h (+87/-0)
shadow_robot/sr_hand/include/sr_hand/sr_subscriber.h (+155/-0)
shadow_robot/sr_hand/include/sr_hand/sr_tactile_sensor_pub.h (+50/-0)
shadow_robot/sr_hand/launch/gazebo/empty.world (+160/-0)
shadow_robot/sr_hand/launch/gazebo/empty_world.launch (+7/-0)
shadow_robot/sr_hand/launch/gazebo/gazebo_arm_and_hand_motor.launch (+45/-0)
shadow_robot/sr_hand/launch/gazebo/gazebo_arm_and_hand_muscle.launch (+45/-0)
shadow_robot/sr_hand/launch/gazebo/gazebo_arm_motor.launch (+20/-0)
shadow_robot/sr_hand/launch/gazebo/gazebo_arm_muscle.launch (+20/-0)
shadow_robot/sr_hand/launch/gazebo/gazebo_hand_motor.launch (+40/-0)
shadow_robot/sr_hand/launch/gazebo/gazebo_hand_muscle.launch (+40/-0)
shadow_robot/sr_hand/launch/rviz_motor.launch (+6/-0)
shadow_robot/sr_hand/launch/rviz_muscle.launch (+5/-0)
shadow_robot/sr_hand/launch/sr_arm_motor.launch (+97/-0)
shadow_robot/sr_hand/launch/sr_arm_muscle.launch (+97/-0)
shadow_robot/sr_hand/launch/srh_motor.launch (+46/-0)
shadow_robot/sr_hand/launch/srh_muscle.launch (+46/-0)
shadow_robot/sr_hand/mainpage.dox (+249/-0)
shadow_robot/sr_hand/manifest.xml (+31/-0)
shadow_robot/sr_hand/model/arm_urdf/arm_controller.yaml (+36/-0)
shadow_robot/sr_hand/model/arm_urdf/base/shadowarm_base.urdf.xacro (+42/-0)
shadow_robot/sr_hand/model/arm_urdf/full_arm_motor.urdf.xacro (+32/-0)
shadow_robot/sr_hand/model/arm_urdf/full_arm_muscle.urdf.xacro (+32/-0)
shadow_robot/sr_hand/model/arm_urdf/hand_support/shadowarm_handsupport_motor.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/arm_urdf/hand_support/shadowarm_handsupport_motor.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/arm_urdf/hand_support/shadowarm_handsupport_muscle.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/arm_urdf/hand_support/shadowarm_handsupport_muscle.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/arm_urdf/lower_arm/shadowarm_lowerarm.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/arm_urdf/lower_arm/shadowarm_lowerarm.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/arm_urdf/trunk/shadowarm_trunk.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/arm_urdf/trunk/shadowarm_trunk.urdf.xacro (+47/-0)
shadow_robot/sr_hand/model/arm_urdf/upper_arm/shadowarm_upperarm.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/arm_urdf/upper_arm/shadowarm_upperarm.urdf.xacro (+45/-0)
shadow_robot/sr_hand/model/gazebo/gazebo.urdf.xacro (+13/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/classic_finger.urdf.xacro (+26/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/distal/distal.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/distal/distal.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/knuckle/knuckle.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/knuckle/knuckle.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/lfmetacarpal/lfmetacarpal.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/lfmetacarpal/lfmetacarpal.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/little_finger.urdf.xacro (+68/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/middle/middle.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/middle/middle.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/proximal/proximal.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/finger/proximal/proximal.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/hand_urdf/forearm/forearm_motor.urdf.xacro (+34/-0)
shadow_robot/sr_hand/model/hand_urdf/forearm/forearm_muscle.urdf.xacro (+35/-0)
shadow_robot/sr_hand/model/hand_urdf/full_hand_motor.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/full_hand_muscle.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/hand_controller.yaml (+215/-0)
shadow_robot/sr_hand/model/hand_urdf/palm/palm.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/palm/palm.urdf.xacro (+46/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thbase.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thbase.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thdistal.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thdistal.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thhub.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thhub.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thmiddle.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thmiddle.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thproximal.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thproximal.urdf.xacro (+48/-0)
shadow_robot/sr_hand/model/hand_urdf/thumb/thumb.urdf.xacro (+28/-0)
shadow_robot/sr_hand/model/hand_urdf/wrist/wrist.transmission.xacro (+19/-0)
shadow_robot/sr_hand/model/hand_urdf/wrist/wrist.urdf.xacro (+49/-0)
shadow_robot/sr_hand/model/materials.urdf.xacro (+28/-0)
shadow_robot/sr_hand/model/robots/arm_and_hand_motor.urdf (+1180/-0)
shadow_robot/sr_hand/model/robots/arm_and_hand_muscle.urdf (+1180/-0)
shadow_robot/sr_hand/model/robots/shadowhand_motor.urdf (+986/-0)
shadow_robot/sr_hand/model/robots/shadowhand_muscle.urdf (+986/-0)
shadow_robot/sr_hand/model/robots/sr_arm_motor.urdf (+217/-0)
shadow_robot/sr_hand/model/robots/sr_arm_muscle.urdf (+217/-0)
shadow_robot/sr_hand/model/robots/xacro/arm_and_hand_motor.urdf.xacro (+24/-0)
shadow_robot/sr_hand/model/robots/xacro/arm_and_hand_muscle.urdf.xacro (+24/-0)
shadow_robot/sr_hand/model/robots/xacro/shadowhand_motor.urdf.xacro (+15/-0)
shadow_robot/sr_hand/model/robots/xacro/shadowhand_muscle.urdf.xacro (+15/-0)
shadow_robot/sr_hand/model/robots/xacro/sr_arm_motor.urdf.xacro (+14/-0)
shadow_robot/sr_hand/model/robots/xacro/sr_arm_muscle.urdf.xacro (+14/-0)
shadow_robot/sr_hand/model/sr_arm_motor.urdf (+134/-0)
shadow_robot/sr_hand/msg/cartesian_data.msg (+2/-0)
shadow_robot/sr_hand/msg/cartesian_position.msg (+8/-0)
shadow_robot/sr_hand/msg/command.msg (+6/-0)
shadow_robot/sr_hand/msg/config.msg (+5/-0)
shadow_robot/sr_hand/msg/contrlr.msg (+40/-0)
shadow_robot/sr_hand/msg/joint.msg (+7/-0)
shadow_robot/sr_hand/msg/joints_data.msg (+2/-0)
shadow_robot/sr_hand/msg/reverseKinematics.msg (+2/-0)
shadow_robot/sr_hand/msg/sendupdate.msg (+3/-0)
shadow_robot/sr_hand/python_lib/grasp/Grasp.py (+17/-0)
shadow_robot/sr_hand/python_lib/grasp/grasps.xml (+188/-0)
shadow_robot/sr_hand/python_lib/grasp/grasps_interpoler.py (+48/-0)
shadow_robot/sr_hand/python_lib/grasp/grasps_parser.py (+87/-0)
shadow_robot/sr_hand/python_lib/shadowhand_ros.py (+320/-0)
shadow_robot/sr_hand/shadowhand_analyzer.yaml (+14/-0)
shadow_robot/sr_hand/src/hand/real_shadowhand.cpp (+379/-0)
shadow_robot/sr_hand/src/hand/real_shadowhand_node.cpp (+115/-0)
shadow_robot/sr_hand/src/hand/sr_articulated_robot.cpp (+16/-0)
shadow_robot/sr_hand/src/hand/virtual_arm.cpp (+257/-0)
shadow_robot/sr_hand/src/hand/virtual_arm_node.cpp (+111/-0)
shadow_robot/sr_hand/src/hand/virtual_shadowhand.cpp (+605/-0)
shadow_robot/sr_hand/src/hand/virtual_shadowhand_node.cpp (+117/-0)
shadow_robot/sr_hand/src/sr_diagnosticer.cpp (+582/-0)
shadow_robot/sr_hand/src/sr_publisher.cpp (+126/-0)
shadow_robot/sr_hand/src/sr_subscriber.cpp (+212/-0)
shadow_robot/sr_hand/src/sr_tactile_sensor_pub.cpp (+109/-0)
shadow_robot/sr_hand/src/sr_tactile_sensor_pub_node.cpp (+45/-0)
shadow_robot/sr_remappers/CMakeLists.txt (+26/-0)
shadow_robot/sr_remappers/Makefile (+1/-0)
shadow_robot/sr_remappers/include/sr_remappers/calibration_parser.h (+77/-0)
shadow_robot/sr_remappers/include/sr_remappers/shadowhand_to_cyberglove_remapper.h (+75/-0)
shadow_robot/sr_remappers/include/sr_remappers/shadowhand_to_cybergrasp_remapper.h (+68/-0)
shadow_robot/sr_remappers/mainpage.dox (+42/-0)
shadow_robot/sr_remappers/manifest.xml (+25/-0)
shadow_robot/sr_remappers/param/cyb.py (+34/-0)
shadow_robot/sr_remappers/param/cyberglovetoshadowhand.map (+21/-0)
shadow_robot/sr_remappers/param/cyberglovetoshadowhand_transposed.map (+22/-0)
shadow_robot/sr_remappers/param/shadowhandtocybergrasp.cal (+31/-0)
shadow_robot/sr_remappers/param/test.cal (+6/-0)
shadow_robot/sr_remappers/param/tmp.py (+35/-0)
shadow_robot/sr_remappers/remapper_glove.launch (+12/-0)
shadow_robot/sr_remappers/src/calibration_parser.cpp (+117/-0)
shadow_robot/sr_remappers/src/shadowhand_to_cyberglove_remapper.cpp (+104/-0)
shadow_robot/sr_remappers/src/shadowhand_to_cyberglove_remapper_node.cpp (+31/-0)
shadow_robot/sr_remappers/src/shadowhand_to_cybergrasp_remapper.cpp (+127/-0)
shadow_robot/sr_remappers/src/shadowhand_to_cybergrasp_remapper_node.cpp (+31/-0)
shadow_robot/stack.xml (+14/-0)
shadow_robot/threeD_mouse/CMakeLists.txt (+28/-0)
shadow_robot/threeD_mouse/Makefile (+1/-0)
shadow_robot/threeD_mouse/include/threeD_mouse/3D_mouse.h (+72/-0)
shadow_robot/threeD_mouse/include/threeD_mouse/geometry.h (+73/-0)
shadow_robot/threeD_mouse/mainpage.dox (+26/-0)
shadow_robot/threeD_mouse/manifest.xml (+18/-0)
shadow_robot/threeD_mouse/src/3D_mouse.cpp (+201/-0)
shadow_robot/threeD_mouse/src/3D_mouse_node.cpp (+31/-0)
shadow_robot/threeD_mouse/src/geometry.cpp (+118/-0)
shadow_robot/threeD_mouse/threedmouse.launch (+6/-0)
Conflict adding file shadow_robot.  Moved existing file to shadow_robot.moved.
To merge this branch: bzr merge lp:sr-ros-interface

Description of the change

New modular GUI
+ bug fixes

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file '.bzrignore'
2--- .bzrignore 1970-01-01 00:00:00 +0000
3+++ .bzrignore 2010-11-03 16:17:45 +0000
4@@ -0,0 +1,96 @@
5+shadow_robot/sr_hand/build
6+shadow_robot/doc/doxygen/sr_hand
7+shadow_robot/doc/doxygen/sr_hand.pdf
8+shadow_robot/doc/rosdoc/*
9+shadow_robot/sr_hand/msg_gen
10+shadow_robot/sr_hand/bin
11+shadow_robot/sr_hand/msg/lisp
12+shadow_robot/sr_hand/src/sr_hand/msg
13+shadow_robot/sr_hand/bin/*
14+shadow_robot/sr_hand/bin/examples/*
15+shadow_robot/cyberglove/build
16+shadow_robot/cyberglove/srv_gen
17+shadow_robot/cyberglove/bin/cyberglove
18+shadow_robot/cyberglove/srv/lisp
19+shadow_robot/sr_control_gui/bin
20+shadow_robot/sr_control_gui/build
21+shadow_robot/cyberglove/src/cyberglove
22+shadow_robot/sr_control_gui/param/new_calibration.cal
23+shadow_robot/sr_remappers/bin
24+shadow_robot/sr_remappers_bk
25+shadow_robot/sr_control_gui/param/new_calibration_2.cal
26+shadow_robot/sr_remappers/build
27+shadow_robot/threeD_mouse/bin
28+shadow_robot/threeD_mouse/build
29+shadow_robot/optical_acquisition/bin
30+shadow_robot/optical_acquisition/build
31+shadow_robot/optical_synchronizer/bin
32+shadow_robot/optical_synchronizer/build
33+<<<<<<< TREE
34+shadow_robot/sr_remappers/bin/cyberglove_remapper
35+=======
36+shadow_robot/dataglove/dataglove_processing/.bzr
37+shadow_robot/dataglove/dataglove_processing/bin
38+shadow_robot/dataglove/dataglove_processing/buildshadow_robot/dataglove/dataglove_processing/srv_gen
39+shadow_robot/dataglove/dataglove_processing/srv/lisp
40+shadow_robot/dataglove/optical_acquisition/bin
41+shadow_robot/dataglove/optical_acquisition/build
42+shadow_robot/dataglove/optical_synchronizer/bin
43+shadow_robot/dataglove/optical_synchronizer/build
44+shadow_robot/dataglove/dataglove_processing/build
45+shadow_robot/dataglove/dataglove_processing/srv_gen
46+>>>>>>> MERGE-SOURCE
47+shadow_robot/cyberglove/srv/java
48+shadow_robot/cyberglove/srv/oct
49+shadow_robot/sr_hand/msg/java
50+shadow_robot/sr_hand/msg/oct
51+shadow_robot/sr_hand/launch/test_cam.launch
52+shadow_robot/sr_display/srv_gen
53+shadow_robot/sr_display/bin/*
54+shadow_robot/sr_display/build/*
55+shadow_robot/sr_display/src/sr_display
56+shadow_robot/sr_display/srv/lisp
57+shadow_robot/sr_hand/.cproject
58+shadow_robot/sr_hand/.project
59+shadow_robot/sr_hand/cmake_install.cmake
60+shadow_robot/sr_hand/src/euslisp
61+shadow_robot/sr_hand/.pydevproject
62+shadow_robot/cyberglove/src/euslisp
63+shadow_robot/sr_control_gui/.cproject
64+shadow_robot/sr_control_gui/.project
65+shadow_robot/sr_control_gui/cmake_install.cmake
66+shadow_robot/sr_control_gui/src/euslisp
67+shadow_robot/sr_display/.cproject
68+shadow_robot/sr_display/cmake_install.cmake
69+
70+shadow_robot/sr_display/src/euslisp
71+
72+shadow_robot/sr_display/srv/java
73+
74+shadow_robot/sr_display/srv/oct
75+
76+shadow_robot/sr_remappers/.cproject
77+
78+shadow_robot/sr_remappers/.project
79+
80+shadow_robot/sr_remappers/cmake_install.cmake
81+
82+shadow_robot/sr_remappers/src/euslisp
83+
84+shadow_robot/threeD_mouse/.cproject
85+
86+shadow_robot/threeD_mouse/.project
87+
88+shadow_robot/threeD_mouse/cmake_install.cmake
89+
90+shadow_robot/threeD_mouse/src/euslisp
91+shadow_robot/sr_control_gui/.pydevproject
92+shadow_robot/sr_control_gui/param/GloveToHandMappings.bk
93+shadow_robot/sr_hand/.settings
94+shadow_robot/sr_hand/python_lib/test.py
95+shadow_robot/cyberglove/.pydevproject
96+shadow_robot/sr_control_gui/src/sr_control_gui/images/glove_calibration/tmp
97+shadow_robot/sr_control_gui/images/glove_calibration/tmp
98+shadow_robot/sr_convenient_dependencies/bin
99+shadow_robot/sr_convenient_dependencies/build
100+shadow_robot/sr_convenient_dependencies/src
101
102=== added directory 'shadow_robot'
103=== renamed directory 'shadow_robot' => 'shadow_robot.moved'
104=== added file 'shadow_robot/README.txt'
105--- shadow_robot/README.txt 1970-01-01 00:00:00 +0000
106+++ shadow_robot/README.txt 2010-11-03 16:17:45 +0000
107@@ -0,0 +1,17 @@
108+
109+First of all, don't forget to edit your ROS_PACKAGE_PATH variable. To do this,
110+edit your ~/.bashrc and AFTER the source /path/to/ros/setup.sh add:
111+
112+export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/path/to/shadow_robot
113+
114+where /path/to/shadow_robot is the complete path to the shadow_robot directory you
115+got from the bazaar repository.
116+
117+To start using this ROS interface, the best way to go is to generate the doc:
118+
119+$ cd doc
120+$ ./generate_doc.sh
121+
122+Then fire up your favourite browser and open the generated rosdoc/index.html.
123+You can start by reading the sr_hand documentation.
124+
125
126=== added directory 'shadow_robot/cyberglove'
127=== added file 'shadow_robot/cyberglove/.cproject'
128--- shadow_robot/cyberglove/.cproject 1970-01-01 00:00:00 +0000
129+++ shadow_robot/cyberglove/.cproject 2010-11-03 16:17:45 +0000
130@@ -0,0 +1,575 @@
131+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
132+<?fileVersion 4.0.0?>
133+
134+<cproject>
135+ <storageModule moduleId="org.eclipse.cdt.core.settings">
136+ <cconfiguration id="org.eclipse.cdt.core.default.config.1">
137+ <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1" moduleId="org.eclipse.cdt.core.settings" name="Configuration">
138+ <externalSettings/>
139+ <extensions>
140+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
141+ <extension id="org.eclipse.cdt.core.GNU_ELF" point="org.eclipse.cdt.core.BinaryParser"/>
142+ </extensions>
143+ </storageModule>
144+ <storageModule moduleId="org.eclipse.cdt.core.language.mapping">
145+ <project-mappings/>
146+ </storageModule>
147+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
148+ <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
149+ <buildTargets>
150+ <target name=": ROSBUILD_genmanifest_eus" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
151+ <buildCommand>/usr/bin/make</buildCommand>
152+ <buildArguments/>
153+ <buildTarget>ROSBUILD_genmanifest_eus</buildTarget>
154+ <stopOnError>true</stopOnError>
155+ <useDefaultCommand>false</useDefaultCommand>
156+ </target>
157+ <target name=": ROSBUILD_genmsg_cpp" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
158+ <buildCommand>/usr/bin/make</buildCommand>
159+ <buildArguments/>
160+ <buildTarget>ROSBUILD_genmsg_cpp</buildTarget>
161+ <stopOnError>true</stopOnError>
162+ <useDefaultCommand>false</useDefaultCommand>
163+ </target>
164+ <target name=": ROSBUILD_genmsg_eus" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
165+ <buildCommand>/usr/bin/make</buildCommand>
166+ <buildArguments/>
167+ <buildTarget>ROSBUILD_genmsg_eus</buildTarget>
168+ <stopOnError>true</stopOnError>
169+ <useDefaultCommand>false</useDefaultCommand>
170+ </target>
171+ <target name=": ROSBUILD_genmsg_java" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
172+ <buildCommand>/usr/bin/make</buildCommand>
173+ <buildArguments/>
174+ <buildTarget>ROSBUILD_genmsg_java</buildTarget>
175+ <stopOnError>true</stopOnError>
176+ <useDefaultCommand>false</useDefaultCommand>
177+ </target>
178+ <target name=": ROSBUILD_genmsg_lisp" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
179+ <buildCommand>/usr/bin/make</buildCommand>
180+ <buildArguments/>
181+ <buildTarget>ROSBUILD_genmsg_lisp</buildTarget>
182+ <stopOnError>true</stopOnError>
183+ <useDefaultCommand>false</useDefaultCommand>
184+ </target>
185+ <target name=": ROSBUILD_genmsg_oct" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
186+ <buildCommand>/usr/bin/make</buildCommand>
187+ <buildArguments/>
188+ <buildTarget>ROSBUILD_genmsg_oct</buildTarget>
189+ <stopOnError>true</stopOnError>
190+ <useDefaultCommand>false</useDefaultCommand>
191+ </target>
192+ <target name=": ROSBUILD_gensrv_cpp" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
193+ <buildCommand>/usr/bin/make</buildCommand>
194+ <buildArguments/>
195+ <buildTarget>ROSBUILD_gensrv_cpp</buildTarget>
196+ <stopOnError>true</stopOnError>
197+ <useDefaultCommand>false</useDefaultCommand>
198+ </target>
199+ <target name=": ROSBUILD_gensrv_eus" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
200+ <buildCommand>/usr/bin/make</buildCommand>
201+ <buildArguments/>
202+ <buildTarget>ROSBUILD_gensrv_eus</buildTarget>
203+ <stopOnError>true</stopOnError>
204+ <useDefaultCommand>false</useDefaultCommand>
205+ </target>
206+ <target name=": ROSBUILD_gensrv_java" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
207+ <buildCommand>/usr/bin/make</buildCommand>
208+ <buildArguments/>
209+ <buildTarget>ROSBUILD_gensrv_java</buildTarget>
210+ <stopOnError>true</stopOnError>
211+ <useDefaultCommand>false</useDefaultCommand>
212+ </target>
213+ <target name=": ROSBUILD_gensrv_lisp" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
214+ <buildCommand>/usr/bin/make</buildCommand>
215+ <buildArguments/>
216+ <buildTarget>ROSBUILD_gensrv_lisp</buildTarget>
217+ <stopOnError>true</stopOnError>
218+ <useDefaultCommand>false</useDefaultCommand>
219+ </target>
220+ <target name=": ROSBUILD_gensrv_oct" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
221+ <buildCommand>/usr/bin/make</buildCommand>
222+ <buildArguments/>
223+ <buildTarget>ROSBUILD_gensrv_oct</buildTarget>
224+ <stopOnError>true</stopOnError>
225+ <useDefaultCommand>false</useDefaultCommand>
226+ </target>
227+ <target name=": ROSBUILD_gensrv_py" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
228+ <buildCommand>/usr/bin/make</buildCommand>
229+ <buildArguments/>
230+ <buildTarget>ROSBUILD_gensrv_py</buildTarget>
231+ <stopOnError>true</stopOnError>
232+ <useDefaultCommand>false</useDefaultCommand>
233+ </target>
234+ <target name=": clean-test-results" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
235+ <buildCommand>/usr/bin/make</buildCommand>
236+ <buildArguments/>
237+ <buildTarget>clean-test-results</buildTarget>
238+ <stopOnError>true</stopOnError>
239+ <useDefaultCommand>false</useDefaultCommand>
240+ </target>
241+ <target name="[exe] cyberglove" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
242+ <buildCommand>/usr/bin/make</buildCommand>
243+ <buildArguments/>
244+ <buildTarget>cyberglove</buildTarget>
245+ <stopOnError>true</stopOnError>
246+ <useDefaultCommand>false</useDefaultCommand>
247+ </target>
248+ <target name="[exe] cyberglove/fast" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
249+ <buildCommand>/usr/bin/make</buildCommand>
250+ <buildArguments/>
251+ <buildTarget>cyberglove/fast</buildTarget>
252+ <stopOnError>true</stopOnError>
253+ <useDefaultCommand>false</useDefaultCommand>
254+ </target>
255+ <target name=": rebuild_cache" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
256+ <buildCommand>/usr/bin/make</buildCommand>
257+ <buildArguments/>
258+ <buildTarget>rebuild_cache</buildTarget>
259+ <stopOnError>true</stopOnError>
260+ <useDefaultCommand>false</useDefaultCommand>
261+ </target>
262+ <target name=": rosbuild_precompile" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
263+ <buildCommand>/usr/bin/make</buildCommand>
264+ <buildArguments/>
265+ <buildTarget>rosbuild_precompile</buildTarget>
266+ <stopOnError>true</stopOnError>
267+ <useDefaultCommand>false</useDefaultCommand>
268+ </target>
269+ <target name=": rosbuild_premsgsrvgen" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
270+ <buildCommand>/usr/bin/make</buildCommand>
271+ <buildArguments/>
272+ <buildTarget>rosbuild_premsgsrvgen</buildTarget>
273+ <stopOnError>true</stopOnError>
274+ <useDefaultCommand>false</useDefaultCommand>
275+ </target>
276+ <target name=": rospack_genmsg" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
277+ <buildCommand>/usr/bin/make</buildCommand>
278+ <buildArguments/>
279+ <buildTarget>rospack_genmsg</buildTarget>
280+ <stopOnError>true</stopOnError>
281+ <useDefaultCommand>false</useDefaultCommand>
282+ </target>
283+ <target name=": rospack_genmsg_libexe" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
284+ <buildCommand>/usr/bin/make</buildCommand>
285+ <buildArguments/>
286+ <buildTarget>rospack_genmsg_libexe</buildTarget>
287+ <stopOnError>true</stopOnError>
288+ <useDefaultCommand>false</useDefaultCommand>
289+ </target>
290+ <target name=": rospack_gensrv" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
291+ <buildCommand>/usr/bin/make</buildCommand>
292+ <buildArguments/>
293+ <buildTarget>rospack_gensrv</buildTarget>
294+ <stopOnError>true</stopOnError>
295+ <useDefaultCommand>false</useDefaultCommand>
296+ </target>
297+ <target name=": rospack_gensrv_all" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
298+ <buildCommand>/usr/bin/make</buildCommand>
299+ <buildArguments/>
300+ <buildTarget>rospack_gensrv_all</buildTarget>
301+ <stopOnError>true</stopOnError>
302+ <useDefaultCommand>false</useDefaultCommand>
303+ </target>
304+ <target name=": test" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
305+ <buildCommand>/usr/bin/make</buildCommand>
306+ <buildArguments/>
307+ <buildTarget>test</buildTarget>
308+ <stopOnError>true</stopOnError>
309+ <useDefaultCommand>false</useDefaultCommand>
310+ </target>
311+ <target name=": test-future" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
312+ <buildCommand>/usr/bin/make</buildCommand>
313+ <buildArguments/>
314+ <buildTarget>test-future</buildTarget>
315+ <stopOnError>true</stopOnError>
316+ <useDefaultCommand>false</useDefaultCommand>
317+ </target>
318+ <target name=": test-results" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
319+ <buildCommand>/usr/bin/make</buildCommand>
320+ <buildArguments/>
321+ <buildTarget>test-results</buildTarget>
322+ <stopOnError>true</stopOnError>
323+ <useDefaultCommand>false</useDefaultCommand>
324+ </target>
325+ <target name=": test-results-run" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
326+ <buildCommand>/usr/bin/make</buildCommand>
327+ <buildArguments/>
328+ <buildTarget>test-results-run</buildTarget>
329+ <stopOnError>true</stopOnError>
330+ <useDefaultCommand>false</useDefaultCommand>
331+ </target>
332+ <target name="[exe] test/test_calibration" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
333+ <buildCommand>/usr/bin/make</buildCommand>
334+ <buildArguments/>
335+ <buildTarget>test/test_calibration</buildTarget>
336+ <stopOnError>true</stopOnError>
337+ <useDefaultCommand>false</useDefaultCommand>
338+ </target>
339+ <target name="[exe] test/test_calibration/fast" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
340+ <buildCommand>/usr/bin/make</buildCommand>
341+ <buildArguments/>
342+ <buildTarget>test/test_calibration/fast</buildTarget>
343+ <stopOnError>true</stopOnError>
344+ <useDefaultCommand>false</useDefaultCommand>
345+ </target>
346+ <target name=": test_test_calibration_result" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
347+ <buildCommand>/usr/bin/make</buildCommand>
348+ <buildArguments/>
349+ <buildTarget>test_test_calibration_result</buildTarget>
350+ <stopOnError>true</stopOnError>
351+ <useDefaultCommand>false</useDefaultCommand>
352+ </target>
353+ <target name=": test_test_test_calibration" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
354+ <buildCommand>/usr/bin/make</buildCommand>
355+ <buildArguments/>
356+ <buildTarget>test_test_test_calibration</buildTarget>
357+ <stopOnError>true</stopOnError>
358+ <useDefaultCommand>false</useDefaultCommand>
359+ </target>
360+ <target name=": tests" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
361+ <buildCommand>/usr/bin/make</buildCommand>
362+ <buildArguments/>
363+ <buildTarget>tests</buildTarget>
364+ <stopOnError>true</stopOnError>
365+ <useDefaultCommand>false</useDefaultCommand>
366+ </target>
367+ <target name=": all" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
368+ <buildCommand>/usr/bin/make</buildCommand>
369+ <buildArguments/>
370+ <buildTarget>all</buildTarget>
371+ <stopOnError>true</stopOnError>
372+ <useDefaultCommand>false</useDefaultCommand>
373+ </target>
374+ <target name=": clean" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
375+ <buildCommand>/usr/bin/make</buildCommand>
376+ <buildArguments/>
377+ <buildTarget>clean</buildTarget>
378+ <stopOnError>true</stopOnError>
379+ <useDefaultCommand>false</useDefaultCommand>
380+ </target>
381+ <target name="[obj] src/cyberglove_node.o" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
382+ <buildCommand>/usr/bin/make</buildCommand>
383+ <buildArguments/>
384+ <buildTarget>src/cyberglove_node.o</buildTarget>
385+ <stopOnError>true</stopOnError>
386+ <useDefaultCommand>false</useDefaultCommand>
387+ </target>
388+ <target name="[pre] src/cyberglove_node.i" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
389+ <buildCommand>/usr/bin/make</buildCommand>
390+ <buildArguments/>
391+ <buildTarget>src/cyberglove_node.i</buildTarget>
392+ <stopOnError>true</stopOnError>
393+ <useDefaultCommand>false</useDefaultCommand>
394+ </target>
395+ <target name="[to asm] src/cyberglove_node.s" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
396+ <buildCommand>/usr/bin/make</buildCommand>
397+ <buildArguments/>
398+ <buildTarget>src/cyberglove_node.s</buildTarget>
399+ <stopOnError>true</stopOnError>
400+ <useDefaultCommand>false</useDefaultCommand>
401+ </target>
402+ <target name="[obj] src/cyberglove_publisher.o" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
403+ <buildCommand>/usr/bin/make</buildCommand>
404+ <buildArguments/>
405+ <buildTarget>src/cyberglove_publisher.o</buildTarget>
406+ <stopOnError>true</stopOnError>
407+ <useDefaultCommand>false</useDefaultCommand>
408+ </target>
409+ <target name="[pre] src/cyberglove_publisher.i" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
410+ <buildCommand>/usr/bin/make</buildCommand>
411+ <buildArguments/>
412+ <buildTarget>src/cyberglove_publisher.i</buildTarget>
413+ <stopOnError>true</stopOnError>
414+ <useDefaultCommand>false</useDefaultCommand>
415+ </target>
416+ <target name="[to asm] src/cyberglove_publisher.s" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
417+ <buildCommand>/usr/bin/make</buildCommand>
418+ <buildArguments/>
419+ <buildTarget>src/cyberglove_publisher.s</buildTarget>
420+ <stopOnError>true</stopOnError>
421+ <useDefaultCommand>false</useDefaultCommand>
422+ </target>
423+ <target name="[obj] src/cyberglove_service.o" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
424+ <buildCommand>/usr/bin/make</buildCommand>
425+ <buildArguments/>
426+ <buildTarget>src/cyberglove_service.o</buildTarget>
427+ <stopOnError>true</stopOnError>
428+ <useDefaultCommand>false</useDefaultCommand>
429+ </target>
430+ <target name="[pre] src/cyberglove_service.i" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
431+ <buildCommand>/usr/bin/make</buildCommand>
432+ <buildArguments/>
433+ <buildTarget>src/cyberglove_service.i</buildTarget>
434+ <stopOnError>true</stopOnError>
435+ <useDefaultCommand>false</useDefaultCommand>
436+ </target>
437+ <target name="[to asm] src/cyberglove_service.s" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
438+ <buildCommand>/usr/bin/make</buildCommand>
439+ <buildArguments/>
440+ <buildTarget>src/cyberglove_service.s</buildTarget>
441+ <stopOnError>true</stopOnError>
442+ <useDefaultCommand>false</useDefaultCommand>
443+ </target>
444+ <target name="[obj] src/serial_glove.o" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
445+ <buildCommand>/usr/bin/make</buildCommand>
446+ <buildArguments/>
447+ <buildTarget>src/serial_glove.o</buildTarget>
448+ <stopOnError>true</stopOnError>
449+ <useDefaultCommand>false</useDefaultCommand>
450+ </target>
451+ <target name="[pre] src/serial_glove.i" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
452+ <buildCommand>/usr/bin/make</buildCommand>
453+ <buildArguments/>
454+ <buildTarget>src/serial_glove.i</buildTarget>
455+ <stopOnError>true</stopOnError>
456+ <useDefaultCommand>false</useDefaultCommand>
457+ </target>
458+ <target name="[to asm] src/serial_glove.s" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
459+ <buildCommand>/usr/bin/make</buildCommand>
460+ <buildArguments/>
461+ <buildTarget>src/serial_glove.s</buildTarget>
462+ <stopOnError>true</stopOnError>
463+ <useDefaultCommand>false</useDefaultCommand>
464+ </target>
465+ <target name="[obj] src/xml_calibration_parser.o" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
466+ <buildCommand>/usr/bin/make</buildCommand>
467+ <buildArguments/>
468+ <buildTarget>src/xml_calibration_parser.o</buildTarget>
469+ <stopOnError>true</stopOnError>
470+ <useDefaultCommand>false</useDefaultCommand>
471+ </target>
472+ <target name="[pre] src/xml_calibration_parser.i" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
473+ <buildCommand>/usr/bin/make</buildCommand>
474+ <buildArguments/>
475+ <buildTarget>src/xml_calibration_parser.i</buildTarget>
476+ <stopOnError>true</stopOnError>
477+ <useDefaultCommand>false</useDefaultCommand>
478+ </target>
479+ <target name="[to asm] src/xml_calibration_parser.s" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
480+ <buildCommand>/usr/bin/make</buildCommand>
481+ <buildArguments/>
482+ <buildTarget>src/xml_calibration_parser.s</buildTarget>
483+ <stopOnError>true</stopOnError>
484+ <useDefaultCommand>false</useDefaultCommand>
485+ </target>
486+ <target name="[obj] test/test_calibration.o" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
487+ <buildCommand>/usr/bin/make</buildCommand>
488+ <buildArguments/>
489+ <buildTarget>test/test_calibration.o</buildTarget>
490+ <stopOnError>true</stopOnError>
491+ <useDefaultCommand>false</useDefaultCommand>
492+ </target>
493+ <target name="[pre] test/test_calibration.i" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
494+ <buildCommand>/usr/bin/make</buildCommand>
495+ <buildArguments/>
496+ <buildTarget>test/test_calibration.i</buildTarget>
497+ <stopOnError>true</stopOnError>
498+ <useDefaultCommand>false</useDefaultCommand>
499+ </target>
500+ <target name="[to asm] test/test_calibration.s" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder">
501+ <buildCommand>/usr/bin/make</buildCommand>
502+ <buildArguments/>
503+ <buildTarget>test/test_calibration.s</buildTarget>
504+ <stopOnError>true</stopOnError>
505+ <useDefaultCommand>false</useDefaultCommand>
506+ </target>
507+ </buildTargets>
508+ </storageModule>
509+ <storageModule moduleId="scannerConfiguration">
510+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
511+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
512+ <buildOutputProvider>
513+ <openAction enabled="true" filePath=""/>
514+ <parser enabled="true"/>
515+ </buildOutputProvider>
516+ <scannerInfoProvider id="specsFile">
517+ <runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="/usr/bin/gcc" useDefault="true"/>
518+ <parser enabled="true"/>
519+ </scannerInfoProvider>
520+ </profile>
521+ <profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
522+ <buildOutputProvider>
523+ <openAction enabled="true" filePath=""/>
524+ <parser enabled="true"/>
525+ </buildOutputProvider>
526+ <scannerInfoProvider id="makefileGenerator">
527+ <runAction arguments="-f ${project_name}_scd.mk" command="/usr/bin/make" useDefault="true"/>
528+ <parser enabled="true"/>
529+ </scannerInfoProvider>
530+ </profile>
531+ </storageModule>
532+ <storageModule moduleId="org.eclipse.cdt.core.pathentry">
533+ <pathentry kind="mac" name="__STDC__" path="" value="1"/>
534+ <pathentry kind="mac" name="__STDC_HOSTED__" path="" value="1"/>
535+ <pathentry kind="mac" name="__GNUC__" path="" value="4"/>
536+ <pathentry kind="mac" name="__GNUC_MINOR__" path="" value="4"/>
537+ <pathentry kind="mac" name="__GNUC_PATCHLEVEL__" path="" value="3"/>
538+ <pathentry kind="mac" name="__SIZE_TYPE__" path="" value="unsigned"/>
539+ <pathentry kind="mac" name="int" path="" value="__PTRDIFF_TYPE__"/>
540+ <pathentry kind="mac" name="unsigned" path="" value="int"/>
541+ <pathentry kind="mac" name="__INTMAX_TYPE__" path="" value="long"/>
542+ <pathentry kind="mac" name="long" path="" value="int"/>
543+ <pathentry kind="mac" name="__UINTMAX_TYPE__" path="" value="long"/>
544+ <pathentry kind="mac" name="short" path="" value="unsigned"/>
545+ <pathentry kind="mac" name="__GXX_ABI_VERSION" path="" value="1002"/>
546+ <pathentry kind="mac" name="__SCHAR_MAX__" path="" value="127"/>
547+ <pathentry kind="mac" name="__SHRT_MAX__" path="" value="32767"/>
548+ <pathentry kind="mac" name="__INT_MAX__" path="" value="2147483647"/>
549+ <pathentry kind="mac" name="__LONG_MAX__" path="" value="2147483647L"/>
550+ <pathentry kind="mac" name="__LONG_LONG_MAX__" path="" value="9223372036854775807LL"/>
551+ <pathentry kind="mac" name="__WCHAR_MAX__" path="" value="2147483647"/>
552+ <pathentry kind="mac" name="__CHAR_BIT__" path="" value="8"/>
553+ <pathentry kind="mac" name="__INTMAX_MAX__" path="" value="9223372036854775807LL"/>
554+ <pathentry kind="mac" name="__FLT_EVAL_METHOD__" path="" value="2"/>
555+ <pathentry kind="mac" name="__DEC_EVAL_METHOD__" path="" value="2"/>
556+ <pathentry kind="mac" name="__FLT_RADIX__" path="" value="2"/>
557+ <pathentry kind="mac" name="__FLT_MANT_DIG__" path="" value="24"/>
558+ <pathentry kind="mac" name="__FLT_DIG__" path="" value="6"/>
559+ <pathentry kind="mac" name="__FLT_MIN_EXP__" path="" value="(-125)"/>
560+ <pathentry kind="mac" name="__FLT_MIN_10_EXP__" path="" value="(-37)"/>
561+ <pathentry kind="mac" name="__FLT_MAX_EXP__" path="" value="128"/>
562+ <pathentry kind="mac" name="__FLT_MAX_10_EXP__" path="" value="38"/>
563+ <pathentry kind="mac" name="__FLT_MAX__" path="" value="3.40282347e+38F"/>
564+ <pathentry kind="mac" name="__FLT_MIN__" path="" value="1.17549435e-38F"/>
565+ <pathentry kind="mac" name="__FLT_EPSILON__" path="" value="1.19209290e-7F"/>
566+ <pathentry kind="mac" name="__FLT_DENORM_MIN__" path="" value="1.40129846e-45F"/>
567+ <pathentry kind="mac" name="__FLT_HAS_DENORM__" path="" value="1"/>
568+ <pathentry kind="mac" name="__FLT_HAS_INFINITY__" path="" value="1"/>
569+ <pathentry kind="mac" name="__FLT_HAS_QUIET_NAN__" path="" value="1"/>
570+ <pathentry kind="mac" name="__DBL_MANT_DIG__" path="" value="53"/>
571+ <pathentry kind="mac" name="__DBL_DIG__" path="" value="15"/>
572+ <pathentry kind="mac" name="__DBL_MIN_EXP__" path="" value="(-1021)"/>
573+ <pathentry kind="mac" name="__DBL_MIN_10_EXP__" path="" value="(-307)"/>
574+ <pathentry kind="mac" name="__DBL_MAX_EXP__" path="" value="1024"/>
575+ <pathentry kind="mac" name="__DBL_MAX_10_EXP__" path="" value="308"/>
576+ <pathentry kind="mac" name="__DBL_MAX__" path="" value="1.7976931348623157e+308"/>
577+ <pathentry kind="mac" name="__DBL_MIN__" path="" value="2.2250738585072014e-308"/>
578+ <pathentry kind="mac" name="__DBL_EPSILON__" path="" value="2.2204460492503131e-16"/>
579+ <pathentry kind="mac" name="__DBL_DENORM_MIN__" path="" value="4.9406564584124654e-324"/>
580+ <pathentry kind="mac" name="__DBL_HAS_DENORM__" path="" value="1"/>
581+ <pathentry kind="mac" name="__DBL_HAS_INFINITY__" path="" value="1"/>
582+ <pathentry kind="mac" name="__DBL_HAS_QUIET_NAN__" path="" value="1"/>
583+ <pathentry kind="mac" name="__LDBL_MANT_DIG__" path="" value="64"/>
584+ <pathentry kind="mac" name="__LDBL_DIG__" path="" value="18"/>
585+ <pathentry kind="mac" name="__LDBL_MIN_EXP__" path="" value="(-16381)"/>
586+ <pathentry kind="mac" name="__LDBL_MIN_10_EXP__" path="" value="(-4931)"/>
587+ <pathentry kind="mac" name="__LDBL_MAX_EXP__" path="" value="16384"/>
588+ <pathentry kind="mac" name="__LDBL_MAX_10_EXP__" path="" value="4932"/>
589+ <pathentry kind="mac" name="__DECIMAL_DIG__" path="" value="21"/>
590+ <pathentry kind="mac" name="__LDBL_MAX__" path="" value="1.18973149535723176502e+4932L"/>
591+ <pathentry kind="mac" name="__LDBL_MIN__" path="" value="3.36210314311209350626e-4932L"/>
592+ <pathentry kind="mac" name="__LDBL_EPSILON__" path="" value="1.08420217248550443401e-19L"/>
593+ <pathentry kind="mac" name="__LDBL_DENORM_MIN__" path="" value="3.64519953188247460253e-4951L"/>
594+ <pathentry kind="mac" name="__LDBL_HAS_DENORM__" path="" value="1"/>
595+ <pathentry kind="mac" name="__LDBL_HAS_INFINITY__" path="" value="1"/>
596+ <pathentry kind="mac" name="__LDBL_HAS_QUIET_NAN__" path="" value="1"/>
597+ <pathentry kind="mac" name="__DEC32_MANT_DIG__" path="" value="7"/>
598+ <pathentry kind="mac" name="__DEC32_MIN_EXP__" path="" value="(-94)"/>
599+ <pathentry kind="mac" name="__DEC32_MAX_EXP__" path="" value="97"/>
600+ <pathentry kind="mac" name="__DEC32_MIN__" path="" value="1E-95DF"/>
601+ <pathentry kind="mac" name="__DEC32_MAX__" path="" value="9.999999E96DF"/>
602+ <pathentry kind="mac" name="__DEC32_EPSILON__" path="" value="1E-6DF"/>
603+ <pathentry kind="mac" name="__DEC32_SUBNORMAL_MIN__" path="" value="0.000001E-95DF"/>
604+ <pathentry kind="mac" name="__DEC64_MANT_DIG__" path="" value="16"/>
605+ <pathentry kind="mac" name="__DEC64_MIN_EXP__" path="" value="(-382)"/>
606+ <pathentry kind="mac" name="__DEC64_MAX_EXP__" path="" value="385"/>
607+ <pathentry kind="mac" name="__DEC64_MIN__" path="" value="1E-383DD"/>
608+ <pathentry kind="mac" name="__DEC64_MAX__" path="" value="9.999999999999999E384DD"/>
609+ <pathentry kind="mac" name="__DEC64_EPSILON__" path="" value="1E-15DD"/>
610+ <pathentry kind="mac" name="__DEC64_SUBNORMAL_MIN__" path="" value="0.000000000000001E-383DD"/>
611+ <pathentry kind="mac" name="__DEC128_MANT_DIG__" path="" value="34"/>
612+ <pathentry kind="mac" name="__DEC128_MIN_EXP__" path="" value="(-6142)"/>
613+ <pathentry kind="mac" name="__DEC128_MAX_EXP__" path="" value="6145"/>
614+ <pathentry kind="mac" name="__DEC128_MIN__" path="" value="1E-6143DL"/>
615+ <pathentry kind="mac" name="__DEC128_MAX__" path="" value="9.999999999999999999999999999999999E6144DL"/>
616+ <pathentry kind="mac" name="__DEC128_EPSILON__" path="" value="1E-33DL"/>
617+ <pathentry kind="mac" name="__DEC128_SUBNORMAL_MIN__" path="" value="0.000000000000000000000000000000001E-6143DL"/>
618+ <pathentry kind="mac" name="__REGISTER_PREFIX__" path="" value=""/>
619+ <pathentry kind="mac" name="__USER_LABEL_PREFIX__" path="" value=""/>
620+ <pathentry kind="mac" name="__VERSION__" path="" value="&quot;4.4.3&quot;"/>
621+ <pathentry kind="mac" name="__GNUC_GNU_INLINE__" path="" value="1"/>
622+ <pathentry kind="mac" name="__NO_INLINE__" path="" value="1"/>
623+ <pathentry kind="mac" name="__FINITE_MATH_ONLY__" path="" value="0"/>
624+ <pathentry kind="mac" name="__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1" path="" value="1"/>
625+ <pathentry kind="mac" name="__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2" path="" value="1"/>
626+ <pathentry kind="mac" name="__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4" path="" value="1"/>
627+ <pathentry kind="mac" name="__SSP__" path="" value="1"/>
628+ <pathentry kind="mac" name="__SIZEOF_INT__" path="" value="4"/>
629+ <pathentry kind="mac" name="__SIZEOF_LONG__" path="" value="4"/>
630+ <pathentry kind="mac" name="__SIZEOF_LONG_LONG__" path="" value="8"/>
631+ <pathentry kind="mac" name="__SIZEOF_SHORT__" path="" value="2"/>
632+ <pathentry kind="mac" name="__SIZEOF_FLOAT__" path="" value="4"/>
633+ <pathentry kind="mac" name="__SIZEOF_DOUBLE__" path="" value="8"/>
634+ <pathentry kind="mac" name="__SIZEOF_LONG_DOUBLE__" path="" value="12"/>
635+ <pathentry kind="mac" name="__SIZEOF_SIZE_T__" path="" value="4"/>
636+ <pathentry kind="mac" name="__SIZEOF_WCHAR_T__" path="" value="4"/>
637+ <pathentry kind="mac" name="__SIZEOF_WINT_T__" path="" value="4"/>
638+ <pathentry kind="mac" name="__SIZEOF_PTRDIFF_T__" path="" value="4"/>
639+ <pathentry kind="mac" name="__SIZEOF_POINTER__" path="" value="4"/>
640+ <pathentry kind="mac" name="__i386" path="" value="1"/>
641+ <pathentry kind="mac" name="__i386__" path="" value="1"/>
642+ <pathentry kind="mac" name="i386" path="" value="1"/>
643+ <pathentry kind="mac" name="__i486" path="" value="1"/>
644+ <pathentry kind="mac" name="__i486__" path="" value="1"/>
645+ <pathentry kind="mac" name="__gnu_linux__" path="" value="1"/>
646+ <pathentry kind="mac" name="__linux" path="" value="1"/>
647+ <pathentry kind="mac" name="__linux__" path="" value="1"/>
648+ <pathentry kind="mac" name="linux" path="" value="1"/>
649+ <pathentry kind="mac" name="__unix" path="" value="1"/>
650+ <pathentry kind="mac" name="__unix__" path="" value="1"/>
651+ <pathentry kind="mac" name="unix" path="" value="1"/>
652+ <pathentry kind="mac" name="__ELF__" path="" value="1"/>
653+ <pathentry kind="mac" name="__DECIMAL_BID_FORMAT__" path="" value="1"/>
654+ <pathentry kind="mac" name="__BIGGEST_ALIGNMENT__" path="" value="16"/>
655+ <pathentry kind="mac" name="_FORTIFY_SOURCE" path="" value="2"/>
656+ <pathentry kind="mac" name="__cplusplus" path="" value="1"/>
657+ <pathentry kind="mac" name="__GNUG__" path="" value="4"/>
658+ <pathentry kind="mac" name="__GXX_WEAK__" path="" value="1"/>
659+ <pathentry kind="mac" name="__DEPRECATED" path="" value="1"/>
660+ <pathentry kind="mac" name="__GXX_RTTI" path="" value="1"/>
661+ <pathentry kind="mac" name="__EXCEPTIONS" path="" value="1"/>
662+ <pathentry kind="mac" name="__GCC_HAVE_DWARF2_CFI_ASM" path="" value="1"/>
663+ <pathentry kind="mac" name="_GNU_SOURCE" path="" value="1"/>
664+ <pathentry include="/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove/include" kind="inc" path="" system="true"/>
665+ <pathentry include="/opt/ros/cturtle/stacks/common_msgs/sensor_msgs/include" kind="inc" path="" system="true"/>
666+ <pathentry include="/opt/ros/cturtle/stacks/common_msgs/sensor_msgs/msg_gen/cpp/include" kind="inc" path="" system="true"/>
667+ <pathentry include="/opt/ros/cturtle/stacks/common_msgs/sensor_msgs/srv_gen/cpp/include" kind="inc" path="" system="true"/>
668+ <pathentry include="/opt/ros/cturtle/stacks/common_msgs/geometry_msgs/msg_gen/cpp/include" kind="inc" path="" system="true"/>
669+ <pathentry include="/opt/ros/cturtle/stacks/common_msgs/diagnostic_msgs/msg_gen/cpp/include" kind="inc" path="" system="true"/>
670+ <pathentry include="/opt/ros/cturtle/stacks/common_msgs/diagnostic_msgs/srv_gen/cpp/include" kind="inc" path="" system="true"/>
671+ <pathentry include="/opt/ros/cturtle/ros/tools/rosrecord/include" kind="inc" path="" system="true"/>
672+ <pathentry include="/opt/ros/cturtle/ros/tools/rosbag/include" kind="inc" path="" system="true"/>
673+ <pathentry include="/opt/ros/cturtle/ros/tools/topic_tools/include" kind="inc" path="" system="true"/>
674+ <pathentry include="/opt/ros/cturtle/ros/tools/topic_tools/srv_gen/cpp/include" kind="inc" path="" system="true"/>
675+ <pathentry include="/opt/ros/cturtle/ros/std_msgs/include" kind="inc" path="" system="true"/>
676+ <pathentry include="/opt/ros/cturtle/ros/std_msgs/msg_gen/cpp/include" kind="inc" path="" system="true"/>
677+ <pathentry include="/opt/ros/cturtle/ros/test/rostest/include" kind="inc" path="" system="true"/>
678+ <pathentry include="/opt/ros/cturtle/ros/core/roscpp/include" kind="inc" path="" system="true"/>
679+ <pathentry include="/opt/ros/cturtle/ros/core/roscpp/msg_gen/cpp/include" kind="inc" path="" system="true"/>
680+ <pathentry include="/opt/ros/cturtle/ros/core/roscpp/srv_gen/cpp/include" kind="inc" path="" system="true"/>
681+ <pathentry include="/opt/ros/cturtle/ros/3rdparty/xmlrpcpp/src" kind="inc" path="" system="true"/>
682+ <pathentry include="/opt/ros/cturtle/ros/core/rosconsole/include" kind="inc" path="" system="true"/>
683+ <pathentry include="/opt/ros/cturtle/ros/core/roslib/include" kind="inc" path="" system="true"/>
684+ <pathentry include="/opt/ros/cturtle/ros/core/roslib/msg_gen/cpp/include" kind="inc" path="" system="true"/>
685+ <pathentry include="/opt/ros/cturtle/ros/tools/rospack" kind="inc" path="" system="true"/>
686+ <pathentry include="/opt/ros/cturtle/ros/tools/rospack/include" kind="inc" path="" system="true"/>
687+ <pathentry include="/opt/ros/cturtle/stacks/common/tinyxml/include" kind="inc" path="" system="true"/>
688+ <pathentry include="/opt/ros/cturtle/ros/3rdparty/gtest/gtest/include" kind="inc" path="" system="true"/>
689+ <pathentry include="/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove/srv_gen/cpp/include" kind="inc" path="" system="true"/>
690+ <pathentry include="/usr/local/include" kind="inc" path="" system="true"/>
691+ <pathentry include="/usr/lib/gcc/i486-linux-gnu/4.4/include" kind="inc" path="" system="true"/>
692+ <pathentry include="/usr/lib/gcc/i486-linux-gnu/4.4/include-fixed" kind="inc" path="" system="true"/>
693+ <pathentry include="/usr/include" kind="inc" path="" system="true"/>
694+ <pathentry include="/usr/include/c++/4.4" kind="inc" path="" system="true"/>
695+ <pathentry include="/usr/include/c++/4.4/i486-linux-gnu" kind="inc" path="" system="true"/>
696+ <pathentry include="/usr/include/c++/4.4/backward" kind="inc" path="" system="true"/>
697+ <pathentry excluding="**/CMakeFiles/" kind="out" path=""/>
698+ <pathentry kind="src" path=""/>
699+ </storageModule>
700+ </cconfiguration>
701+ </storageModule>
702+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
703+ <project id="cyberglove.null.1" name="cyberglove"/>
704+ </storageModule>
705+</cproject>
706
707=== added file 'shadow_robot/cyberglove/.project'
708--- shadow_robot/cyberglove/.project 1970-01-01 00:00:00 +0000
709+++ shadow_robot/cyberglove/.project 2010-11-03 16:17:45 +0000
710@@ -0,0 +1,116 @@
711+<?xml version="1.0" encoding="UTF-8"?>
712+<projectDescription>
713+ <name>[TRUNK] cyberglove</name>
714+ <comment></comment>
715+ <projects>
716+ </projects>
717+ <buildSpec>
718+ <buildCommand>
719+ <name>org.python.pydev.PyDevBuilder</name>
720+ <arguments>
721+ </arguments>
722+ </buildCommand>
723+ <buildCommand>
724+ <name>org.eclipse.cdt.make.core.makeBuilder</name>
725+ <triggers>clean,full,incremental,</triggers>
726+ <arguments>
727+ <dictionary>
728+ <key>org.eclipse.cdt.core.errorOutputParser</key>
729+ <value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;</value>
730+ </dictionary>
731+ <dictionary>
732+ <key>org.eclipse.cdt.make.core.append_environment</key>
733+ <value>true</value>
734+ </dictionary>
735+ <dictionary>
736+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
737+ <value>all</value>
738+ </dictionary>
739+ <dictionary>
740+ <key>org.eclipse.cdt.make.core.build.arguments</key>
741+ <value></value>
742+ </dictionary>
743+ <dictionary>
744+ <key>org.eclipse.cdt.make.core.build.command</key>
745+ <value>/usr/bin/make</value>
746+ </dictionary>
747+ <dictionary>
748+ <key>org.eclipse.cdt.make.core.build.location</key>
749+ <value>/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove</value>
750+ </dictionary>
751+ <dictionary>
752+ <key>org.eclipse.cdt.make.core.build.target.auto</key>
753+ <value>all</value>
754+ </dictionary>
755+ <dictionary>
756+ <key>org.eclipse.cdt.make.core.build.target.clean</key>
757+ <value>clean</value>
758+ </dictionary>
759+ <dictionary>
760+ <key>org.eclipse.cdt.make.core.build.target.inc</key>
761+ <value>all</value>
762+ </dictionary>
763+ <dictionary>
764+ <key>org.eclipse.cdt.make.core.buildArguments</key>
765+ <value></value>
766+ </dictionary>
767+ <dictionary>
768+ <key>org.eclipse.cdt.make.core.buildLocation</key>
769+ <value>/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove</value>
770+ </dictionary>
771+ <dictionary>
772+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
773+ <value>clean</value>
774+ </dictionary>
775+ <dictionary>
776+ <key>org.eclipse.cdt.make.core.contents</key>
777+ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
778+ </dictionary>
779+ <dictionary>
780+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
781+ <value>false</value>
782+ </dictionary>
783+ <dictionary>
784+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
785+ <value>true</value>
786+ </dictionary>
787+ <dictionary>
788+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
789+ <value>true</value>
790+ </dictionary>
791+ <dictionary>
792+ <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
793+ <value>true</value>
794+ </dictionary>
795+ <dictionary>
796+ <key>org.eclipse.cdt.make.core.environment</key>
797+ <value>VERBOSE=1|ROS_ROOT=/opt/ros/cturtle/ros|ROS_PACKAGE_PATH=/opt/ros/cturtle/stacks:/home/ugo/ros_stacks_external:/home/ugo/Projects/3_FT_DSTL/Software/ros:/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot|PYTHONPATH=/opt/ros/cturtle/ros/core/roslib/src:/opt/ros/cturtle/ros/core/roslib/src::/home/ugo/ros_stacks_external/jsk-ros-pkg/openrave_planning/openrave/share/openrave:/home/ugo/ros_stacks_external/jsk-ros-pkg/openrave_planning/openrave/share/openrave|PATH=/opt/ros/cturtle/ros/bin:/opt/ros/cturtle/ros/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/ugo/ros_stacks_external/jsk-ros-pkg/openrave_planning/openrave/bin:/home/ugo/ros_stacks_external/jsk-ros-pkg/openrave_planning/openrave/bin|</value>
798+ </dictionary>
799+ <dictionary>
800+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
801+ <value>all</value>
802+ </dictionary>
803+ <dictionary>
804+ <key>org.eclipse.cdt.make.core.stopOnError</key>
805+ <value>true</value>
806+ </dictionary>
807+ <dictionary>
808+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
809+ <value>false</value>
810+ </dictionary>
811+ </arguments>
812+ </buildCommand>
813+ <buildCommand>
814+ <name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
815+ <arguments>
816+ </arguments>
817+ </buildCommand>
818+ </buildSpec>
819+ <natures>
820+ <nature>org.eclipse.cdt.core.ccnature</nature>
821+ <nature>org.eclipse.cdt.make.core.makeNature</nature>
822+ <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
823+ <nature>org.eclipse.cdt.core.cnature</nature>
824+ <nature>org.python.pydev.pythonNature</nature>
825+ </natures>
826+</projectDescription>
827
828=== added file 'shadow_robot/cyberglove/CMakeLists.txt'
829--- shadow_robot/cyberglove/CMakeLists.txt 1970-01-01 00:00:00 +0000
830+++ shadow_robot/cyberglove/CMakeLists.txt 2010-11-03 16:17:45 +0000
831@@ -0,0 +1,34 @@
832+cmake_minimum_required(VERSION 2.4.6)
833+include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
834+
835+# Set the build type. Options are:
836+# Coverage : w/ debug symbols, w/o optimization, w/ code-coverage
837+# Debug : w/ debug symbols, w/o optimization
838+# Release : w/o debug symbols, w/ optimization
839+# RelWithDebInfo : w/ debug symbols, w/ optimization
840+# MinSizeRel : w/o debug symbols, w/ optimization, stripped binaries
841+#set(ROS_BUILD_TYPE RelWithDebInfo)
842+
843+rosbuild_init()
844+
845+#set the default path for built executables to the "bin" directory
846+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
847+#set the default path for built libraries to the "lib" directory
848+set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
849+
850+#uncomment if you have defined messages
851+#rosbuild_genmsg()
852+#uncomment if you have defined services
853+rosbuild_gensrv()
854+
855+rosbuild_add_executable(cyberglove src/cyberglove_publisher.cpp src/cyberglove_node.cpp src/serial_glove.c src/xml_calibration_parser.cpp src/cyberglove_service.cpp)
856+
857+rosbuild_add_gtest(test/test_calibration test/test_calibration.cpp src/xml_calibration_parser.cpp )
858+
859+#common commands for building c++ executables and libraries
860+#rosbuild_add_library(${PROJECT_NAME} src/example.cpp)
861+#target_link_libraries(${PROJECT_NAME} another_library)
862+#rosbuild_add_boost_directories()
863+#rosbuild_link_boost(${PROJECT_NAME} thread)
864+#rosbuild_add_executable(example examples/example.cpp)
865+#target_link_libraries(example ${PROJECT_NAME})
866
867=== added file 'shadow_robot/cyberglove/Makefile'
868--- shadow_robot/cyberglove/Makefile 1970-01-01 00:00:00 +0000
869+++ shadow_robot/cyberglove/Makefile 2010-11-03 16:17:45 +0000
870@@ -0,0 +1,1 @@
871+include $(shell rospack find mk)/cmake.mk
872\ No newline at end of file
873
874=== added file 'shadow_robot/cyberglove/Ogre.log'
875--- shadow_robot/cyberglove/Ogre.log 1970-01-01 00:00:00 +0000
876+++ shadow_robot/cyberglove/Ogre.log 2010-11-03 16:17:45 +0000
877@@ -0,0 +1,419 @@
878+17:43:00: Creating resource group General
879+17:43:00: Creating resource group Internal
880+17:43:00: Creating resource group Autodetect
881+17:43:00: SceneManagerFactory for type 'DefaultSceneManager' registered.
882+17:43:00: Registering ResourceManager for type Material
883+17:43:00: Registering ResourceManager for type Mesh
884+17:43:00: Registering ResourceManager for type Skeleton
885+17:43:00: MovableObjectFactory for type 'ParticleSystem' registered.
886+17:43:00: OverlayElementFactory for type Panel registered.
887+17:43:00: OverlayElementFactory for type BorderPanel registered.
888+17:43:00: OverlayElementFactory for type TextArea registered.
889+17:43:00: Registering ResourceManager for type Font
890+17:43:00: ArchiveFactory for archive type FileSystem registered.
891+17:43:00: ArchiveFactory for archive type Zip registered.
892+17:43:00: DDS codec registering
893+17:43:00: FreeImage version: 3.13.0
894+17:43:00: This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details
895+17:43:00: Supported formats: bmp,ico,jpg,jif,jpeg,jpe,jng,koa,iff,lbm,mng,pbm,pbm,pcd,pcx,pgm,pgm,png,ppm,ppm,ras,tga,targa,tif,tiff,wap,wbmp,wbm,psd,cut,xbm,xpm,gif,hdr,g3,sgi,exr,j2k,j2c,jp2,pfm,pct,pict,pic,bay,bmq,cr2,crw,cs1,dc2,dcr,dng,erf,fff,hdr,k25,kdc,mdc,mos,mrw,nef,orf,pef,pxn,raf,raw,rdc,sr2,srf,arw,3fr,cine,ia,kc2,mef,nrw,qtk,rw2,sti,drf,dsc,ptx,cap,iiq,rwz
896+17:43:00: Registering ResourceManager for type HighLevelGpuProgram
897+17:43:00: Registering ResourceManager for type Compositor
898+17:43:00: MovableObjectFactory for type 'Entity' registered.
899+17:43:00: MovableObjectFactory for type 'Light' registered.
900+17:43:00: MovableObjectFactory for type 'BillboardSet' registered.
901+17:43:00: MovableObjectFactory for type 'ManualObject' registered.
902+17:43:00: MovableObjectFactory for type 'BillboardChain' registered.
903+17:43:00: MovableObjectFactory for type 'RibbonTrail' registered.
904+17:43:00: OGRE EXCEPTION(6:FileNotFoundException): 'plugins.cfg' file not found! in ConfigFile::load at /home/ugo/ros_latest/stacks/visualization_common/ogre/build/ogre_src_v1-7-1/OgreMain/src/OgreConfigFile.cpp (line 83)
905+17:43:00: plugins.cfg not found, automatic plugin loading disabled.
906+17:43:00: *-*-* OGRE Initialising
907+17:43:00: *-*-* Version 1.7.1 (Cthugha)
908+17:43:00: Loading library RenderSystem_GL
909+17:43:00: Installing plugin: GL RenderSystem
910+17:43:00: OpenGL Rendering Subsystem created.
911+17:43:00: Plugin successfully installed
912+17:43:00: Loading library Plugin_OctreeSceneManager
913+17:43:00: Installing plugin: Octree & Terrain Scene Manager
914+17:43:00: Plugin successfully installed
915+17:43:00: Loading library Plugin_ParticleFX
916+17:43:00: Installing plugin: ParticleFX
917+17:43:00: Particle Emitter Type 'Point' registered
918+17:43:00: Particle Emitter Type 'Box' registered
919+17:43:00: Particle Emitter Type 'Ellipsoid' registered
920+17:43:00: Particle Emitter Type 'Cylinder' registered
921+17:43:00: Particle Emitter Type 'Ring' registered
922+17:43:00: Particle Emitter Type 'HollowEllipsoid' registered
923+17:43:00: Particle Affector Type 'LinearForce' registered
924+17:43:00: Particle Affector Type 'ColourFader' registered
925+17:43:00: Particle Affector Type 'ColourFader2' registered
926+17:43:00: Particle Affector Type 'ColourImage' registered
927+17:43:00: Particle Affector Type 'ColourInterpolator' registered
928+17:43:00: Particle Affector Type 'Scaler' registered
929+17:43:00: Particle Affector Type 'Rotator' registered
930+17:43:00: Particle Affector Type 'DirectionRandomiser' registered
931+17:43:00: Particle Affector Type 'DeflectorPlane' registered
932+17:43:00: Plugin successfully installed
933+17:43:00: Loading library Plugin_CgProgramManager
934+17:43:00: Installing plugin: Cg Program Manager
935+17:43:00: Plugin successfully installed
936+17:43:00: CPU Identifier & Features
937+17:43:00: -------------------------
938+17:43:00: * CPU ID: AuthenticAMD: AMD Athlon(tm) Processor LE-1640
939+17:43:00: * SSE: yes
940+17:43:00: * SSE2: yes
941+17:43:00: * SSE3: yes
942+17:43:00: * MMX: yes
943+17:43:00: * MMXEXT: yes
944+17:43:00: * 3DNOW: yes
945+17:43:00: * 3DNOWEXT: yes
946+17:43:00: * CMOV: yes
947+17:43:00: * TSC: yes
948+17:43:00: * FPU: yes
949+17:43:00: * PRO: yes
950+17:43:00: * HT: no
951+17:43:00: -------------------------
952+17:43:00: ******************************
953+*** Starting GLX Subsystem ***
954+******************************
955+17:43:00: Creating resource group ogre_tools
956+17:43:00: Added resource location '/home/ugo/ros_latest/stacks/visualization_common/ogre_tools/media' of type 'FileSystem' to resource group 'ogre_tools'
957+17:43:00: Added resource location '/home/ugo/ros_latest/stacks/visualization_common/ogre_tools/media/fonts' of type 'FileSystem' to resource group 'ogre_tools'
958+17:43:00: Added resource location '/home/ugo/ros_latest/stacks/visualization_common/ogre_tools/media/models' of type 'FileSystem' to resource group 'ogre_tools'
959+17:43:00: Added resource location '/home/ugo/ros_latest/stacks/visualization_common/ogre_tools/media/materials' of type 'FileSystem' to resource group 'ogre_tools'
960+17:43:00: Added resource location '/home/ugo/ros_latest/stacks/visualization_common/ogre_tools/media/materials/scripts' of type 'FileSystem' to resource group 'ogre_tools'
961+17:43:00: Added resource location '/home/ugo/ros_latest/stacks/visualization_common/ogre_tools/media/materials/programs' of type 'FileSystem' to resource group 'ogre_tools'
962+17:43:00: GLRenderSystem::_createRenderWindow "OgreRenderWindow1", 1517x1000 windowed miscParams: parentWindowHandle=71303241
963+17:43:00: GLXWindow::create used FBConfigID = 117
964+17:43:00: GL_VERSION = 3.0.0 NVIDIA 185.18.36
965+17:43:00: GL_VENDOR = NVIDIA Corporation
966+17:43:00: GL_RENDERER = GeForce 9500 GT/PCI/SSE2/3DNOW!
967+17:43:00: GL_EXTENSIONS = GL_ARB_color_buffer_float GL_ARB_depth_buffer_float GL_ARB_depth_texture GL_ARB_draw_buffers GL_ARB_draw_instanced GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_framebuffer_object GL_ARB_geometry_shader4 GL_ARB_imaging GL_ARB_map_buffer_range GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_shadow GL_ARB_shader_objects GL_ARB_shading_language_100 GL_ARB_texture_border_clamp GL_ARB_texture_buffer_object GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_dot3 GL_ARB_texture_float GL_ARB_texture_mirrored_repeat GL_ARB_texture_non_power_of_two GL_ARB_texture_rectangle GL_ARB_texture_rg GL_ARB_transpose_matrix GL_ARB_vertex_array_object GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_texture_float GL_ATI_texture_mirror_once GL_S3_s3tc GL_EXT_texture_env_add GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_Cg_shader GL_EXT_bindable_uniform GL_EXT_depth_bounds_test GL_EXT_direct_state_access GL_EXT_draw_buffers2 GL_EXT_draw_instanced GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_framebuffer_object GL_EXTX_framebuffer_mixed_formats GL_EXT_framebuffer_sRGB GL_EXT_geometry_shader4 GL_EXT_gpu_program_parameters GL_EXT_gpu_shader4 GL_EXT_multi_draw_arrays GL_EXT_packed_depth_stencil GL_EXT_packed_float GL_EXT_packed_pixels GL_EXT_pixel_buffer_object GL_EXT_point_parameters GL_EXT_provoking_vertex GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_funcs GL_EXT_stencil_two_side GL_EXT_stencil_wrap GL_EXT_texture3D GL_EXT_texture_array GL_EXT_texture_buffer_object GL_EXT_texture_compression_latc GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_texture_integer GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object GL_EXT_texture_sRGB GL_EXT_texture_swizzle GL_EXT_texture_shared_exponent GL_EXT_timer_query GL_EXT_vertex_array GL_EXT_vertex_array_bgra GL_IBM_rasterpos_clip GL_IBM_texture_mirrored_repeat GL_KTX_buffer_region GL_NV_blend_square GL_NV_copy_depth_to_color GL_NV_depth_buffer_float GL_NV_conditional_render GL_NV_depth_clamp GL_NV_explicit_multisample GL_NV_fence GL_NV_float_buffer GL_NV_fog_distance GL_NV_fragment_program GL_NV_fragment_program_option GL_NV_fragment_program2 GL_NV_framebuffer_multisample_coverage GL_NV_geometry_shader4 GL_NV_gpu_program4 GL_NV_half_float GL_NV_light_max_exponent GL_NV_multisample_coverage GL_NV_multisample_filter_hint GL_NV_occlusion_query GL_NV_packed_depth_stencil GL_NV_parameter_buffer_object GL_NV_pixel_data_range GL_NV_point_sprite GL_NV_primitive_restart GL_NV_register_combiners GL_NV_register_combiners2 GL_NV_texgen_reflection GL_NV_texture_compression_vtc GL_NV_texture_env_combine4 GL_NV_texture_expand_normal GL_NV_texture_rectangle GL_NV_texture_shader GL_NV_texture_shader2 GL_NV_texture_shader3 GL_NV_transform_feedback GL_NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_program GL_NV_vertex_program1_1 GL_NV_vertex_program2 GL_NV_vertex_program2_option GL_NV_vertex_program3 GL_NVX_conditional_render GL_NV_vertex_buffer_unified_memory GL_NV_shader_buffer_load GL_SGIS_generate_mipmap GL_SGIS_texture_lod GL_SGIX_depth_texture GL_SGIX_shadow GL_SUN_slice_accum
968+17:43:00: Supported GLX extensions: GLX_EXT_visual_info GLX_EXT_visual_rating GLX_SGIX_fbconfig GLX_SGIX_pbuffer GLX_SGI_video_sync GLX_SGI_swap_control GLX_EXT_texture_from_pixmap GLX_ARB_create_context GLX_ARB_multisample GLX_NV_float_buffer GLX_ARB_fbconfig_float GLX_EXT_framebuffer_sRGB GLX_ARB_get_proc_address
969+17:43:00: ***************************
970+17:43:00: *** GL Renderer Started ***
971+17:43:00: ***************************
972+17:43:00: Registering ResourceManager for type GpuProgram
973+17:43:00: GLSL support detected
974+17:43:00: GL: Using GL_EXT_framebuffer_object for rendering to textures (best)
975+17:43:00: FBO PF_UNKNOWN depth/stencil support: D16S0 D24S0 D32S0 Packed-D24S8
976+17:43:00: FBO PF_L8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
977+17:43:00: FBO PF_A8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
978+17:43:00: FBO PF_A4L4 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
979+17:43:00: FBO PF_BYTE_LA depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
980+17:43:01: FBO PF_R5G6B5 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
981+17:43:01: FBO PF_B5G6R5 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
982+17:43:01: FBO PF_A1R5G5B5 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
983+17:43:01: FBO PF_R8G8B8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
984+17:43:01: FBO PF_B8G8R8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
985+17:43:01: FBO PF_A8R8G8B8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
986+17:43:01: FBO PF_B8G8R8A8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
987+17:43:01: FBO PF_A2R10G10B10 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
988+17:43:01: FBO PF_A2B10G10R10 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
989+17:43:01: FBO PF_FLOAT16_RGB depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
990+17:43:01: FBO PF_FLOAT16_RGBA depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
991+17:43:02: FBO PF_FLOAT32_RGB depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
992+17:43:02: FBO PF_FLOAT32_RGBA depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
993+17:43:02: FBO PF_X8R8G8B8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
994+17:43:02: FBO PF_X8B8G8R8 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
995+17:43:02: FBO PF_SHORT_RGBA depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
996+17:43:02: FBO PF_R3G3B2 depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
997+17:43:02: FBO PF_FLOAT16_R depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
998+17:43:02: FBO PF_FLOAT32_R depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
999+17:43:02: FBO PF_FLOAT16_GR depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
1000+17:43:02: FBO PF_FLOAT32_GR depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
1001+17:43:02: FBO PF_SHORT_RGB depth/stencil support: D0S0 D16S0 D24S0 D32S0 Packed-D24S8
1002+17:43:02: [GL] : Valid FBO targets PF_UNKNOWN PF_L8 PF_A8 PF_A4L4 PF_BYTE_LA PF_R5G6B5 PF_B5G6R5 PF_A1R5G5B5 PF_R8G8B8 PF_B8G8R8 PF_A8R8G8B8 PF_B8G8R8A8 PF_A2R10G10B10 PF_A2B10G10R10 PF_FLOAT16_RGB PF_FLOAT16_RGBA PF_FLOAT32_RGB PF_FLOAT32_RGBA PF_X8R8G8B8 PF_X8B8G8R8 PF_SHORT_RGBA PF_R3G3B2 PF_FLOAT16_R PF_FLOAT32_R PF_FLOAT16_GR PF_FLOAT32_GR PF_SHORT_RGB
1003+17:43:02: RenderSystem capabilities
1004+17:43:02: -------------------------
1005+17:43:02: RenderSystem Name: OpenGL Rendering Subsystem
1006+17:43:02: GPU Vendor: nvidia
1007+17:43:02: Device Name: GeForce 9500 GT/PCI/SSE2/3DNOW!
1008+17:43:02: Driver Version: 3.0.0.0
1009+17:43:02: * Fixed function pipeline: yes
1010+17:43:02: * Hardware generation of mipmaps: yes
1011+17:43:02: * Texture blending: yes
1012+17:43:02: * Anisotropic texture filtering: yes
1013+17:43:02: * Dot product texture operation: yes
1014+17:43:02: * Cube mapping: yes
1015+17:43:02: * Hardware stencil buffer: yes
1016+17:43:02: - Stencil depth: 8
1017+17:43:02: - Two sided stencil support: yes
1018+17:43:02: - Wrap stencil values: yes
1019+17:43:02: * Hardware vertex / index buffers: yes
1020+17:43:02: * Vertex programs: yes
1021+17:43:02: * Number of floating-point constants for vertex programs: 1024
1022+17:43:02: * Number of integer constants for vertex programs: 0
1023+17:43:02: * Number of boolean constants for vertex programs: 0
1024+17:43:02: * Fragment programs: yes
1025+17:43:02: * Number of floating-point constants for fragment programs: 512
1026+17:43:02: * Number of integer constants for fragment programs: 0
1027+17:43:02: * Number of boolean constants for fragment programs: 0
1028+17:43:02: * Geometry programs: yes
1029+17:43:02: * Number of floating-point constants for geometry programs: 512
1030+17:43:02: * Number of integer constants for geometry programs: 0
1031+17:43:02: * Number of boolean constants for geometry programs: 0
1032+17:43:02: * Supported Shader Profiles: arbfp1 arbvp1 fp20 fp30 fp40 glsl gp4gp gpu_gp nvgp4 vp30 vp40
1033+17:43:02: * Texture Compression: yes
1034+17:43:02: - DXT: yes
1035+17:43:02: - VTC: yes
1036+17:43:02: - PVRTC: no
1037+17:43:02: * Scissor Rectangle: yes
1038+17:43:02: * Hardware Occlusion Query: yes
1039+17:43:02: * User clip planes: yes
1040+17:43:02: * VET_UBYTE4 vertex element type: yes
1041+17:43:02: * Infinite far plane projection: yes
1042+17:43:02: * Hardware render-to-texture: yes
1043+17:43:02: * Floating point textures: yes
1044+17:43:02: * Non-power-of-two textures: yes
1045+17:43:02: * Volume textures: yes
1046+17:43:02: * Multiple Render Targets: 8
1047+17:43:02: - With different bit depths: yes
1048+17:43:02: * Point Sprites: yes
1049+17:43:02: * Extended point parameters: yes
1050+17:43:02: * Max Point Size: 63.375
1051+17:43:02: * Vertex texture fetch: yes
1052+17:43:02: * Number of world matrices: 0
1053+17:43:02: * Number of texture units: 32
1054+17:43:02: * Stencil buffer depth: 8
1055+17:43:02: * Number of vertex blend matrices: 0
1056+17:43:02: - Max vertex textures: 32
1057+17:43:02: - Vertex textures shared: yes
1058+17:43:02: * Render to Vertex Buffer : yes
1059+17:43:02: * GL 1.5 without VBO workaround: no
1060+17:43:02: * Frame Buffer objects: yes
1061+17:43:02: * Frame Buffer objects (ARB extension): no
1062+17:43:02: * Frame Buffer objects (ATI extension): no
1063+17:43:02: * PBuffer support: no
1064+17:43:02: * GL 1.5 without HW-occlusion workaround: no
1065+17:43:02: Registering ResourceManager for type Texture
1066+17:43:02: DefaultWorkQueue('Root') initialising on thread 0x9365da8.
1067+17:43:02: DefaultWorkQueue('Root')::WorkerFunc - thread 0x96397c8 starting.
1068+17:43:02: Particle Renderer Type 'billboard' registered
1069+17:43:02: SceneManagerFactory for type 'OctreeSceneManager' registered.
1070+17:43:02: SceneManagerFactory for type 'TerrainSceneManager' registered.
1071+17:43:03: Added resource location '/home/ugo/ros_latest/stacks/visualization/rviz/ogre_media/textures' of type 'FileSystem' to resource group 'General'
1072+17:43:03: Parsing scripts for resource group Autodetect
1073+17:43:03: Finished parsing scripts for resource group Autodetect
1074+17:43:03: Parsing scripts for resource group General
1075+17:43:03: Finished parsing scripts for resource group General
1076+17:43:03: Parsing scripts for resource group Internal
1077+17:43:03: Finished parsing scripts for resource group Internal
1078+17:43:03: Parsing scripts for resource group ogre_tools
1079+17:43:03: Parsing script point_cloud_billboard.program
1080+17:43:03: Parsing script point_cloud_box.program
1081+17:43:03: Parsing script passthrough.program
1082+17:43:03: Parsing script point_cloud_point.program
1083+17:43:03: Parsing script point_cloud_box.material
1084+17:43:03: Parsing script point_cloud_billboard.material
1085+17:43:03: Parsing script point_cloud_point.material
1086+17:43:03: Parsing script arial.fontdef
1087+17:43:03: Finished parsing scripts for resource group ogre_tools
1088+17:43:03: Creating resource group rviz
1089+17:43:04: Mesh: Loading ogre_tools_sphere.mesh.
1090+17:43:04: WARNING: ogre_tools_sphere.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1091+17:43:04: Mesh: Loading ogre_tools_cylinder.mesh.
1092+17:43:04: WARNING: ogre_tools_cylinder.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1093+17:43:04: Mesh: Loading ogre_tools_cone.mesh.
1094+17:43:04: WARNING: ogre_tools_cone.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1095+17:43:04: Texture: SelectionRect0Texture: Loading 1 faces(PF_R8G8B8A8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_A8R8G8B8,1x1x1.
1096+17:43:05: WARNING: package://sr_hand/model/meshes/F1.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1097+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link0 because this Material does not exist. Have you forgotten to define it in a .material script?
1098+17:43:05: Mesh: Loading ogre_tools_cube.mesh.
1099+17:43:05: WARNING: ogre_tools_cube.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1100+17:43:05: Texture: Robot Link Material00RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1101+17:43:05: Texture: Robot Link Material00RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1102+17:43:05: WARNING: package://sr_hand/model/meshes/knuckle.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1103+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link2 because this Material does not exist. Have you forgotten to define it in a .material script?
1104+17:43:05: Texture: Robot Link Material01RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1105+17:43:05: Texture: Robot Link Material01RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1106+17:43:05: WARNING: package://sr_hand/model/meshes/F2.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1107+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link4 because this Material does not exist. Have you forgotten to define it in a .material script?
1108+17:43:05: Texture: Robot Link Material02RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1109+17:43:05: Texture: Robot Link Material02RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1110+17:43:05: WARNING: package://sr_hand/model/meshes/F3.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1111+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link6 because this Material does not exist. Have you forgotten to define it in a .material script?
1112+17:43:05: Texture: Robot Link Material03RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1113+17:43:05: Texture: Robot Link Material03RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1114+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link8 because this Material does not exist. Have you forgotten to define it in a .material script?
1115+17:43:05: Texture: Robot Link Material04RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1116+17:43:05: Texture: Robot Link Material04RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1117+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link10 because this Material does not exist. Have you forgotten to define it in a .material script?
1118+17:43:05: Texture: Robot Link Material05RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1119+17:43:05: Texture: Robot Link Material05RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1120+17:43:05: WARNING: package://sr_hand/model/meshes/lfmetacarpal.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1121+17:43:05: Can't assign material Material.001 to SubEntity of Robot Link12 because this Material does not exist. Have you forgotten to define it in a .material script?
1122+17:43:05: Texture: Robot Link Material06RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1123+17:43:05: Texture: Robot Link Material06RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1124+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link14 because this Material does not exist. Have you forgotten to define it in a .material script?
1125+17:43:05: Texture: Robot Link Material07RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1126+17:43:05: Texture: Robot Link Material07RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1127+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link16 because this Material does not exist. Have you forgotten to define it in a .material script?
1128+17:43:05: Texture: Robot Link Material08RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1129+17:43:05: Texture: Robot Link Material08RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1130+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link18 because this Material does not exist. Have you forgotten to define it in a .material script?
1131+17:43:05: Texture: Robot Link Material09RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1132+17:43:05: Texture: Robot Link Material09RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1133+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link20 because this Material does not exist. Have you forgotten to define it in a .material script?
1134+17:43:05: Texture: Robot Link Material010RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1135+17:43:05: Texture: Robot Link Material010RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1136+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link22 because this Material does not exist. Have you forgotten to define it in a .material script?
1137+17:43:05: Texture: Robot Link Material011RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1138+17:43:05: Texture: Robot Link Material011RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1139+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link24 because this Material does not exist. Have you forgotten to define it in a .material script?
1140+17:43:05: Texture: Robot Link Material012RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1141+17:43:05: Texture: Robot Link Material012RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1142+17:43:05: WARNING: package://sr_hand/model/meshes/palm.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1143+17:43:05: Can't assign material Material.001 to SubEntity of Robot Link26 because this Material does not exist. Have you forgotten to define it in a .material script?
1144+17:43:05: Texture: Robot Link Material013RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1145+17:43:05: Texture: Robot Link Material013RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1146+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link28 because this Material does not exist. Have you forgotten to define it in a .material script?
1147+17:43:05: Texture: Robot Link Material014RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1148+17:43:05: Texture: Robot Link Material014RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1149+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link30 because this Material does not exist. Have you forgotten to define it in a .material script?
1150+17:43:05: Texture: Robot Link Material015RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1151+17:43:05: Texture: Robot Link Material015RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1152+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link32 because this Material does not exist. Have you forgotten to define it in a .material script?
1153+17:43:05: Texture: Robot Link Material016RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1154+17:43:05: Texture: Robot Link Material016RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1155+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link34 because this Material does not exist. Have you forgotten to define it in a .material script?
1156+17:43:05: Texture: Robot Link Material017RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1157+17:43:05: Texture: Robot Link Material017RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1158+17:43:05: WARNING: package://sr_hand/model/meshes/forearm.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1159+17:43:05: Can't assign material Material.011 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1160+17:43:05: Can't assign material Material.010 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1161+17:43:05: Can't assign material Material.009 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1162+17:43:05: Can't assign material Material.008 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1163+17:43:05: Can't assign material Material.007 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1164+17:43:05: Can't assign material Material.006 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1165+17:43:05: Can't assign material Material.005 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1166+17:43:05: Can't assign material Material.004 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1167+17:43:05: Can't assign material Material.003 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1168+17:43:05: Can't assign material Material.002 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1169+17:43:05: Can't assign material Material.001 to SubEntity of Robot Link36 because this Material does not exist. Have you forgotten to define it in a .material script?
1170+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1171+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1172+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1173+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1174+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1175+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1176+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1177+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1178+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1179+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1180+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1181+17:43:05: Texture: Robot Link Material018RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1182+17:43:05: Texture: Robot Link Material019RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1183+17:43:05: Texture: Robot Link Material019RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1184+17:43:05: WARNING: package://sr_hand/model/meshes/TH1_z.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1185+17:43:05: Can't assign material osg20mat0 to SubEntity of Robot Link40 because this Material does not exist. Have you forgotten to define it in a .material script?
1186+17:43:05: Texture: Robot Link Material020RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1187+17:43:05: Texture: Robot Link Material020RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1188+17:43:05: Texture: Robot Link Material021RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1189+17:43:05: Texture: Robot Link Material021RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1190+17:43:05: WARNING: package://sr_hand/model/meshes/TH2_z.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1191+17:43:05: Can't assign material osg19mat0 to SubEntity of Robot Link44 because this Material does not exist. Have you forgotten to define it in a .material script?
1192+17:43:05: Texture: Robot Link Material022RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1193+17:43:05: Texture: Robot Link Material022RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1194+17:43:05: WARNING: package://sr_hand/model/meshes/TH3_z.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1195+17:43:05: Can't assign material osg18mat0 to SubEntity of Robot Link46 because this Material does not exist. Have you forgotten to define it in a .material script?
1196+17:43:05: Texture: Robot Link Material023RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1197+17:43:05: Texture: Robot Link Material023RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1198+17:43:05: WARNING: package://sr_hand/model/meshes/wrist.mesh is an older format ([MeshSerializer_v1.40]); you should upgrade it as soon as possible using the OgreMeshUpgrade tool.
1199+17:43:05: Texture: Robot Link Material024RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1200+17:43:05: Texture: Robot Link Material024RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1201+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link50 because this Material does not exist. Have you forgotten to define it in a .material script?
1202+17:43:05: Texture: Robot Link Material025RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1203+17:43:05: Texture: Robot Link Material025RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1204+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link52 because this Material does not exist. Have you forgotten to define it in a .material script?
1205+17:43:05: Texture: Robot Link Material026RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1206+17:43:05: Texture: Robot Link Material026RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1207+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link54 because this Material does not exist. Have you forgotten to define it in a .material script?
1208+17:43:05: Texture: Robot Link Material027RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1209+17:43:05: Texture: Robot Link Material027RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1210+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link56 because this Material does not exist. Have you forgotten to define it in a .material script?
1211+17:43:05: Texture: Robot Link Material028RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1212+17:43:05: Texture: Robot Link Material028RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1213+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link58 because this Material does not exist. Have you forgotten to define it in a .material script?
1214+17:43:05: Texture: Robot Link Material029RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1215+17:43:05: Texture: Robot Link Material029RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1216+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link60 because this Material does not exist. Have you forgotten to define it in a .material script?
1217+17:43:05: Texture: Robot Link Material030RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1218+17:43:05: Texture: Robot Link Material030RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1219+17:43:05: Can't assign material Material.001 to SubEntity of Robot Link62 because this Material does not exist. Have you forgotten to define it in a .material script?
1220+17:43:05: Texture: Robot Link Material031RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1221+17:43:05: Texture: Robot Link Material031RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1222+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link64 because this Material does not exist. Have you forgotten to define it in a .material script?
1223+17:43:05: Texture: Robot Link Material032RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1224+17:43:05: Texture: Robot Link Material032RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1225+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link66 because this Material does not exist. Have you forgotten to define it in a .material script?
1226+17:43:05: Texture: Robot Link Material033RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1227+17:43:05: Texture: Robot Link Material033RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1228+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link68 because this Material does not exist. Have you forgotten to define it in a .material script?
1229+17:43:05: Texture: Robot Link Material034RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1230+17:43:05: Texture: Robot Link Material034RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1231+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link70 because this Material does not exist. Have you forgotten to define it in a .material script?
1232+17:43:05: Texture: Robot Link Material035RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1233+17:43:05: Texture: Robot Link Material035RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1234+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link72 because this Material does not exist. Have you forgotten to define it in a .material script?
1235+17:43:05: Texture: Robot Link Material036RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1236+17:43:05: Texture: Robot Link Material036RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1237+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link74 because this Material does not exist. Have you forgotten to define it in a .material script?
1238+17:43:05: Texture: Robot Link Material037RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1239+17:43:05: Texture: Robot Link Material037RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1240+17:43:05: Can't assign material Material.001 to SubEntity of Robot Link76 because this Material does not exist. Have you forgotten to define it in a .material script?
1241+17:43:05: Texture: Robot Link Material038RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1242+17:43:05: Texture: Robot Link Material038RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1243+17:43:05: Can't assign material osg13mat0 to SubEntity of Robot Link78 because this Material does not exist. Have you forgotten to define it in a .material script?
1244+17:43:05: Texture: Robot Link Material039RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1245+17:43:05: Texture: Robot Link Material039RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1246+17:43:05: Can't assign material osg2mat0 to SubEntity of Robot Link80 because this Material does not exist. Have you forgotten to define it in a .material script?
1247+17:43:05: Texture: Robot Link Material040RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1248+17:43:05: Texture: Robot Link Material040RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1249+17:43:05: Can't assign material osg16mat0 to SubEntity of Robot Link82 because this Material does not exist. Have you forgotten to define it in a .material script?
1250+17:43:05: Texture: Robot Link Material041RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1251+17:43:05: Texture: Robot Link Material041RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1252+17:43:05: Can't assign material osg11mat0 to SubEntity of Robot Link84 because this Material does not exist. Have you forgotten to define it in a .material script?
1253+17:43:05: Texture: Robot Link Material042RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1254+17:43:05: Texture: Robot Link Material042RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1255+17:43:05: Can't assign material Material.011 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1256+17:43:05: Can't assign material Material.010 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1257+17:43:05: Can't assign material Material.009 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1258+17:43:05: Can't assign material Material.008 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1259+17:43:05: Can't assign material Material.007 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1260+17:43:05: Can't assign material Material.006 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1261+17:43:05: Can't assign material Material.005 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1262+17:43:05: Can't assign material Material.004 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1263+17:43:05: Can't assign material Material.003 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1264+17:43:05: Can't assign material Material.002 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1265+17:43:05: Can't assign material Material.001 to SubEntity of Robot Link86 because this Material does not exist. Have you forgotten to define it in a .material script?
1266+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1267+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1268+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1269+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1270+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1271+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1272+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1273+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1274+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1275+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1276+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1277+17:43:05: Texture: Robot Link Material043RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1278+17:43:05: Texture: Robot Link Material044RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1279+17:43:05: Texture: Robot Link Material044RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1280+17:43:05: Can't assign material osg20mat0 to SubEntity of Robot Link90 because this Material does not exist. Have you forgotten to define it in a .material script?
1281+17:43:05: Texture: Robot Link Material045RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1282+17:43:05: Texture: Robot Link Material045RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1283+17:43:05: Texture: Robot Link Material046RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1284+17:43:05: Texture: Robot Link Material046RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1285+17:43:05: Can't assign material osg19mat0 to SubEntity of Robot Link94 because this Material does not exist. Have you forgotten to define it in a .material script?
1286+17:43:05: Texture: Robot Link Material047RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1287+17:43:05: Texture: Robot Link Material047RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1288+17:43:05: Can't assign material osg18mat0 to SubEntity of Robot Link96 because this Material does not exist. Have you forgotten to define it in a .material script?
1289+17:43:05: Texture: Robot Link Material048RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1290+17:43:05: Texture: Robot Link Material048RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1291+17:43:05: Texture: Robot Link Material049RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1292+17:43:05: Texture: Robot Link Material049RobotPickTexture: Loading 1 faces(PF_R8G8B8,1x1x1) with 0 generated mipmaps from Image. Internal format is PF_X8R8G8B8,1x1x1.
1293+17:43:16: Font Arialusing texture size 512x512
1294+17:43:16: Info: Freetype returned null for character 160 in font Arial
1295+17:43:16: Texture: ArialTexture: Loading 1 faces(PF_BYTE_LA,512x512x1) with 0 generated mipmaps from Image. Internal format is PF_BYTE_LA,512x512x1.
1296+17:43:16: OGRE EXCEPTION(7:InternalErrorException): Vertex Buffer: Out of memory in GLHardwareVertexBuffer::lock at /home/ugo/ros_latest/stacks/visualization_common/ogre/build/ogre_src_v1-7-1/RenderSystems/GL/src/OgreGLHardwareVertexBuffer.cpp (line 126)
1297
1298=== added directory 'shadow_robot/cyberglove/bin'
1299=== added directory 'shadow_robot/cyberglove/bin/test'
1300=== added file 'shadow_robot/cyberglove/cmake_install.cmake'
1301--- shadow_robot/cyberglove/cmake_install.cmake 1970-01-01 00:00:00 +0000
1302+++ shadow_robot/cyberglove/cmake_install.cmake 2010-11-03 16:17:45 +0000
1303@@ -0,0 +1,44 @@
1304+# Install script for directory: /home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove
1305+
1306+# Set the install prefix
1307+IF(NOT DEFINED CMAKE_INSTALL_PREFIX)
1308+ SET(CMAKE_INSTALL_PREFIX "/usr/local")
1309+ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX)
1310+STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
1311+
1312+# Set the install configuration name.
1313+IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
1314+ IF(BUILD_TYPE)
1315+ STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" ""
1316+ CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
1317+ ELSE(BUILD_TYPE)
1318+ SET(CMAKE_INSTALL_CONFIG_NAME "RelWithDebInfo")
1319+ ENDIF(BUILD_TYPE)
1320+ MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
1321+ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
1322+
1323+# Set the component getting installed.
1324+IF(NOT CMAKE_INSTALL_COMPONENT)
1325+ IF(COMPONENT)
1326+ MESSAGE(STATUS "Install component: \"${COMPONENT}\"")
1327+ SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}")
1328+ ELSE(COMPONENT)
1329+ SET(CMAKE_INSTALL_COMPONENT)
1330+ ENDIF(COMPONENT)
1331+ENDIF(NOT CMAKE_INSTALL_COMPONENT)
1332+
1333+# Install shared libraries without execute permission?
1334+IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
1335+ SET(CMAKE_INSTALL_SO_NO_EXE "1")
1336+ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE)
1337+
1338+IF(CMAKE_INSTALL_COMPONENT)
1339+ SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
1340+ELSE(CMAKE_INSTALL_COMPONENT)
1341+ SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt")
1342+ENDIF(CMAKE_INSTALL_COMPONENT)
1343+
1344+FILE(WRITE "/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove/${CMAKE_INSTALL_MANIFEST}" "")
1345+FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES})
1346+ FILE(APPEND "/home/ugo/Projects/ROS_interfaces/sr-ros-interface/trunk/shadow_robot/cyberglove/${CMAKE_INSTALL_MANIFEST}" "${file}\n")
1347+ENDFOREACH(file)
1348
1349=== added file 'shadow_robot/cyberglove/create_eclipse_project'
1350--- shadow_robot/cyberglove/create_eclipse_project 1970-01-01 00:00:00 +0000
1351+++ shadow_robot/cyberglove/create_eclipse_project 2010-11-03 16:17:45 +0000
1352@@ -0,0 +1,9 @@
1353+#!/bin/bash
1354+
1355+cd $(dirname $0)
1356+mv Makefile Makefile.ros
1357+cmake -G"Eclipse CDT4 - Unix Makefiles" -Wno-dev .
1358+rm Makefile
1359+rm CMakeCache.txt
1360+rm -rf CMakeFiles
1361+mv Makefile.ros Makefile
1362
1363=== added file 'shadow_robot/cyberglove/cyberglove.launch'
1364--- shadow_robot/cyberglove/cyberglove.launch 1970-01-01 00:00:00 +0000
1365+++ shadow_robot/cyberglove/cyberglove.launch 2010-11-03 16:17:45 +0000
1366@@ -0,0 +1,20 @@
1367+<launch>
1368+
1369+ <param name="robot_description" textfile="$(find
1370+ cyberglove)/model/cyberglove.xml"/>
1371+
1372+ <node pkg="cyberglove" name="cyberglove" type="cyberglove">
1373+ <param name="cyberglove_prefix" type="string" value="/cyberglove" />
1374+ <param name="publish_frequency" type="double" value="20.0" />
1375+ <param name="path_to_glove" type="string" value="/dev/ttyS0" />
1376+ <param name="path_to_calibration" type="string" value="$(find
1377+ sr_control_gui)/param/cyberglove.cal" />
1378+ </node>
1379+
1380+ <!-- Robot state publisher -->
1381+ <node pkg="robot_state_publisher" type="state_publisher"
1382+ name="robot_state_publisher">
1383+ <param name="publish_frequency" type="double" value="10.0" />
1384+ <param name="tf_prefix" type="string" value="" />
1385+ </node>
1386+</launch>
1387
1388=== added directory 'shadow_robot/cyberglove/include'
1389=== added directory 'shadow_robot/cyberglove/include/cyberglove'
1390=== added file 'shadow_robot/cyberglove/include/cyberglove/cyberglove_publisher.h'
1391--- shadow_robot/cyberglove/include/cyberglove/cyberglove_publisher.h 1970-01-01 00:00:00 +0000
1392+++ shadow_robot/cyberglove/include/cyberglove/cyberglove_publisher.h 2010-11-03 16:17:45 +0000
1393@@ -0,0 +1,71 @@
1394+/**
1395+ * @file cyberglove_publisher.h
1396+ * @author Ugo Cupcic <ugo@shadowrobot.com>, Contact <contact@shadowrobot.com>
1397+ * @date Thu Apr 22 10:25:55 2010
1398+ *
1399+ * @brief This class reads and publishes data concerning the
1400+ * cyberglove. To publish those data, just call the publish()
1401+ * function.
1402+ *
1403+ *
1404+ */
1405+
1406+#ifndef CYBERGLOVE_PUBLISHER_H_
1407+# define CYBERGLOVE_PUBLISHER_H_
1408+
1409+#include <ros/ros.h>
1410+#include <vector>
1411+
1412+//messages
1413+#include <sensor_msgs/JointState.h>
1414+#include "cyberglove/xml_calibration_parser.h"
1415+
1416+using namespace ros;
1417+
1418+namespace cyberglove_publisher{
1419+
1420+class CyberglovePublisher
1421+{
1422+ public:
1423+ /// Constructor
1424+ CyberglovePublisher();
1425+
1426+ /// Destructor
1427+ ~CyberglovePublisher();
1428+
1429+ Publisher cyberglove_pub;
1430+ void initialize_calibration(std::string path_to_calibration);
1431+ void publish();
1432+ bool isPublishing();
1433+ void setPublishing(bool value);
1434+ private:
1435+ /////////////////
1436+ // CALLBACKS //
1437+ /////////////////
1438+
1439+ //ros node handle
1440+ NodeHandle node, n_tilde;
1441+ Rate publish_rate;
1442+ std::string path_to_glove;
1443+ bool publishing;
1444+
1445+ ///the calibration parser
1446+ xml_calibration_parser::XmlCalibrationParser calibration_parser;
1447+
1448+ Publisher cyberglove_raw_pub;
1449+
1450+ sensor_msgs::JointState jointstate_msg;
1451+ sensor_msgs::JointState jointstate_raw_msg;
1452+
1453+ void add_jointstate(float position, std::string joint_name);
1454+
1455+ std::vector<float> calibration_values;
1456+
1457+ float* glovePositions;
1458+
1459+ bool checkGloveState();
1460+
1461+}; // end class CyberglovePublisher
1462+
1463+} // end namespace
1464+#endif /* !CYBERGLOVE_PUBLISHER_H_ */
1465
1466=== added file 'shadow_robot/cyberglove/include/cyberglove/cyberglove_service.h'
1467--- shadow_robot/cyberglove/include/cyberglove/cyberglove_service.h 1970-01-01 00:00:00 +0000
1468+++ shadow_robot/cyberglove/include/cyberglove/cyberglove_service.h 2010-11-03 16:17:45 +0000
1469@@ -0,0 +1,47 @@
1470+/**
1471+ * @file cyberglove_service.h
1472+ * @author Ugo Cupcic <ugo@shadowrobot.com>, Contact <contact@shadowrobot.com>
1473+ * @date Thu Apr 22 10:25:55 2010
1474+ *
1475+ * @brief A service which can stop / start the Cyberglove publisher.
1476+ *
1477+ *
1478+ */
1479+
1480+
1481+#ifndef CYBERGLOVE_SERVICE_H_
1482+# define CYBERGLOVE_SERVICE_H_
1483+
1484+#include <ros/ros.h>
1485+#include <vector>
1486+#include "cyberglove_publisher.h"
1487+#include "cyberglove/Start.h"
1488+#include "cyberglove/Calibration.h"
1489+#include <boost/smart_ptr.hpp>
1490+
1491+//messages
1492+
1493+using namespace ros;
1494+
1495+namespace cyberglove_service{
1496+
1497+ class CybergloveService
1498+ {
1499+ public:
1500+ /// Constructor
1501+ CybergloveService(boost::shared_ptr<cyberglove_publisher::CyberglovePublisher> publish);
1502+ ~CybergloveService(){};
1503+
1504+ //CybergloveService();
1505+ bool start(cyberglove::Start::Request &req, cyberglove::Start::Response &res);
1506+ bool calibration(cyberglove::Calibration::Request &req, cyberglove::Calibration::Response &res);
1507+ private:
1508+
1509+ NodeHandle node;
1510+ boost::shared_ptr<cyberglove_publisher::CyberglovePublisher> pub;
1511+ ros::ServiceServer service_start;
1512+ ros::ServiceServer service_calibration;
1513+ };
1514+
1515+}
1516+#endif
1517
1518=== added file 'shadow_robot/cyberglove/include/cyberglove/serial_glove.h'
1519--- shadow_robot/cyberglove/include/cyberglove/serial_glove.h 1970-01-01 00:00:00 +0000
1520+++ shadow_robot/cyberglove/include/cyberglove/serial_glove.h 2010-11-03 16:17:45 +0000
1521@@ -0,0 +1,48 @@
1522+/**
1523+ * @file serial_glove.h
1524+ * @author Ugo Cupcic <ugo@shadowrobot.com>
1525+ * @date Thu Apr 22 10:25:55 2010
1526+ *
1527+ * @brief The C interface to interact with the cyberglove.
1528+ *
1529+ *
1530+ */
1531+#ifdef __cplusplus
1532+extern "C" {
1533+#endif
1534+
1535+#ifndef SERIAL_GLOVE_H
1536+#define SERIAL_GLOVE_H
1537+
1538+
1539+ int setup_glove(const char* path_to_glove);
1540+ float* glove_get_values(void);
1541+ int read_button_value(void);
1542+
1543+
1544+#define PORT "3490" // use one port, client request or sends data depending on message
1545+#define GLOVE_SIZE 22 // number of sensors in the glove
1546+
1547+
1548+
1549+//! call the enum names directly as if they are #defines
1550+//! the message protocol headers, for passing or requesting data, or for issuing commands
1551+
1552+ typedef enum {
1553+ MSG_TEST_CONNECTION = 100,
1554+ MSG_UPDATE_SETPOINTS,
1555+ MSG_GET_POSITIONS,
1556+ MSG_RESTART_ROBOT,
1557+
1558+ MSG_DATA_READY = 200,
1559+ MSG_DATA_UNAVAILABLE
1560+ } msg_id_t;
1561+
1562+
1563+
1564+
1565+#endif
1566+
1567+#ifdef __cplusplus
1568+}
1569+#endif
1570
1571=== added file 'shadow_robot/cyberglove/include/cyberglove/xml_calibration_parser.h'
1572--- shadow_robot/cyberglove/include/cyberglove/xml_calibration_parser.h 1970-01-01 00:00:00 +0000
1573+++ shadow_robot/cyberglove/include/cyberglove/xml_calibration_parser.h 2010-11-03 16:17:45 +0000
1574@@ -0,0 +1,119 @@
1575+/**
1576+ * @file xml_calibration_parser.h
1577+ * @author Ugo Cupcic <ugo@shadowrobot.com>
1578+ * @date Tue Apr 27 11:30:41 2010
1579+ *
1580+ * @brief This is a simple xml parser, used to parse the calibration
1581+ * file for the cyberglove.
1582+ * A Calibration file must have this format:
1583+ * <Cyberglove_calibration>
1584+ * <Joint name="G_ThumbRotate">
1585+ * <calib raw_value="0.0" calibrated_value="-60"/>
1586+ * <calib raw_value="0.42" calibrated_value="100"/>
1587+ * </Joint>
1588+ * </Cyberglove_calibration>
1589+ *
1590+ * The calibration will be used by the glove node to stream coherent
1591+ * angles (and not an uncalibrated sensor value between 0 and 1).
1592+ *
1593+ *
1594+ */
1595+
1596+
1597+#ifndef XML_CALIBRATION_PARSER_H_
1598+# define XML_CALIBRATION_PARSER_H_
1599+
1600+//xml parser library
1601+#include <tinyxml/tinyxml.h>
1602+
1603+//generic C/C++ include
1604+#include <string>
1605+#include <vector>
1606+#include <map>
1607+
1608+namespace xml_calibration_parser{
1609+
1610+class XmlCalibrationParser
1611+{
1612+ public:
1613+ XmlCalibrationParser(){};
1614+ XmlCalibrationParser(std::string path_to_calibration);
1615+ ~XmlCalibrationParser(){};
1616+
1617+ float get_calibration_value(float position, std::string joint_name);
1618+
1619+ struct Calibration
1620+ {
1621+ float raw_value;
1622+ float calibrated_value;
1623+ };
1624+
1625+ struct JointCalibration
1626+ {
1627+ std::string name;
1628+ std::vector<Calibration> calibrations;
1629+ };
1630+
1631+
1632+ std::vector<JointCalibration> getJointsCalibrations();
1633+
1634+ protected:
1635+ void parse_calibration_file( TiXmlNode* pParent );
1636+ std::vector<Calibration> parse_joint_attributes( TiXmlNode* pParent );
1637+
1638+ /// The vector containing the calibration
1639+ std::vector<JointCalibration> jointsCalibrations;
1640+ // use a map to easily access the value
1641+ typedef std::map<std::string, std::vector<float> > mapType;
1642+ mapType joints_calibrations_map;
1643+
1644+ int build_calibration_table();
1645+
1646+ std::vector<float> calibration_to_lookup_table(std::vector<Calibration> calib);
1647+
1648+ float compute_lookup_value(int index, std::vector<Calibration> calib);
1649+
1650+ float linear_interpolate( float x ,
1651+ float x0, float y0,
1652+ float x1, float y1 );
1653+
1654+ // consts for the lookup tables
1655+ static const float lookup_precision;
1656+ static const float lookup_offset;
1657+
1658+ /**
1659+ * rounds the given number
1660+ *
1661+ * @param number a float
1662+ *
1663+ * @return the float rounded to the closest int
1664+ */
1665+ int round(float number);
1666+
1667+ /**
1668+ * inline function to convert a raw position to a valid index for
1669+ * our lookup table
1670+ *
1671+ * @param raw_position the raw position (directly read from the glove)
1672+ *
1673+ * @return the calibrated value
1674+ */
1675+ int return_index_from_raw_position(float raw_position);
1676+
1677+ /**
1678+ * inline function to convert an index of our lookup table to a raw
1679+ * position.
1680+ *
1681+ * @param lookup_index the index in the lookup table
1682+ *
1683+ * @return the corresponding raw position
1684+ */
1685+ static inline float return_raw_position_from_index(int lookup_index)
1686+ {
1687+ return ((float)lookup_index)/lookup_precision;
1688+ };
1689+
1690+}; // end class XmlCalibrationParser
1691+
1692+} // end namespace
1693+#endif /* !XML_CALIBRATION_PARSER_H_ */
1694
1695=== added file 'shadow_robot/cyberglove/mainpage.dox'
1696--- shadow_robot/cyberglove/mainpage.dox 1970-01-01 00:00:00 +0000
1697+++ shadow_robot/cyberglove/mainpage.dox 2010-11-03 16:17:45 +0000
1698@@ -0,0 +1,32 @@
1699+/**
1700+\mainpage
1701+\htmlinclude manifest.html
1702+
1703+\b cyberglove is a generic ROS interface to Immersion's Cyberglove dataglove.
1704+It reads the data from the Cyberglove, calibrate them using a calibration file and stream them to 2 different
1705+/joint_states topics: one for the raw data the other one for the calibrated data. There's a utility in sr_control_gui
1706+which can be used to generate a calibration file for a specific user in a few steps.
1707+
1708+If the button on the wrist is off, the glove won't publish any data.
1709+
1710+The calibration file can't be dynamically loaded for the time being, so if you \b change \b the \b calibration then
1711+don't forget to \b restart \b the \b cyberglove \b node.
1712+
1713+\section howtouse How To Use
1714+To run the cyberglove node, just run:
1715+\verbatim roslaunch cyberglove cyberglove.launch \endverbatim
1716+
1717+You can specify some parameters in the launch file:
1718+\li cyberglove_prefix The prefix to put in front of the joint_states published by the glove.
1719+\li publish_frequency The frequency at which you want to publish the data.
1720+\li path_to_glove The path to the port on which the Cyberglove is connected (usually /dev/ttyS0)
1721+\li path_to_calibration The path to the calibration file for the Cyberglove
1722+
1723+
1724+\section codeapi Code API
1725+\li serial_glove.h The C interface to interact with the cyberglove
1726+\li xml_calibration_parser::XmlCalibrationParser The calibration file parser.
1727+\li cyberglove_service::CybergloveService A service which can stop / start the Cyberglove publisher.
1728+\li cyberglove_publisher::CyberglovePublisher The actual publisher streaming the data from the cyberglove.
1729+
1730+*/
1731
1732=== added file 'shadow_robot/cyberglove/manifest.xml'
1733--- shadow_robot/cyberglove/manifest.xml 1970-01-01 00:00:00 +0000
1734+++ shadow_robot/cyberglove/manifest.xml 2010-11-03 16:17:45 +0000
1735@@ -0,0 +1,29 @@
1736+<package>
1737+ <description brief="Cyberglove ROS interface">
1738+
1739+ This is a generic ROS interface to the Cyberglove from Immersion. It reads data from the Cyberglove, calibrate them
1740+ and streams them to two different /joint_states topic: calibrated and raw data.
1741+
1742+ </description>
1743+ <author>Ugo Cupcic</author>
1744+ <license>GPL</license>
1745+ <review status="unreviewed" notes=""/>
1746+ <url>http://ros.org/wiki/cyberglove</url>
1747+ <depend package="roslib"/>
1748+ <depend package="rospy"/>
1749+ <depend package="roscpp"/>
1750+ <depend package="std_msgs"/>
1751+ <depend package="sensor_msgs"/>
1752+ <depend package="diagnostic_msgs"/>
1753+ <depend package="tinyxml"/>
1754+
1755+
1756+ <export>
1757+ <cpp cflags="-I${prefix}/include/"/>
1758+ <python path="${prefix}/python_lib"/>
1759+ <python path="${prefix}/src"/>
1760+ </export>
1761+
1762+</package>
1763+
1764+
1765
1766=== added directory 'shadow_robot/cyberglove/model'
1767=== added file 'shadow_robot/cyberglove/model/cyberglove.xml'
1768--- shadow_robot/cyberglove/model/cyberglove.xml 1970-01-01 00:00:00 +0000
1769+++ shadow_robot/cyberglove/model/cyberglove.xml 2010-11-03 16:17:45 +0000
1770@@ -0,0 +1,129 @@
1771+<robot name="cyberglove">
1772+ <link name="cyberglove_forearm">
1773+ <inertial>
1774+ <mass value="3.0" />
1775+ <origin xyz="0 0 0.090" />
1776+ <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="100.0" iyz="0.0" izz="1.0" />
1777+ </inertial>
1778+ <visual>
1779+ <origin xyz="0 0 0" rpy="0 0 0" />
1780+ <geometry name="cyberglove_forearm_geom">
1781+ <cylinder radius="0.06" length="0.180"/>
1782+ </geometry>
1783+ </visual>
1784+ <collision>
1785+ <origin xyz="0 0 0" rpy="0 0 0" />
1786+ <geometry name="cyberglove_forearm_collision">
1787+ <cylinder radius="0.06" length="0.180"/>
1788+ </geometry>
1789+ <origin xyz="1 0 0" rpy="0 0 0 " />
1790+ <geometry name="cyberglove_forearm_collision_geom">
1791+ <box size="0.05 0.05 0.10" />
1792+ </geometry>
1793+ </collision>
1794+ </link>
1795+
1796+ <!-- FIRST FINGER-->
1797+
1798+ <link name="ffproximal">
1799+ <inertial>
1800+ <mass value="0.008" />
1801+ <origin xyz="0 0.010 0.233" />
1802+ <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="100.0" iyz="0.0"
1803+ izz="1.0" />
1804+ </inertial>
1805+ <visual>
1806+ <origin xyz="0 0 0.0225" rpy="0 0 0" />
1807+ <geometry name="ffproximal_geom">
1808+ <cylinder radius="0.005" length="0.045"/>
1809+ </geometry>
1810+ </visual>
1811+ <collision>
1812+ <origin xyz="0 0 0" rpy="0 0 0 " />
1813+ <geometry name="ffproximal_collision_geom">
1814+ <box size="0.05 0.05 0.10" />
1815+ </geometry>
1816+ </collision>
1817+ </link>
1818+
1819+ <link name="ffmiddle">
1820+ <inertial>
1821+ <origin xyz="0 0 0.045" rpy="0 0 0" />
1822+ <mass value="0.008" />
1823+ <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="100.0" iyz="0.0"
1824+ izz="1.0" />
1825+ </inertial>
1826+ <visual>
1827+ <origin xyz="0 0 0.0125" rpy="0 0 0" />
1828+ <geometry name="ffmiddle_geom">
1829+ <cylinder radius="0.005" length="0.025"/>
1830+ </geometry>
1831+ </visual>
1832+ <collision>
1833+ <origin xyz="0 0 0" rpy="0 0 0" />
1834+ <geometry name="ffmiddle_collision_geom">
1835+ <box size="0.05 0.05 0.10" />
1836+ </geometry>
1837+ </collision>
1838+ </link>
1839+
1840+ <link name="ffdistal">
1841+ <inertial>
1842+ <mass value="0.008" />
1843+ <origin xyz="0 0 0.025" />
1844+ <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="100.0" iyz="0.0"
1845+ izz="1.0" />
1846+ </inertial>
1847+ <visual>
1848+ <origin xyz="0 0 0.013" rpy="0 0 0" />
1849+ <geometry name="ffdistal_geom">
1850+ <cylinder radius="0.005" length="0.026"/>
1851+ </geometry>
1852+ </visual>
1853+ <collision>
1854+ <origin xyz="0 0 0" rpy="0 0 0 " />
1855+ <geometry name="ffdistal_collision_geom">
1856+ <box size="0.05 0.05 0.10" />
1857+ </geometry>
1858+ </collision>
1859+ </link>
1860+
1861+ <!--------------------------------
1862+| JOINTS |
1863+ --------------------------------->
1864+<!--
1865+ <joint name="attachment" type="continuous">
1866+ <parent link="world"/>
1867+ <child link="cyberglove_forearm"/>
1868+ <origin xyz="5 0 0" rpy="0 0 3.14" />
1869+ <axis xyz="0 1 0" />
1870+ </joint>
1871+ -->
1872+ <joint name="G_IndexPIJ" type="revolute">
1873+ <parent link="cyberglove_forearm"/>
1874+ <child link="ffproximal"/>
1875+ <origin xyz="0 0.010 0.233" rpy="0 0 0" />
1876+ <axis xyz="0 0 1" />
1877+ <limit lower="0" upper="1.5707963267948966"
1878+ effort="10" velocity="1.0"/>
1879+ </joint>
1880+
1881+ <joint name="G_IndexMPJ" type="revolute">
1882+ <parent link="ffproximal"/>
1883+ <child link="ffmiddle"/>
1884+ <origin xyz="0 0 0.045" rpy="0 0 0" />
1885+ <axis xyz="1 0 0" />
1886+ <limit lower="0" upper="1.5707963267948966" effort="10"
1887+ velocity="1.0"/>
1888+ </joint>
1889+
1890+ <joint name="G_IndexDIJ" type="revolute">
1891+ <parent link="ffmiddle"/>
1892+ <child link="ffdistal"/>
1893+ <origin xyz="0 0 0.025" rpy="0 0 0" />
1894+ <axis xyz="1 0 0" />
1895+ <limit lower="0" upper="1.5707963267948966" effort="10"
1896+ velocity="1.0"/>
1897+ </joint>
1898+
1899+</robot>
1900
1901=== added directory 'shadow_robot/cyberglove/python_lib'
1902=== added file 'shadow_robot/cyberglove/python_lib/cyberglove_calibrer.py'
1903--- shadow_robot/cyberglove/python_lib/cyberglove_calibrer.py 1970-01-01 00:00:00 +0000
1904+++ shadow_robot/cyberglove/python_lib/cyberglove_calibrer.py 2010-11-03 16:17:45 +0000
1905@@ -0,0 +1,317 @@
1906+#!/usr/bin/env python
1907+"""
1908+Calibration utility for the cyberglove.
1909+
1910+@author: Ugo Cupcic
1911+@contact: ugo@shadowrobot.com, contact@shadowrobot.com
1912+"""
1913+import roslib; roslib.load_manifest('sr_control_gui')
1914+
1915+import os
1916+from cyberglove_library import Cyberglove
1917+from cyberglove.srv import Calibration as CalibrationSrv
1918+
1919+import rospy
1920+
1921+class Joint:
1922+ """
1923+ A class containing simple information regarding a joint: name, and calibrated value
1924+ """
1925+ def __init__(self, name, min=0, max = 90):
1926+ """
1927+ @param name: the name of the joint
1928+ @param min: the min value to calibrate
1929+ @param max: the max value to calibrate
1930+ """
1931+ self.name = name
1932+ self.min = min
1933+ self.max = max
1934+
1935+
1936+class CalibrationStep:
1937+ """
1938+ A class containing all the data for a given calibration step
1939+ """
1940+ def __init__(self, step_name="", step_description = [""], joints = []):
1941+ """
1942+ @param step_name: A short name for this calibration step
1943+ @param step_description: A table containing 2 descriptions: the first one describes the min pose, the second
1944+ the max
1945+ @param joints: A table containing the joints to be calibrated
1946+
1947+ """
1948+ self.step_name = step_name
1949+ self.step_description = step_description
1950+ self.joints = joints
1951+
1952+class Calibration:
1953+ """
1954+ A class Containing all the calibration data for a given joint.
1955+ """
1956+ def __init__(self, raw_min = 0.0, raw_max= 0.0,
1957+ calibrated_min = 0.0, calibrated_max= 0.0,
1958+ is_calibrated = 0):
1959+ self.raw_min = raw_min
1960+ self.raw_max = raw_max
1961+ self.calibrated_min = calibrated_min
1962+ self.calibrated_max = calibrated_max
1963+ self.is_calibrated = is_calibrated
1964+
1965+def default_description(step_name, max = 0):
1966+ """
1967+ The default description function for a step. Just prints a text for each step.
1968+
1969+ @param step_name: the name of the step
1970+ @param max: if 0=>we're reading the min values, if 1=> max values
1971+ """
1972+ if max == 0:
1973+ print "calibrating min values for: "+ str(step_name)
1974+ else:
1975+ print "calibrating max values for: "+ str(step_name)
1976+
1977+def do_nothing(step_name, max = 0):
1978+ """
1979+ A function that does nothing. Used to have an empty description function.
1980+ """
1981+ nothing = True
1982+
1983+class CybergloveCalibrer:
1984+ """
1985+ A utility to calibrate the cyberglove.
1986+ """
1987+ def __init__(self, description_function = default_description):
1988+ """
1989+ Initialize some class variables: a table containing the calibration steps, a connection to the cyberglove
1990+ library and a description function for the calibration steps
1991+
1992+ @param description_function: specify a function you want to use to describe the calibration steps ( text /
1993+ pictures / animation / ... ). Must take a joint name as parameter.
1994+ """
1995+ self.calibration_steps = []
1996+
1997+ self.cyberglove = Cyberglove()
1998+
1999+ # fill the table containing all the joints
2000+ self.joints = {}
2001+ for name in self.cyberglove.get_joints_names():
2002+ self.joints[name] = Calibration()
2003+
2004+ self.get_calibration_steps()
2005+
2006+ if description_function == None:
2007+ description_function = do_nothing
2008+ self.description_function = description_function
2009+
2010+ def get_calibration_steps(self):
2011+ """
2012+ Read the calibration steps from the xml file.
2013+
2014+ @return: 0 when the values were read.
2015+ """
2016+
2017+ #first step: calibrate 0s, 3s and TH4
2018+ joints1 = [Joint("G_IndexMPJ", 0, 90), Joint("G_IndexPIJ", 0, 90), Joint("G_IndexDIJ", 0, 90),
2019+ Joint("G_MiddleMPJ", 0, 90), Joint("G_MiddlePIJ", 0, 90), Joint("G_MiddleDIJ", 0, 90),
2020+ Joint("G_RingMPJ", 0, 90), Joint("G_RingPIJ", 0, 90), Joint("G_RingDIJ", 0, 90),
2021+ Joint("G_PinkieMPJ", 0, 90), Joint("G_PinkiePIJ", 0, 90), Joint("G_PinkieDIJ", 0, 90),
2022+ Joint("G_ThumbAb", 50, 0) ]
2023+ self.calibration_steps.append(CalibrationStep(step_name="Joints 0s, 3s and thumb abduction (THJ4)",
2024+ step_description = ["Hand flat on a table, fingers joined, thumb opened",
2025+ "Hand forming a fist, thumb closed"],
2026+ joints = joints1 ))
2027+
2028+ #second step: calibrate 4s, TH1, TH2, TH5 and WR2
2029+ joints2 = [Joint("G_ThumbIJ", 90, 0), Joint("G_ThumbMPJ", 30, -30),
2030+ Joint("G_MiddleIndexAb", 0, 50), Joint("G_RingMiddleAb", 0, 50), Joint("G_PinkieRingAb", 0, 50),
2031+ Joint("G_WristYaw", 10, -30)]
2032+ self.calibration_steps.append(CalibrationStep(step_name="Joints 4s + TH1, 2, and WR2",
2033+ step_description = ["Hand flat fingers joined, thumb completely curled under the palm, wrist 2 bent to the left",
2034+ "Hand flat fingers apart, thumb completely opened, wrist bent 2 to the right"],
2035+ joints = joints2 ))
2036+
2037+ #third step: calibrate TH5
2038+ joints3 = [Joint("G_ThumbRotate", 60, -60)]
2039+ self.calibration_steps.append(CalibrationStep(step_name="Joint TH5",
2040+ step_description = ["thumb completely under the palm",
2041+ "thumb completely opened, curled over the palm"],
2042+ joints = joints3 ))
2043+
2044+ #fourth step: calibrate LF5 and WR1
2045+ joints4 = [Joint("G_PalmArch", 0, 40), Joint("G_WristPitch", -30, 40)]
2046+ self.calibration_steps.append(CalibrationStep(step_name="LF5 and WR1",
2047+ step_description = ["Hand flat, wrist 1 bent backward",
2048+ "Palm curled (LFJ5), wrist 1 bent forward"],
2049+ joints = joints4 ))
2050+
2051+ return 0
2052+
2053+ def do_step_min(self, index):
2054+ """
2055+ Run the given step of the calibration, gets the min values.
2056+
2057+ @param index: the index of the step in the calibration file
2058+ @return: 0 when the values were read.
2059+ """
2060+ joints = self.calibration_steps[index].joints
2061+ # display the description
2062+ self.description_function(self.calibration_steps[index].step_description[0], 0)
2063+
2064+ for joint in joints:
2065+ name = joint.name
2066+ #read the min values
2067+ self.joints[name].raw_min = self.cyberglove.read_raw_average_value(name)
2068+ self.joints[name].calibrated_min = joint.min
2069+ #still needs to read the max before fully calibrated
2070+ self.joints[name].is_calibrated += 0.5
2071+ return 0
2072+
2073+ def do_step_max(self, index):
2074+ """
2075+ Run the given step of the calibration, gets the max values.
2076+ As this method is called after the do_step_min() method, we don't display the description
2077+
2078+ @param index: the index of the step in the calibration file
2079+ @return: 0 when the values were read.
2080+ """
2081+ joints = self.calibration_steps[index].joints
2082+ # display the description
2083+ self.description_function(self.calibration_steps[index].step_description[1], 0)
2084+
2085+ for joint in joints:
2086+ name = joint.name
2087+ #read the max values
2088+ self.joints[name].raw_max = self.cyberglove.read_raw_average_value(name)
2089+ self.joints[name].calibrated_max = joint.max
2090+ #still needs to read the max before fully calibrated
2091+ self.joints[name].is_calibrated += 0.5
2092+ return 0
2093+
2094+ def is_step_done(self, joint_name):
2095+ """
2096+ Check if the joint is calibrated.
2097+
2098+ @param joint_name: the name of the joint
2099+ @return: 1 if the joint has already been calibrated.
2100+ """
2101+
2102+ return self.joints[joint_name].is_calibrated
2103+
2104+ def all_steps_done(self):
2105+ """
2106+ Check if all the steps were processed.
2107+
2108+ @return: True if all the steps were processed.
2109+ """
2110+ for calib in self.joints.values():
2111+ if calib.is_calibrated != 1:
2112+ return False
2113+
2114+ return True
2115+
2116+ def reorder_calibration(self):
2117+ """
2118+ Reorder the calibration: set the raw_min to the min raw_value
2119+ """
2120+ for name in self.joints.keys():
2121+ if self.joints[name].raw_min > self.joints[name].raw_max:
2122+ tmp_raw = self.joints[name].raw_min
2123+ tmp_cal = self.joints[name].calibrated_min
2124+ self.joints[name].raw_min = self.joints[name].raw_max
2125+ self.joints[name].calibrated_min = self.joints[name].calibrated_max
2126+ self.joints[name].raw_max = tmp_raw
2127+ self.joints[name].calibrated_max = tmp_cal
2128+
2129+ def write_calibration_file(self, filepath):
2130+ """
2131+ Checks if all the steps were processed by calling self.all_steps_done()
2132+ Reorder the calibration
2133+ Then writes the whole calibration to a given file.
2134+
2135+ @param filepath: Where to write the calibration
2136+ @return: 0 if the file has been written,
2137+ -1 if the calibration is not finished yet,
2138+ -2 if other error
2139+ """
2140+
2141+ #Where all the steps processed?
2142+ if not self.all_steps_done():
2143+ return -1
2144+
2145+ #reorder the calibration
2146+ self.reorder_calibration()
2147+
2148+ ###############
2149+ # Write to an xml file
2150+ ###############
2151+ #store the text in a table
2152+ text = []
2153+
2154+ text.append("<?xml version=\"1.0\" ?>")
2155+ text.append("<Cyberglove_calibration>")
2156+ for name in self.joints:
2157+ #joint name
2158+ text.append("<Joint name=\""+name+"\">")
2159+
2160+ cal = self.joints[name]
2161+ #min value
2162+ text.append("<calib raw_value=\""+str(cal.raw_min)
2163+ +"\" calibrated_value=\""
2164+ +str(cal.calibrated_min)+"\"/>")
2165+
2166+ #max value
2167+ text.append("<calib raw_value=\""+str(cal.raw_max)
2168+ +"\" calibrated_value=\""
2169+ +str(cal.calibrated_max)+"\"/>")
2170+
2171+ text.append("</Joint>")
2172+
2173+ text.append("</Cyberglove_calibration>")
2174+
2175+ #write the text to a file
2176+ try:
2177+ output = open(filepath, "w")
2178+ for line in text:
2179+ output.write(line+"\n")
2180+
2181+ output.close()
2182+ except:
2183+ return -2
2184+
2185+ return 0
2186+
2187+ def load_calib(self, filename):
2188+ if filename == "":
2189+ return -1
2190+
2191+ rospy.wait_for_service('/cyberglove/calibration')
2192+ try:
2193+ calib = rospy.ServiceProxy('cyberglove/calibration', CalibrationSrv)
2194+ path = filename.encode("iso-8859-1")
2195+ resp = calib(path)
2196+ return resp.state
2197+ except rospy.ServiceException, e:
2198+ print 'Failed to call start service'
2199+ return -2
2200+
2201+
2202+
2203+##############
2204+# MAIN #
2205+##############
2206+def main():
2207+ cyber_calib = CybergloveCalibrer()
2208+ for i in range(0, len(cyber_calib.calibration_steps)):
2209+ raw_input(cyber_calib.calibration_steps[i].step_description[0])
2210+ cyber_calib.do_step_min(i)
2211+ raw_input(cyber_calib.calibration_steps[i].step_description[1])
2212+
2213+ cyber_calib.do_step_max(i)
2214+ error = cyber_calib.write_calibration_file("../../param/cyberglove.cal")
2215+ print error
2216+
2217+ return 0
2218+
2219+
2220+# start the script
2221+if __name__ == "__main__":
2222+ main()
2223
2224=== added file 'shadow_robot/cyberglove/python_lib/cyberglove_library.py'
2225--- shadow_robot/cyberglove/python_lib/cyberglove_library.py 1970-01-01 00:00:00 +0000
2226+++ shadow_robot/cyberglove/python_lib/cyberglove_library.py 2010-11-03 16:17:45 +0000
2227@@ -0,0 +1,152 @@
2228+import roslib; roslib.load_manifest('sr_control_gui')
2229+import time
2230+import os
2231+import math
2232+import rospy
2233+import subprocess
2234+import threading
2235+import rosgraph.masterapi
2236+from sr_hand.msg import sendupdate, joint, joints_data
2237+from sensor_msgs.msg import *
2238+
2239+class Joint():
2240+ def __init__(self, name="", motor="", min=0, max=90):
2241+ self.name = name
2242+ self.motor = motor
2243+ self.min = min
2244+ self.max = max
2245+
2246+class Cyberglove:
2247+ """
2248+ Interface to the Cyberglove publisher.
2249+ """
2250+ def __init__(self, max_values = 2):
2251+ self.joints = { "G_ThumbRotate": Joint(),
2252+ "G_ThumbMPJ": Joint(),
2253+ "G_ThumbIJ": Joint(),
2254+ "G_ThumbAb": Joint(),
2255+ "G_IndexMPJ": Joint(),
2256+ "G_IndexPIJ": Joint(),
2257+ "G_IndexDIJ": Joint(),
2258+ "G_MiddleMPJ": Joint(),
2259+ "G_MiddlePIJ": Joint(),
2260+ "G_MiddleDIJ": Joint(),
2261+ "G_MiddleIndexAb": Joint(),
2262+ "G_RingMPJ": Joint(),
2263+ "G_RingPIJ": Joint(),
2264+ "G_RingDIJ": Joint(),
2265+ "G_RingMiddleAb": Joint(),
2266+ "G_PinkieMPJ": Joint(),
2267+ "G_PinkiePIJ": Joint(),
2268+ "G_PinkieDIJ": Joint(),
2269+ "G_PinkieRingAb": Joint(),
2270+ "G_PalmArch": Joint(),
2271+ "G_WristPitch": Joint(),
2272+ "G_WristYaw": Joint() }
2273+
2274+ self.raw_messages = []
2275+ self.calibrated_messages = []
2276+ self.max_values = max_values
2277+ self.map = {}
2278+ self.hasglove = 0
2279+ self.isFirstMessage = True
2280+ self.liste = 0
2281+ self.raw = rospy.Subscriber('/cyberglove/raw/joint_states',JointState,self.callback_raw)
2282+ self.calibrated = rospy.Subscriber('/cyberglove/calibrated/joint_states',JointState,self.callback_calibrated)
2283+ threading.Thread(None, rospy.spin)
2284+ if self.has_glove():
2285+ time.sleep(1.0)
2286+ self.createMap()
2287+ else:
2288+ raise Exception("No glove found")
2289+
2290+ def callback_raw(self, data):
2291+ """
2292+ Adds the last values received to the list of raw values
2293+ @param data: the message which called the callback
2294+ """
2295+ self.addValue(self.raw_messages, data)
2296+
2297+ def callback_calibrated(self, data):
2298+ """
2299+ Adds the last values received to the list of calibrated values
2300+ @param data: the message which called the callback
2301+ """
2302+ self.addValue(self.calibrated_messages, data)
2303+
2304+ def addValue(self, vector, value):
2305+ """
2306+ Fills a vector with the received values, and replaces the old values
2307+ when the vector is full
2308+ @param vector : the vector to fill (raw or calibrated)
2309+ @param value : the value to add
2310+ """
2311+ if len(vector) < self.max_values:
2312+ vector.append(value)
2313+ else:
2314+ vector.pop(0)
2315+ vector.append(value)
2316+
2317+ def createMap(self):
2318+ """
2319+ Maps the name of the joints to their index in the message
2320+ """
2321+ for index in range(0, len(self.raw_messages[0].name)):
2322+ self.map[self.raw_messages[0].name[index]] = index
2323+
2324+ def read_raw_average_value(self, joint_name):
2325+ """
2326+ return the raw value of a given joint
2327+
2328+ @param joint_name: the name of the glove of the Cyberglove
2329+ """
2330+ raw_value = 0
2331+ joint_index = self.map[joint_name]
2332+ for index in range(0, len(self.raw_messages)):
2333+ raw_value = raw_value + self.raw_messages[index].position[joint_index]
2334+
2335+ raw_value = raw_value / len(self.raw_messages)
2336+
2337+ return raw_value
2338+
2339+ def read_calibrated_average_value(self, joint_name):
2340+ """
2341+ return the current positions for the given joint_name
2342+
2343+ @param joint_name: the name of the joint
2344+ @return: the corresponding position
2345+ """
2346+
2347+ calibrated_value = 0
2348+
2349+ joint_index = self.map[joint_name]
2350+ for index in range(0, len(self.calibrated_messages)):
2351+ calibrated_value = calibrated_value + self.calibrated_messages[index].position[joint_index]
2352+
2353+ calibrated_value = calibrated_value / len(self.calibrated_messages)
2354+
2355+ return calibrated_value
2356+
2357+ def get_joints_names(self):
2358+ """
2359+ Return an array containing the Cyberglove joints names
2360+
2361+ @return: the joints names array
2362+ """
2363+ return self.joints.keys()
2364+
2365+ def has_glove(self):
2366+ """
2367+ @return: True if a cyberglove is detected by ROS
2368+ """
2369+ if not self.hasglove == 0:
2370+ return self.hasglove
2371+ self.hasglove = False
2372+ if self.liste == 0:
2373+ master = rosgraph.masterapi.Master('/rostopic')
2374+ self.liste = master.getPublishedTopics('/')
2375+ for topic_typ in self.liste :
2376+ for topic in topic_typ:
2377+ if '/cyberglove' in topic :
2378+ self.hasglove = True
2379+ return self.hasglove
2380
2381=== added file 'shadow_robot/cyberglove/python_lib/cyberglove_mapper.py'
2382--- shadow_robot/cyberglove/python_lib/cyberglove_mapper.py 1970-01-01 00:00:00 +0000
2383+++ shadow_robot/cyberglove/python_lib/cyberglove_mapper.py 2010-11-03 16:17:45 +0000
2384@@ -0,0 +1,355 @@
2385+#!/usr/bin/env python
2386+"""
2387+Minimizes the mapping matrix using a simplex algorithm
2388+
2389+@author: Ugo Cupcic
2390+@contact: ugo@shadowrobot.com, contact@shadowrobot.com
2391+"""
2392+
2393+import roslib; roslib.load_manifest('sr_control_gui')
2394+import rospy
2395+from scipy.optimize import fmin
2396+from cyberglove_library import Cyberglove
2397+
2398+class MappingConfiguration:
2399+ def __init__(self, glove_data = [], hand_data = [], description = ""):
2400+ self.glove_data = glove_data
2401+ self.hand_data = hand_data
2402+ self.description = description
2403+
2404+ def copy(self):
2405+ tmp = MappingConfiguration(self.glove_data, self.hand_data, self.description)
2406+ return tmp
2407+
2408+class MappingMinimizer:
2409+ def __init__(self, verbose = 1):
2410+ rospy.init_node("cyberglove_mapper_minimizer")
2411+ #connect to the cyberglove
2412+ self.cyberglove = Cyberglove()
2413+
2414+ self.verbose = verbose
2415+
2416+ glove_sensors = ["G_ThumbRotate", "G_ThumbMPJ", "G_ThumbIJ", "G_ThumbAb", "G_IndexMPJ", "G_IndexPIJ",
2417+ "G_IndexDIJ", "G_MiddleMPJ", "G_MiddlePIJ", "G_MiddleDIJ", "G_MiddleIndexAb", "G_RingMPJ",
2418+ "G_RingPIJ", "G_RingDIJ", "G_RingMiddleAb", "G_PinkieMPJ", "G_PinkiePIJ", "G_PinkieDIJ",
2419+ "G_PinkieRingAb", "G_PalmArch", "G_WristPitch", "G_WristYaw"]
2420+
2421+ index = 0
2422+ self.glove_name_index_map = {}
2423+ for sensor in glove_sensors:
2424+ self.glove_name_index_map[sensor] = index
2425+ index += 1
2426+
2427+ # fill the table containing all the joints
2428+ hand_joints = ["TH1","TH2","TH3","TH4","TH5","FF0","FF3","FF4","MF0","MF3","MF4","RF0","RF3","RF4","LF0",
2429+ "LF3","LF4","LF5","WR1","WR2"]
2430+
2431+ index = 0
2432+ self.hand_name_index_map = {}
2433+ for sensor in hand_joints:
2434+ self.hand_name_index_map[sensor] = index
2435+ index += 1
2436+
2437+ self.thumb_glove = { "G_ThumbRotate": 0,
2438+ "G_ThumbMPJ": 1,
2439+ "G_ThumbAb": 2 }
2440+
2441+ self.thumb_hand = { "TH2": 0,
2442+ "TH4": 1,
2443+ "TH5": 2 }
2444+
2445+ self.configurations = []
2446+ self.initialise_configurations()
2447+
2448+ self.simplex_iteration_index = 0
2449+
2450+ if(self.verbose == 1):
2451+ for conf in self.configurations:
2452+ print "-------"
2453+ print conf.description
2454+ print conf.glove_data
2455+ print conf.hand_data
2456+ print "-------"
2457+ print ""
2458+
2459+ self.minerror = 1000000
2460+ self.maxerror = 0
2461+
2462+ def initialise_configurations(self):
2463+ configuration = MappingConfiguration()
2464+
2465+ ###
2466+ # First configuration
2467+ configuration.description = "All fingers and thumb are curved maximum in a punch form ... "
2468+ configuration.glove_data = []
2469+ #corresponding data for the hand
2470+ configuration.hand_data = [[30.0, 52.0, 5.0],
2471+ [30.0, 43.0, 0.0],
2472+ [30.0, 68.0, 16.0]
2473+ ]
2474+
2475+ self.configurations.append(configuration.copy())
2476+
2477+ ###
2478+ # Second configuration
2479+ configuration.description = "Thumb touching first finger tip ... "
2480+ configuration.glove_data = []
2481+ #corresponding data for the hand
2482+ configuration.hand_data = [[30.0, 54.0, -5.0],
2483+ [19.0, 58.0, 28.0]]
2484+
2485+ self.configurations.append(configuration.copy())
2486+
2487+ ###
2488+ # Third configuration
2489+ configuration.description = "Thumb touching middle finger tip ... "
2490+ configuration.glove_data = []
2491+ #corresponding data for the hand
2492+ configuration.hand_data = [[30.0, 64.0, 9.0],
2493+ [1.0, 68.0, 29.0]]
2494+
2495+ self.configurations.append(configuration.copy())
2496+
2497+ ###
2498+ # Fourth configuration
2499+ configuration.description = "Thumb touching ring finger tip ... "
2500+ configuration.glove_data = []
2501+ #corresponding data for the hand
2502+ configuration.hand_data = [[30.0, 75.0, 19.0],
2503+ [1.0, 75.0, 42.0]]
2504+
2505+ self.configurations.append(configuration.copy())
2506+
2507+ ###
2508+ # Fifth configuration
2509+ configuration.description = "Thumb touching little finger tip ... "
2510+ configuration.glove_data = []
2511+ #corresponding data for the hand
2512+ configuration.hand_data = [[30.0, 75.0, 3.0],
2513+ [1.0, 75.0, 35.0]]
2514+
2515+ self.configurations.append(configuration.copy())
2516+
2517+ ###
2518+ # Sixth configuration
2519+ configuration.description = "Thumb touching all the finger tips ... "
2520+ configuration.glove_data = []
2521+ #corresponding data for the hand
2522+ configuration.hand_data = [[-30.0, 75.0, 60.0],
2523+ [-7.0, 63.0, 60.0]]
2524+
2525+ self.configurations.append(configuration.copy())
2526+
2527+ ###
2528+ # Seventh configuration
2529+ configuration.description = "hand flat, thumb relaxed along the fingers "
2530+ configuration.glove_data = []
2531+ #corresponding data for the hand
2532+ configuration.hand_data = [[0.0, 0.0, -60.0]]
2533+
2534+ self.configurations.append(configuration.copy())
2535+
2536+ ###
2537+ # Eigth configuration
2538+ configuration.description = "hand flat, thumb opened "
2539+ configuration.glove_data = []
2540+ #corresponding data for the hand
2541+ configuration.hand_data = [[0.0, 75.0, -60.0]]
2542+
2543+ self.configurations.append(configuration.copy())
2544+
2545+ def evaluation_function(self, matrix):
2546+ """
2547+ The error is computed by adding the square error for each configuration.
2548+ """
2549+ error = 0
2550+
2551+ #rebuild the matrix as a matrix, not a vector (the implementation of the simplex in scipy works on vectors
2552+ matrix_tmp = []
2553+ for i in range(len(self.thumb_glove)):
2554+ line = []
2555+ for j in range(len(self.thumb_hand)):
2556+ line.append(matrix[i*len(self.thumb_hand)+j])
2557+ matrix_tmp.append(line)
2558+
2559+ matrix = matrix_tmp
2560+ computed_vector_hand = []
2561+
2562+ for config in self.configurations:
2563+ #get the hand vectors from the glove data
2564+ for vec_glove in config.glove_data:
2565+ computed_vector_hand.append(self.multiply(vec_glove, matrix))
2566+
2567+ #compute the square error
2568+ for vec_comp, vec_hand in zip(computed_vector_hand, config.hand_data):
2569+ for computed_hand_data in vec_comp:
2570+ for hand_data in vec_hand:
2571+ error += (computed_hand_data-hand_data)*(computed_hand_data-hand_data)
2572+
2573+ if self.verbose == 1:
2574+ print "error: "+str(error)
2575+
2576+ if error < self.minerror:
2577+ self.minerror = error
2578+
2579+ if error > self.maxerror:
2580+ self.maxerror = error
2581+
2582+ return error
2583+
2584+ def multiply(self, vector_glove, matrix):
2585+ """
2586+ multiply the vector by the matrix. Returns a vector.
2587+ """
2588+ vector_hand = []
2589+ index_col = 0
2590+ print vector_glove
2591+ print matrix
2592+ for glove_data in vector_glove:
2593+ data = 0
2594+ for line in matrix:
2595+ data += (glove_data*line[index_col])
2596+ vector_hand.append(data)
2597+ index_col += 1
2598+
2599+ return vector_hand
2600+
2601+ def callback(self, xk):
2602+ """
2603+ Function called at each iteration
2604+ """
2605+ self.simplex_iteration_index += 1
2606+ if self.simplex_iteration_index % 50 == 0:
2607+ print "-------------------------"
2608+ print "iteration number: "+ str(self.simplex_iteration_index)
2609+ #print xk
2610+
2611+ def minimize(self):
2612+ start = []
2613+ for i in range(0, len(self.thumb_hand)):
2614+ line = []
2615+ for j in range(0, len(self.thumb_glove)):
2616+ line.append(0.1)
2617+ start.append(line)
2618+
2619+
2620+ xopt = fmin(self.evaluation_function, start, callback=self.callback, maxiter = 5000)
2621+
2622+ #rebuild the result as a matrix, not a vector (the implementation of the simplex in scipy works on vectors
2623+ output = []
2624+ for i in range(len(self.thumb_glove)):
2625+ line = []
2626+ for j in range(len(self.thumb_hand)):
2627+ line.append(xopt[i*len(self.thumb_hand)+j])
2628+ output.append(line)
2629+
2630+ print "min error: "+ str(self.minerror)
2631+ print "max error: "+ str(self.maxerror)
2632+
2633+ return output
2634+
2635+ def write_full_mapping(self, output_path = "../../../param/GloveToHandMappings"):
2636+ """
2637+ Writes the mapping matrix to a file:
2638+ the glove values are the lines, the hand values are the columns
2639+ """
2640+
2641+ #initialise the matrix with 0s
2642+ mapping_matrix = []
2643+ for i in range(0, len(self.glove_name_index_map)):
2644+ line = []
2645+ for j in range(0, len(self.hand_name_index_map)):
2646+ line.append(0.0)
2647+ mapping_matrix.append(line)
2648+
2649+ # TH3 is always 0, RF4 as well
2650+ #fill the matrix with the known values + th1 (all except the thumb)
2651+ mapping_matrix[self.glove_name_index_map["G_IndexDIJ"]][self.hand_name_index_map["FF0"]] = 1.0
2652+ mapping_matrix[self.glove_name_index_map["G_IndexPIJ"]][self.hand_name_index_map["FF0"]] = 1.0
2653+ mapping_matrix[self.glove_name_index_map["G_IndexMPJ"]][self.hand_name_index_map["FF3"]] = 1.0
2654+ mapping_matrix[self.glove_name_index_map["G_MiddleIndexAb"]][self.hand_name_index_map["FF4"]] = -1.0
2655+
2656+ mapping_matrix[self.glove_name_index_map["G_MiddleDIJ"]][self.hand_name_index_map["MF0"]] = 1.0
2657+ mapping_matrix[self.glove_name_index_map["G_MiddlePIJ"]][self.hand_name_index_map["MF0"]] = 1.0
2658+ mapping_matrix[self.glove_name_index_map["G_MiddleMPJ"]][self.hand_name_index_map["MF3"]] = 1.0
2659+ mapping_matrix[self.glove_name_index_map["G_RingMiddleAb"]][self.hand_name_index_map["MF4"]] = -1.0
2660+
2661+ mapping_matrix[self.glove_name_index_map["G_RingDIJ"]][self.hand_name_index_map["RF0"]] = 1.0
2662+ mapping_matrix[self.glove_name_index_map["G_RingPIJ"]][self.hand_name_index_map["RF0"]] = 1.0
2663+ mapping_matrix[self.glove_name_index_map["G_RingMPJ"]][self.hand_name_index_map["RF3"]] = 1.0
2664+
2665+ mapping_matrix[self.glove_name_index_map["G_PinkieDIJ"]][self.hand_name_index_map["LF0"]] = 1.0
2666+ mapping_matrix[self.glove_name_index_map["G_PinkiePIJ"]][self.hand_name_index_map["LF0"]] = 1.0
2667+ mapping_matrix[self.glove_name_index_map["G_PinkieMPJ"]][self.hand_name_index_map["LF3"]] = 1.0
2668+ mapping_matrix[self.glove_name_index_map["G_PinkieRingAb"]][self.hand_name_index_map["LF4"]] = -1.0
2669+ mapping_matrix[self.glove_name_index_map["G_PalmArch"]][self.hand_name_index_map["LF5"]] = 1.0
2670+
2671+ mapping_matrix[self.glove_name_index_map["G_WristPitch"]][self.hand_name_index_map["WR1"]] = 1.0
2672+ mapping_matrix[self.glove_name_index_map["G_WristYaw"]][self.hand_name_index_map["WR2"]] = 1.0
2673+
2674+ mapping_matrix[self.glove_name_index_map["G_ThumbIJ"]][self.hand_name_index_map["TH1"]] = 1.0
2675+
2676+ #mapping_matrix[self.glove_name_index_map["G_ThumbAb"]][self.hand_name_index_map["TH4"]] = 1.0
2677+ #mapping_matrix[self.glove_name_index_map["G_ThumbRotate"]][self.hand_name_index_map["TH5"]] = 1.0
2678+ #mapping_matrix[self.glove_name_index_map["G_ThumbMPJ"]][self.hand_name_index_map["TH2"]] = 1.0
2679+
2680+
2681+ #compute the best mapping for the thumb except th1
2682+ thumb_mapping = self.minimize()
2683+
2684+ #fill the matrix with the thumb values computed with the simplex
2685+ for glove_name in self.thumb_glove.keys():
2686+ for hand_name in self.thumb_hand.keys():
2687+ #indexes in the computed thumb mapping matrix
2688+ tmp_index_glove = self.thumb_glove[glove_name]
2689+ tmp_index_hand = self.thumb_hand[hand_name]
2690+
2691+ #retrieve the mapping value for those sensors
2692+ mapping_value = thumb_mapping[tmp_index_glove][tmp_index_hand]
2693+
2694+ #indexes for the whole mapping matrix
2695+ final_index_glove = self.glove_name_index_map[glove_name]
2696+ final_index_hand = self.hand_name_index_map[hand_name]
2697+
2698+ #update matrix
2699+ mapping_matrix[final_index_glove][final_index_hand] = mapping_value
2700+ #write the matrix to a file
2701+ file = open(output_path, "w")
2702+ for line in mapping_matrix:
2703+ for col in line:
2704+ file.write(" "+str(col) )
2705+ file.write("\n")
2706+
2707+ file.close()
2708+
2709+ def record(self, config):
2710+ for i in range(0, 2):
2711+ raw_input(str(i) + ": " + config.description)
2712+ vector_data = [0] * len(self.thumb_glove)
2713+ for sensor_name in self.thumb_glove.keys():
2714+ data = self.cyberglove.read_calibrated_average_value(sensor_name)
2715+ vector_data[self.thumb_glove[sensor_name]] = data
2716+ config.glove_data.append(vector_data)
2717+
2718+ if(self.verbose == 1):
2719+ print "read values:"
2720+ print config.glove_data
2721+
2722+
2723+##############
2724+# MAIN #
2725+##############
2726+def main():
2727+ cyber_mapper = MappingMinimizer()
2728+
2729+ for config in cyber_mapper.configurations:
2730+ cyber_mapper.record(config)
2731+
2732+ cyber_mapper.write_full_mapping()
2733+
2734+ return 0
2735+
2736+
2737+# start the script
2738+if __name__ == "__main__":
2739+ main()
2740\ No newline at end of file
2741
2742=== added directory 'shadow_robot/cyberglove/src'
2743=== added file 'shadow_robot/cyberglove/src/cyberglove_node.cpp'
2744--- shadow_robot/cyberglove/src/cyberglove_node.cpp 1970-01-01 00:00:00 +0000
2745+++ shadow_robot/cyberglove/src/cyberglove_node.cpp 2010-11-03 16:17:45 +0000
2746@@ -0,0 +1,53 @@
2747+/**
2748+ * @file cyberglove_node.cpp
2749+ * @author Ugo Cupcic <ugo@shadowrobot.com>
2750+ * @date Thu Apr 22 10:21:50 2010
2751+ *
2752+ * @brief The cyberglove node publishes data collected from a
2753+ * Cyberglove.
2754+ *
2755+ *
2756+ */
2757+
2758+#include <ros/ros.h>
2759+#include <time.h>
2760+#include "cyberglove/cyberglove_publisher.h"
2761+#include "cyberglove/cyberglove_service.h"
2762+#include "cyberglove/Start.h"
2763+#include <boost/smart_ptr.hpp>
2764+using namespace cyberglove_publisher;
2765+using namespace cyberglove_service;
2766+
2767+
2768+
2769+/////////////////////////////////
2770+// MAIN //
2771+/////////////////////////////////
2772+
2773+
2774+/**
2775+ * Start the cyberglove publisher.
2776+ *
2777+ * @param argc
2778+ * @param argv
2779+ *
2780+ * @return -1 if error (e.g. no glove found)
2781+ */
2782+int main(int argc, char** argv)
2783+{
2784+ ros::init(argc, argv, "cyberglove_publisher");
2785+ //NodeHandle n;
2786+ boost::shared_ptr<CyberglovePublisher> cyberglove_pub(new CyberglovePublisher());
2787+
2788+ CybergloveService service(cyberglove_pub);
2789+
2790+ while( ros::ok() )
2791+ {
2792+ if(cyberglove_pub->isPublishing()){
2793+ cyberglove_pub->publish();
2794+ }
2795+ //else{ros::spinOnce();sleep(100);}
2796+ }
2797+
2798+ return 0;
2799+}
2800
2801=== added file 'shadow_robot/cyberglove/src/cyberglove_publisher.cpp'
2802--- shadow_robot/cyberglove/src/cyberglove_publisher.cpp 1970-01-01 00:00:00 +0000
2803+++ shadow_robot/cyberglove/src/cyberglove_publisher.cpp 2010-11-03 16:17:45 +0000
2804@@ -0,0 +1,222 @@
2805+/**
2806+* @file shadowhand_publisher.cpp
2807+* @author Ugo Cupcic <ugo@shadowrobot.com>
2808+* @date Thu Mar 25 15:36:41 2010
2809+*
2810+* @brief The goal of this ROS publisher is to publish relevant data
2811+* concerning the hand at a regular time interval.
2812+* Those data are (not exhaustive): positions, targets, temperatures,
2813+* currents, forces, error flags, ...
2814+*
2815+*
2816+*/
2817+
2818+//ROS include
2819+#include <ros/ros.h>
2820+
2821+//generic C/C++ include
2822+#include <string>
2823+#include <sstream>
2824+
2825+#include "cyberglove/serial_glove.h"
2826+#include "cyberglove/cyberglove_publisher.h"
2827+
2828+using namespace ros;
2829+using namespace xml_calibration_parser;
2830+
2831+namespace cyberglove_publisher{
2832+
2833+ /////////////////////////////////
2834+ // CONSTRUCTOR/DESTRUCTOR //
2835+ /////////////////////////////////
2836+
2837+ CyberglovePublisher::CyberglovePublisher()
2838+ : n_tilde("~"), publish_rate(0.0), path_to_glove("/dev/ttyS0"), publishing(true)
2839+ {
2840+
2841+ std::string path_to_calibration;
2842+ n_tilde.param("path_to_calibration", path_to_calibration, std::string("/etc/robot/calibration.d/cyberglove.cal"));
2843+ ROS_INFO("Calibration file loaded for the Cyberglove: %s", path_to_calibration.c_str());
2844+
2845+ initialize_calibration(path_to_calibration);
2846+
2847+ // set publish frequency
2848+ double publish_freq;
2849+ n_tilde.param("publish_frequency", publish_freq, 20.0);
2850+ publish_rate = Rate(publish_freq);
2851+
2852+ // set path to glove
2853+ n_tilde.param("path_to_glove", path_to_glove, std::string("/dev/ttyS0"));
2854+ ROS_INFO("Opening glove on port: %s", path_to_glove.c_str());
2855+
2856+ int error = setup_glove( path_to_glove.c_str() );
2857+ //sleep 1s to be sure the glove had enough time to start
2858+ sleep(1);
2859+
2860+ if( error != 0 )
2861+ ROS_ERROR("Couldn't initialize the glove, is the glove plugged in?");
2862+ else
2863+ {
2864+ //publishes calibrated JointState messages
2865+ std::string prefix;
2866+ std::string searched_param;
2867+ n_tilde.searchParam("cyberglove_prefix", searched_param);
2868+ n_tilde.param(searched_param, prefix, std::string());
2869+ std::string full_topic = prefix + "/calibrated/joint_states";
2870+ cyberglove_pub = n_tilde.advertise<sensor_msgs::JointState>(full_topic, 2);
2871+
2872+ //publishes raw JointState messages
2873+ n_tilde.searchParam("cyberglove_prefix", searched_param);
2874+ n_tilde.param(searched_param, prefix, std::string());
2875+ full_topic = prefix + "/raw/joint_states";
2876+ cyberglove_raw_pub = n_tilde.advertise<sensor_msgs::JointState>(full_topic, 2);
2877+ }
2878+
2879+ //initialises joint names (the order is important)
2880+ jointstate_msg.name.push_back("G_ThumbRotate");
2881+ jointstate_msg.name.push_back("G_ThumbMPJ");
2882+ jointstate_msg.name.push_back("G_ThumbIJ");
2883+ jointstate_msg.name.push_back("G_ThumbAb");
2884+ jointstate_msg.name.push_back("G_IndexMPJ");
2885+ jointstate_msg.name.push_back("G_IndexPIJ");
2886+ jointstate_msg.name.push_back("G_IndexDIJ");
2887+ jointstate_msg.name.push_back("G_MiddleMPJ");
2888+ jointstate_msg.name.push_back("G_MiddlePIJ");
2889+ jointstate_msg.name.push_back("G_MiddleDIJ");
2890+ jointstate_msg.name.push_back("G_MiddleIndexAb");
2891+ jointstate_msg.name.push_back("G_RingMPJ");
2892+ jointstate_msg.name.push_back("G_RingPIJ");
2893+ jointstate_msg.name.push_back("G_RingDIJ");
2894+ jointstate_msg.name.push_back("G_RingMiddleAb");
2895+ jointstate_msg.name.push_back("G_PinkieMPJ");
2896+ jointstate_msg.name.push_back("G_PinkiePIJ");
2897+ jointstate_msg.name.push_back("G_PinkieDIJ");
2898+ jointstate_msg.name.push_back("G_PinkieRingAb");
2899+ jointstate_msg.name.push_back("G_PalmArch");
2900+ jointstate_msg.name.push_back("G_WristPitch");
2901+ jointstate_msg.name.push_back("G_WristYaw");
2902+
2903+ jointstate_raw_msg.name = jointstate_msg.name;
2904+ }
2905+
2906+ CyberglovePublisher::~CyberglovePublisher()
2907+ {
2908+ }
2909+
2910+ void CyberglovePublisher::initialize_calibration(std::string path_to_calibration)
2911+ {
2912+ calibration_parser = XmlCalibrationParser(path_to_calibration);
2913+ }
2914+
2915+ bool CyberglovePublisher::isPublishing()
2916+ {
2917+ if (publishing)
2918+ {
2919+ return true;
2920+ }
2921+ else
2922+ {
2923+ //check if the value was read
2924+ if( checkGloveState() )
2925+ {
2926+ ROS_INFO("The glove button was switched on, starting to publish data.");
2927+ publishing = true;
2928+ }
2929+
2930+ ros::spinOnce();
2931+ publish_rate.sleep();
2932+ return false;
2933+ }
2934+ }
2935+
2936+ void CyberglovePublisher::setPublishing(bool value){
2937+ publishing = value;
2938+ }
2939+
2940+ /////////////////////////////////
2941+ // PUBLISH METHOD //
2942+ /////////////////////////////////
2943+ void CyberglovePublisher::publish()
2944+ {
2945+ //if (!publishing) return;
2946+ //read the state of the glove button
2947+ if( !checkGloveState() )
2948+ {
2949+ publishing = false;
2950+ ROS_INFO("The glove button is off, no data will be read / sent");
2951+ ros::spinOnce();
2952+ publish_rate.sleep();
2953+ return;
2954+ }
2955+
2956+ //read data from the glove
2957+ try
2958+ {
2959+ glovePositions = glove_get_values();
2960+ }
2961+ catch(int e)
2962+ {
2963+ ROS_ERROR("The glove values can't be read");
2964+ ros::spinOnce();
2965+ publish_rate.sleep();
2966+ return;
2967+ }
2968+
2969+ //reset the messages
2970+ jointstate_msg.effort.clear();
2971+ jointstate_msg.position.clear();
2972+ jointstate_msg.velocity.clear();
2973+ jointstate_raw_msg.effort.clear();
2974+ jointstate_raw_msg.position.clear();
2975+ jointstate_raw_msg.velocity.clear();
2976+
2977+ //fill the joint_state msg with the glove data
2978+ for(unsigned int i=0; i<GLOVE_SIZE; ++i)
2979+ {
2980+ jointstate_raw_msg.position.push_back(glovePositions[i]);
2981+ add_jointstate(glovePositions[i], jointstate_msg.name[i]);
2982+ }
2983+ //publish the msgs
2984+ cyberglove_pub.publish(jointstate_msg);
2985+ cyberglove_raw_pub.publish(jointstate_raw_msg);
2986+
2987+ ros::spinOnce();
2988+ publish_rate.sleep();
2989+ }
2990+
2991+ void CyberglovePublisher::add_jointstate(float position, std::string joint_name)
2992+ {
2993+ //can't read the effort from the glove
2994+ jointstate_msg.effort.push_back(0.0);
2995+
2996+ //get the calibration value
2997+ float calibration_value = calibration_parser.get_calibration_value(position, joint_name);
2998+ std::cout << calibration_value << std::endl;
2999+ //publish the glove position
3000+ jointstate_msg.position.push_back(calibration_value);
3001+ //set velocity to 0.
3002+ //@TODO : send the correct velocity ?
3003+ jointstate_msg.velocity.push_back(0.0);
3004+ }
3005+
3006+ bool CyberglovePublisher::checkGloveState()
3007+ {
3008+ int gloveButtonState = -1;
3009+ gloveButtonState = read_button_value();
3010+
3011+ //check if the value was read
3012+ switch( gloveButtonState)
3013+ {
3014+ case 0:
3015+ return false;
3016+ case 1:
3017+ return true;
3018+ default:
3019+ ROS_ERROR("The glove button state value couldn't be read.");
3020+ return false;
3021+ }
3022+ }
3023+
3024+}// end namespace
3025+
3026+
3027
3028=== added file 'shadow_robot/cyberglove/src/cyberglove_service.cpp'
3029--- shadow_robot/cyberglove/src/cyberglove_service.cpp 1970-01-01 00:00:00 +0000
3030+++ shadow_robot/cyberglove/src/cyberglove_service.cpp 2010-11-03 16:17:45 +0000
3031@@ -0,0 +1,40 @@
3032+#include <ros/ros.h>
3033+
3034+#include <string>
3035+#include <sstream>
3036+
3037+#include "cyberglove/serial_glove.h"
3038+#include "cyberglove/cyberglove_publisher.h"
3039+#include "cyberglove/cyberglove_service.h"
3040+
3041+using namespace ros;
3042+
3043+namespace cyberglove_service{
3044+
3045+CybergloveService::CybergloveService(boost::shared_ptr<cyberglove_publisher::CyberglovePublisher> publish)
3046+ : node("~"), pub(publish)
3047+{
3048+ service_start = node.advertiseService("start",&CybergloveService::start,this);
3049+ service_calibration = node.advertiseService("calibration", &CybergloveService::calibration, this);
3050+ ROS_INFO("Listening for service");
3051+}
3052+
3053+bool CybergloveService::start(cyberglove::Start::Request &req, cyberglove::Start::Response &res){
3054+ if(req.start){
3055+ ROS_INFO("Glove is now publishing");
3056+ this->pub->setPublishing(true);
3057+ }
3058+ else{
3059+ ROS_INFO("Glove has stopped publishing");
3060+ this->pub->setPublishing(false);
3061+ }
3062+ //this->pub->cyberglove_pub.shutdown();
3063+ return true;
3064+}
3065+bool CybergloveService::calibration(cyberglove::Calibration::Request &req, cyberglove::Calibration::Response &res){
3066+ this->pub->setPublishing(false);
3067+ this->pub->initialize_calibration(req.path);
3068+ this->pub->setPublishing(true);
3069+ return true;
3070+}
3071+}
3072
3073=== added file 'shadow_robot/cyberglove/src/serial_glove.c'
3074--- shadow_robot/cyberglove/src/serial_glove.c 1970-01-01 00:00:00 +0000
3075+++ shadow_robot/cyberglove/src/serial_glove.c 2010-11-03 16:17:45 +0000
3076@@ -0,0 +1,236 @@
3077+
3078+/**
3079+@file
3080+ This program talks to a cyberglove on the serial port
3081+
3082+ The only purpose is to continually sample the glove and to store the values in the
3083+ array \c glove_positions
3084+
3085+ The program provides the function \fn void* read_glove_sensors(void)
3086+ that may be used together with a thread
3087+
3088+ serial_glove.c
3089+ (C) Shadow Robot Company 2006
3090+ GPL
3091+*/
3092+
3093+//! sudo cc -c -I/usr/realtime/include/ serial_glove.c -o serial_glove.o
3094+
3095+
3096+
3097+#include <stdio.h>
3098+#include <error.h>
3099+#include <stdio.h>
3100+#include <unistd.h>
3101+
3102+#include <termios.h>
3103+#include <fcntl.h>
3104+#include <stdio.h>
3105+#include <unistd.h>
3106+#include <sys/ioctl.h>
3107+#include <errno.h>
3108+#include <sys/types.h>
3109+#include <sys/stat.h>
3110+#include <signal.h>
3111+#include <string.h>
3112+#include <pwd.h>
3113+#include <sys/time.h>
3114+
3115+#include "cyberglove/serial_glove.h"
3116+
3117+int VERBOSE=0;
3118+
3119+FILE * serial;
3120+
3121+static float values[GLOVE_SIZE];
3122+
3123+
3124+float glove_positions[GLOVE_SIZE];
3125+
3126+int gloveButtonValue=0;
3127+
3128+int glove_start_reads=0, glove_reads=0;
3129+
3130+char glove_message[100];
3131+
3132+
3133+struct termios termios_save;
3134+static int serial_port_fd = -1;
3135+
3136+void open_board(char *port) {
3137+ struct termios termios_p;
3138+
3139+ serial_port_fd = open(port, O_RDWR | O_NOCTTY); //will return a file descriptor based on an actual file
3140+
3141+ if (serial_port_fd < 0) error(1, errno, "can't open serial port! maybe run as root...");
3142+
3143+ //! get attributes associated with the serial port
3144+ tcgetattr(serial_port_fd, &termios_p);
3145+
3146+ //changes in termios_p won't affect termios_save behond this line...
3147+ //memcpy(&termios_save, &termios_p, sizeof(struct termios)); //not used
3148+
3149+ termios_p.c_cflag = B115200;
3150+ termios_p.c_cflag |= CS8;
3151+ termios_p.c_cflag |= CREAD;
3152+ termios_p.c_iflag = IGNPAR | IGNBRK;
3153+ termios_p.c_cflag |= CLOCAL;
3154+ termios_p.c_oflag = 0;
3155+ termios_p.c_lflag = 0; // NOT in canonical mode
3156+ termios_p.c_cc[VTIME] = 1; //5; // half a second timeout
3157+ termios_p.c_cc[VMIN] = 0; // select timeout mode
3158+
3159+
3160+
3161+ memcpy(&termios_save, &termios_p, sizeof(struct termios));
3162+
3163+ //! trying the following lines to restart serial port, see read_stepping() function
3164+ tcsetattr(serial_port_fd, TCSANOW, &termios_p);
3165+ tcflush(serial_port_fd, TCOFLUSH);
3166+ tcflush(serial_port_fd, TCIFLUSH);
3167+
3168+ // unsigned char out_data[2]={0xff, 0};
3169+ // write(serial_port_fd, out_data, 1);
3170+
3171+ sleep(1);
3172+}
3173+
3174+
3175+
3176+
3177+
3178+/**
3179+called by read_values
3180+*b is length GLOVE_SIZE + 2 because the first two characters returned are G and ' '
3181+*/
3182+int read_stepping(int fd, unsigned char *b, int n) {
3183+ int i=0;
3184+ //fd_set fdset;
3185+ int res=0;
3186+ int remain;
3187+ //int counter=0;
3188+ remain = n;
3189+
3190+ do {
3191+ res=read(fd, &b[i], remain);
3192+ if (res>0) {
3193+ remain -= res;
3194+ i += res;
3195+ };
3196+
3197+ if (res<0) { error(1, errno, "readg!"); };
3198+ if (res==0) {
3199+ strcpy(glove_message, "(glove read failed, is it connected?)");
3200+ //counter++; error(0,0,"returned no data");
3201+ //HACK without this the glove will sometimes freeze
3202+ tcsetattr(serial_port_fd, TCSANOW, &termios_save);
3203+ return 1;
3204+ };
3205+
3206+ if (remain) usleep (remain * 500); //wait for more characters to appear on the port
3207+ } while ( /* (counter<10) && */ remain);
3208+
3209+ return (remain!=0);
3210+}
3211+
3212+void writeg(int fd, char *b, int n) {
3213+ int i;
3214+ for (i=0;i<n;i++) {
3215+ write(fd, &b[i], 1);
3216+ };
3217+ // usleep(10*n);
3218+}
3219+
3220+//read the position values from the glove
3221+void read_values(float *dest) {
3222+ restart:
3223+ glove_start_reads++;
3224+ tcflush(serial_port_fd, TCIFLUSH);
3225+ tcflush(serial_port_fd, TCOFLUSH);
3226+ writeg(serial_port_fd, "G", 1);
3227+ int i;
3228+ unsigned char ch[GLOVE_SIZE+2]={0}; //assigns 0 to the first char
3229+
3230+ usleep(GLOVE_SIZE*10);
3231+ // int res=read(serial_port_fd, &ch, GLOVE_SIZE+2);
3232+ // if (res<0) error(1,errno, "reading from serial port");
3233+ if (read_stepping(serial_port_fd, &ch, GLOVE_SIZE+2)) {
3234+ //error(0,0,"serial port timeout");
3235+ goto restart;
3236+ };
3237+ // error(0,0,"res=%d, %02x %02x %02x %02x %02x %02x", res, ch[0],ch[1],ch[2],ch[3],ch[4],ch[5]);
3238+
3239+ if (ch[0]!='G') {
3240+ //error(0,0,"NO G");
3241+ // log_message("%s: Failure reading glove: No G", timestamp());
3242+ goto restart;
3243+ };
3244+
3245+ //! if any of the values are zero restart read as not considered reliable
3246+ for (i=0; i<GLOVE_SIZE; i++) {
3247+ if (ch[i+1]==0) {
3248+ //error(0,0,"Restart %d!", i);
3249+ goto restart;
3250+ };
3251+ };
3252+
3253+ for (i=0; i<GLOVE_SIZE; i++) {
3254+ dest[i] = (ch[i+1]-1.0)/254.0;
3255+ }
3256+
3257+
3258+ strcpy(glove_message, "");
3259+ glove_reads++;
3260+}
3261+
3262+//read the button value from the glove
3263+int read_button_value() {
3264+ restartButtonRead:
3265+ tcflush(serial_port_fd, TCIFLUSH);
3266+ tcflush(serial_port_fd, TCOFLUSH);
3267+ writeg(serial_port_fd, "?W", 2);
3268+ unsigned char ch[3]={0}; //assigns 0 to the first char
3269+
3270+ //TODO : this should be reduced ?
3271+ usleep(GLOVE_SIZE*10);
3272+
3273+ if (read_stepping(serial_port_fd, &ch, 3)) {
3274+ goto restartButtonRead;
3275+ };
3276+
3277+ return ch[2];
3278+}
3279+
3280+
3281+int setup_glove(const char* path_to_glove)
3282+ {
3283+ open_board(path_to_glove);
3284+
3285+ int i;
3286+ for (i=0;i<GLOVE_SIZE;i++)
3287+ {
3288+ values[i]=0.0;
3289+ glove_positions[i] = 0.0;
3290+ }
3291+
3292+ return 0;
3293+ }
3294+
3295+
3296+//at end of file
3297+//static void compute_setpoints(void);
3298+
3299+
3300+
3301+//! sample the glove values - need to call setup_glove first
3302+float* glove_get_values() {
3303+ read_values(values);
3304+
3305+ int i;
3306+ for (i=0; i<GLOVE_SIZE; i++)
3307+ glove_positions[i] = values[i];
3308+
3309+ return glove_positions;
3310+}
3311+
3312+
3313
3314=== added file 'shadow_robot/cyberglove/src/xml_calibration_parser.cpp'
3315--- shadow_robot/cyberglove/src/xml_calibration_parser.cpp 1970-01-01 00:00:00 +0000
3316+++ shadow_robot/cyberglove/src/xml_calibration_parser.cpp 2010-11-03 16:17:45 +0000
3317@@ -0,0 +1,308 @@
3318+/**
3319+ * @file xml_calibration_parser.cpp
3320+ * @author Ugo Cupcic <ugo@shadowrobot.com>
3321+ * @date Tue Apr 27 11:30:41 2010
3322+ *
3323+ * @brief This is a simple xml parser, used to parse the calibration
3324+ * file for the cyberglove.
3325+ * A Calibration file must have this format:
3326+ * <Cyberglove_calibration>
3327+ * <Joint name="G_ThumbRotate">
3328+ * <calib raw_value="0.0" calibrated_value="-60"/>
3329+ * <calib raw_value="0.42" calibrated_value="100"/>
3330+ * </Joint>
3331+ * </Cyberglove_calibration>
3332+ *
3333+ * The calibration will be used by the glove node to stream coherent
3334+ * angles (and not an uncalibrated sensor value between 0 and 1).
3335+ *
3336+ *
3337+ */
3338+
3339+//ROS include
3340+#include <ros/ros.h>
3341+
3342+#include "cyberglove/xml_calibration_parser.h"
3343+
3344+#include <stdio.h>
3345+
3346+namespace xml_calibration_parser{
3347+
3348+ const float XmlCalibrationParser::lookup_precision = 1000.0f;
3349+ const float XmlCalibrationParser::lookup_offset = 1.0f;
3350+
3351+ /**
3352+ * The constructor: parses the given file and stores the calibration
3353+ * in the vector std::vector<JointCalibration> jointsCalibrations.
3354+ *
3355+ * @param path_to_calibration the path to the xml calibration
3356+ * file. Please note that it is best to use ros parameters to set
3357+ * the path in your code calling this constructor.
3358+ */
3359+ XmlCalibrationParser::XmlCalibrationParser(std::string path_to_calibration)
3360+ {
3361+ TiXmlDocument doc(path_to_calibration.c_str());
3362+ bool loadOkay = doc.LoadFile();
3363+ if (loadOkay)
3364+ {
3365+ ROS_DEBUG("loading calibration %s", path_to_calibration.c_str());
3366+ parse_calibration_file( doc.RootElement() );
3367+
3368+ build_calibration_table();
3369+ }
3370+ else
3371+ {
3372+ ROS_ERROR("Failed to load file \"%s\"", path_to_calibration.c_str());
3373+ }
3374+ }
3375+
3376+ /**
3377+ * Parses the calibration file and retreive the full calibration for
3378+ * the cyberglove.
3379+ *
3380+ * @param pParent The parent node (Cyberglove_calibration)
3381+ * containing all the xml tree.
3382+ */
3383+ void XmlCalibrationParser::parse_calibration_file( TiXmlNode* pParent )
3384+ {
3385+ if ( !pParent ) return;
3386+
3387+ TiXmlElement* child = pParent->FirstChildElement("Joint");
3388+
3389+ //no Joint elements => error
3390+ if( !child )
3391+ {
3392+ ROS_ERROR( "The calibration file seems to be broken: there's no Joint elements." );
3393+ return;
3394+ }
3395+
3396+ bool has_sibling = true;
3397+ while( has_sibling )
3398+ {
3399+ // a Joint element was found
3400+ XmlCalibrationParser::JointCalibration joint_calib;
3401+ joint_calib.name = child->Attribute("name");
3402+
3403+ joint_calib.calibrations = parse_joint_attributes(child);
3404+
3405+ jointsCalibrations.push_back(joint_calib);
3406+
3407+ //get the next Joint element
3408+ child = child->NextSiblingElement("Joint");
3409+ //no more Joint elements => stop
3410+ if( !child )
3411+ has_sibling = false;
3412+ }
3413+ }
3414+
3415+ /**
3416+ * Parses the Joint element of the calibration file.
3417+ *
3418+ * @param pParent a Joint element
3419+ *
3420+ * @return the calibration values for this Joint.
3421+ */
3422+ std::vector<XmlCalibrationParser::Calibration>
3423+ XmlCalibrationParser::parse_joint_attributes( TiXmlNode* pParent )
3424+ {
3425+ std::vector<XmlCalibrationParser::Calibration> calibrations;
3426+
3427+ TiXmlElement* child = pParent->FirstChildElement("calib");
3428+
3429+ //no Joint elements => error
3430+ if( !child )
3431+ {
3432+ ROS_ERROR( "The calibration file seems to be broken: there's no calibration elements." );
3433+ return calibrations;
3434+ }
3435+ bool has_sibling = true;
3436+
3437+ while( has_sibling )
3438+ {
3439+ // a Joint element was found
3440+ XmlCalibrationParser::Calibration calib;
3441+ float fval;
3442+
3443+ // get the raw-value
3444+ if( child->QueryFloatAttribute("raw_value", &fval) == TIXML_SUCCESS )
3445+ calib.raw_value = fval;
3446+ else
3447+ ROS_ERROR("The calibration file seems to be broken: there's no raw_value attribute.");
3448+
3449+ //get the calibrated-value
3450+ if( child->QueryFloatAttribute("calibrated_value", &fval) == TIXML_SUCCESS )
3451+ calib.calibrated_value = fval;
3452+ else
3453+ ROS_ERROR("The calibration file seems to be broken: there's no calibrated_value attribute.");
3454+
3455+ //add the calibration to the vector
3456+ calibrations.push_back( calib );
3457+
3458+ //get the next Joint element
3459+ child = child->NextSiblingElement("calib");
3460+ //no more Joint elements => stop
3461+ if( !child )
3462+ has_sibling = false;
3463+ }
3464+
3465+ return calibrations;
3466+ }
3467+
3468+
3469+ /**
3470+ * Transform the calibration values to a lookup table for fast
3471+ * processing of the calibration process.
3472+ * NB: the lookup table ranges from 0 to +lookup_offset
3473+ * with a precision of 1/lookup_precision.
3474+ *
3475+ */
3476+ int XmlCalibrationParser::build_calibration_table()
3477+ {
3478+ for (unsigned int index_calib = 0; index_calib < jointsCalibrations.size(); ++index_calib)
3479+ {
3480+ std::string name = jointsCalibrations[index_calib].name;
3481+ std::cout << name << std::endl;
3482+
3483+ std::vector<Calibration> calib = jointsCalibrations[index_calib].calibrations;
3484+
3485+ std::vector<float> lookup_table((int)lookup_offset*(int)lookup_precision);
3486+
3487+ if( calib.size() < 2 )
3488+ ROS_ERROR("Not enough points were defined to set up the calibration.");
3489+
3490+ //order the calibration vector by ascending values of raw_value
3491+ // ROS_ERROR("TODO: calibration vector not ordered yet");
3492+
3493+ std::cout << "lookup table : ";
3494+
3495+ //setup the lookup table
3496+ for( unsigned int index_lookup = 0;
3497+ index_lookup < lookup_table.size() ;
3498+ ++ index_lookup )
3499+ {
3500+ float value = compute_lookup_value(index_lookup, calib);
3501+ std::cout << index_lookup<<":"<<value << " ";
3502+ lookup_table[index_lookup] = value;
3503+ }
3504+
3505+ std::cout << std::endl;
3506+
3507+ //add the values to the map
3508+ joints_calibrations_map[name] = lookup_table;
3509+ //joints_calibrations_map.insert(std::pair <std::string, std::vector<float> >(name, lookup_table));
3510+ }
3511+
3512+ return 0;
3513+ }
3514+
3515+ /**
3516+ * return the value to store in the lookup table for a given index,
3517+ * using the calibration information.
3518+ *
3519+ * @param index the index for which we compute the value
3520+ *
3521+ * @param calib the vector containing the calibration informations
3522+ * (a list of raw_value <=> calibrated_value)
3523+ *
3524+ * @return the value to be stored in the lookup table
3525+ */
3526+ float XmlCalibrationParser::compute_lookup_value(int index, std::vector<XmlCalibrationParser::Calibration> calib)
3527+ {
3528+ float raw_pos = return_raw_position_from_index(index);
3529+
3530+ if(calib.size() == 2)
3531+ return linear_interpolate( raw_pos,
3532+ calib[0].raw_value,
3533+ calib[0].calibrated_value,
3534+ calib[1].raw_value,
3535+ calib[1].calibrated_value
3536+ );
3537+
3538+
3539+ for( unsigned int index_calib = 0; index_calib < calib.size() - 1;
3540+ ++index_calib)
3541+ {
3542+ if(calib[index_calib].raw_value > raw_pos)
3543+ {
3544+ return linear_interpolate( raw_pos,
3545+ calib[index_calib].raw_value,
3546+ calib[index_calib].calibrated_value,
3547+ calib[index_calib+1].raw_value,
3548+ calib[index_calib+1].calibrated_value
3549+ );
3550+ }
3551+ }
3552+
3553+ //bigger than last calibrated value => extrapolate the value from
3554+ //last 2 values
3555+ //TODO: ca marche la formule si on est en dehors des points ? oui
3556+ return linear_interpolate( raw_pos,
3557+ calib[calib.size()-1].raw_value,
3558+ calib[calib.size()-1].calibrated_value,
3559+ calib[calib.size()].raw_value,
3560+ calib[calib.size()].calibrated_value
3561+ );
3562+
3563+ }
3564+
3565+ float XmlCalibrationParser::get_calibration_value(float position, std::string joint_name)
3566+ {
3567+ mapType::iterator iter = joints_calibrations_map.find(joint_name);
3568+
3569+ if( joint_name.compare("G_ThumbAb"))
3570+ printf("toto");
3571+
3572+ if( iter != joints_calibrations_map.end() )
3573+ {
3574+ //reads from the lookup table
3575+ int index = return_index_from_raw_position(position);
3576+ std::cout << index << std::endl;
3577+ return iter->second[index];
3578+ }
3579+ else
3580+ {
3581+ ROS_ERROR("%s is not calibrated", joint_name.c_str());
3582+ return 1.0f;
3583+ }
3584+ }
3585+
3586+ float XmlCalibrationParser::linear_interpolate( float x ,
3587+ float x0, float y0,
3588+ float x1, float y1 )
3589+ {
3590+
3591+ //TODO ca marche qd c'est decroissant ca? oui
3592+ float y = 0.0f;
3593+ if( x1 - x0 == 0.0f )
3594+ {
3595+ ROS_WARN("Bad calibration: raw_calib[1] = raw_calib[0]");
3596+ return 0.0f;
3597+ }
3598+
3599+ y = y0 + (x-x0)* ((y1-y0)/(x1-x0));
3600+ return y;
3601+ }
3602+
3603+
3604+ int XmlCalibrationParser::return_index_from_raw_position(float raw_position)
3605+ {
3606+ if (raw_position < 0.0f)
3607+ return 0;
3608+ if(raw_position > 1.0f)
3609+ return lookup_precision;
3610+ return round(raw_position * lookup_precision);
3611+ };
3612+
3613+ int XmlCalibrationParser::round(float number)
3614+ {
3615+ //we only have positive numbers
3616+ return (int)floor(number + 0.5);
3617+ //return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
3618+ }
3619+
3620+
3621+ std::vector<XmlCalibrationParser::JointCalibration> XmlCalibrationParser::getJointsCalibrations()
3622+ {
3623+ return jointsCalibrations;
3624+ }
3625+}//end namespace
3626
3627=== added directory 'shadow_robot/cyberglove/srv'
3628=== added file 'shadow_robot/cyberglove/srv/Calibration.srv'
3629--- shadow_robot/cyberglove/srv/Calibration.srv 1970-01-01 00:00:00 +0000
3630+++ shadow_robot/cyberglove/srv/Calibration.srv 2010-11-03 16:17:45 +0000
3631@@ -0,0 +1,3 @@
3632+string path
3633+---
3634+bool state
3635
3636=== added file 'shadow_robot/cyberglove/srv/Start.srv'
3637--- shadow_robot/cyberglove/srv/Start.srv 1970-01-01 00:00:00 +0000
3638+++ shadow_robot/cyberglove/srv/Start.srv 2010-11-03 16:17:45 +0000
3639@@ -0,0 +1,3 @@
3640+bool start
3641+---
3642+bool state
3643
3644=== added directory 'shadow_robot/cyberglove/test'
3645=== added file 'shadow_robot/cyberglove/test/cyberglove_test.cal'
3646--- shadow_robot/cyberglove/test/cyberglove_test.cal 1970-01-01 00:00:00 +0000
3647+++ shadow_robot/cyberglove/test/cyberglove_test.cal 2010-11-03 16:17:45 +0000
3648@@ -0,0 +1,19 @@
3649+<?xml version="1.0" ?>
3650+<Cyberglove_calibration>
3651+<Joint name="test1">
3652+<calib raw_value="0.0 " calibrated_value=" 0"/>
3653+<calib raw_value="0.1 " calibrated_value=" 100"/>
3654+</Joint>
3655+<Joint name="test2">
3656+<calib raw_value="0.0 " calibrated_value=" 10"/>
3657+<calib raw_value="0.1 " calibrated_value=" 60"/>
3658+</Joint>
3659+<Joint name="test3">
3660+<calib raw_value="0.1 " calibrated_value=" 10"/>
3661+<calib raw_value="0.2 " calibrated_value=" 60"/>
3662+</Joint>
3663+<Joint name="test4">
3664+<calib raw_value="0.1 " calibrated_value=" 10"/>
3665+<calib raw_value="0.0 " calibrated_value=" 60"/>
3666+</Joint>
3667+</Cyberglove_calibration>
3668
3669=== added file 'shadow_robot/cyberglove/test/test_calibration.cpp'
3670--- shadow_robot/cyberglove/test/test_calibration.cpp 1970-01-01 00:00:00 +0000
3671+++ shadow_robot/cyberglove/test/test_calibration.cpp 2010-11-03 16:17:45 +0000
3672@@ -0,0 +1,136 @@
3673+
3674+
3675+#include <ros/ros.h>
3676+
3677+#include <math.h>
3678+
3679+#include <cyberglove/xml_calibration_parser.h>
3680+#include <gtest/gtest.h>
3681+
3682+#define TEST_EXPRESSION(a) EXPECT_EQ((a), meval::EvaluateMathExpression(#a))
3683+
3684+using namespace ros;
3685+using namespace xml_calibration_parser;
3686+
3687+std::string path_to_calibration = "/home/ugo/Projects/cyberglove/cyberglove_ROS_interface/cyberglove/test/cyberglove_test.cal";
3688+
3689+float epsilon = 0.01f;
3690+
3691+XmlCalibrationParser calib_parser;
3692+
3693+TEST(LookupTable, testSimple)
3694+{
3695+ float valtmp;
3696+ valtmp = calib_parser.get_calibration_value(0.05f,"test1" );
3697+ EXPECT_TRUE(fabs( valtmp - 50.0f ) < epsilon)
3698+ << "Expected value : 50 "
3699+ << "Received value : "<< valtmp;
3700+
3701+ valtmp = calib_parser.get_calibration_value(0.1f,"test1" );
3702+ EXPECT_TRUE(fabs( valtmp - 100.0f ) < epsilon)
3703+ << "Expected value : 100 "
3704+ << "Received value : "<< valtmp;
3705+
3706+ valtmp = calib_parser.get_calibration_value(0.0f,"test1" );
3707+ EXPECT_TRUE(fabs( valtmp - 0.0f ) < epsilon)
3708+ << "Expected value : 0 "
3709+ << "Received value : "<< valtmp;
3710+
3711+ valtmp = calib_parser.get_calibration_value(0.2f,"test1" );
3712+ EXPECT_TRUE(fabs( valtmp - 200.0f ) < epsilon)
3713+ << "Expected value : 200 "
3714+ << "Received value : "<< valtmp;
3715+}
3716+
3717+TEST(LookupTable, integrity)
3718+{
3719+ std::vector<XmlCalibrationParser::JointCalibration> myCalib = calib_parser.getJointsCalibrations();
3720+
3721+ EXPECT_EQ(4, myCalib.size());
3722+ for(unsigned int i = 0; i<myCalib.size() ; ++i)
3723+ {
3724+ EXPECT_EQ(2, myCalib[i].calibrations.size());
3725+ }
3726+}
3727+
3728+TEST(LookupTable, testCalibNotStartingAtZero)
3729+{
3730+ float valtmp;
3731+ valtmp = calib_parser.get_calibration_value(0.05f,"test2" );
3732+ EXPECT_TRUE(fabs( valtmp - 35.0f ) < epsilon)
3733+ << "Expected value : 35 "
3734+ << "Received value : "<< valtmp;
3735+
3736+ valtmp = calib_parser.get_calibration_value(0.1f,"test2" );
3737+ EXPECT_TRUE(fabs( valtmp - 60.0f ) < epsilon)
3738+ << "Expected value : 60 "
3739+ << "Received value : "<< valtmp;
3740+
3741+ valtmp = calib_parser.get_calibration_value(0.0f,"test2" );
3742+ EXPECT_TRUE(fabs( valtmp - 10.0f ) < epsilon)
3743+ << "Expected value : 10 "
3744+ << "Received value : "<< valtmp;
3745+
3746+ valtmp = calib_parser.get_calibration_value(0.2f,"test2" );
3747+ EXPECT_TRUE(fabs(valtmp - 110.0f ) < epsilon)
3748+ << "Expected value : 110 "
3749+ << "Received value : "<< valtmp;
3750+}
3751+
3752+TEST(LookupTable, testRawNotStartingAtZero)
3753+{
3754+ float valtmp;
3755+ valtmp = calib_parser.get_calibration_value(0.15f,"test3" );
3756+ EXPECT_TRUE(fabs( valtmp - 35.0f ) < epsilon)
3757+ << "Expected value : 35 "
3758+ << "Received value : "<< valtmp;
3759+
3760+ valtmp = calib_parser.get_calibration_value(0.2f,"test3" );
3761+ EXPECT_TRUE(fabs( valtmp - 60.0f ) < epsilon)
3762+ << "Expected value : 60 "
3763+ << "Received value : "<< valtmp;
3764+
3765+ valtmp = calib_parser.get_calibration_value(0.1f,"test3" );
3766+ EXPECT_TRUE(fabs( valtmp - 10.0f ) < epsilon)
3767+ << "Expected value : 10 "
3768+ << "Received value : "<< valtmp;
3769+
3770+ valtmp = calib_parser.get_calibration_value(0.3f,"test3" );
3771+ EXPECT_TRUE(fabs(valtmp - 110.0f ) < epsilon)
3772+ << "Expected value : 110 "
3773+ << "Received value : "<< valtmp;
3774+}
3775+
3776+TEST(LookupTable, tableNotOrdered)
3777+{
3778+ float valtmp;
3779+ valtmp = calib_parser.get_calibration_value(0.05f,"test4" );
3780+ EXPECT_TRUE(fabs( valtmp - 35.0f ) < epsilon)
3781+ << "Expected value : 35 "
3782+ << "Received value : "<< valtmp;
3783+
3784+ valtmp = calib_parser.get_calibration_value(0.1f,"test4" );
3785+ EXPECT_TRUE(fabs( valtmp - 10.0f ) < epsilon)
3786+ << "Expected value : 10 "
3787+ << "Received value : "<< valtmp;
3788+
3789+ valtmp = calib_parser.get_calibration_value(0.0f,"test4" );
3790+ EXPECT_TRUE(fabs( valtmp - 60.0f ) < epsilon)
3791+ << "Expected value : 60 "
3792+ << "Received value : "<< valtmp;
3793+
3794+ valtmp = calib_parser.get_calibration_value(0.2f,"test4" );
3795+ EXPECT_TRUE(fabs( valtmp + 40.0f) < epsilon)
3796+ << "Expected value : -40 "
3797+ << "Received value : "<< valtmp;
3798+}
3799+
3800+// Run all the tests that were declared with TEST()
3801+int main(int argc, char **argv){
3802+
3803+ calib_parser = XmlCalibrationParser(path_to_calibration);
3804+
3805+ testing::InitGoogleTest(&argc, argv);
3806+ return RUN_ALL_TESTS();
3807+
3808+}
3809
3810=== added directory 'shadow_robot/dataglove'
3811=== added file 'shadow_robot/dataglove/CMakeLists.txt'
3812--- shadow_robot/dataglove/CMakeLists.txt 1970-01-01 00:00:00 +0000
3813+++ shadow_robot/dataglove/CMakeLists.txt 2010-11-03 16:17:45 +0000
3814@@ -0,0 +1,17 @@
3815+cmake_minimum_required(VERSION 2.4.6)
3816+include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
3817+
3818+# Append to CPACK_SOURCE_IGNORE_FILES a semicolon-separated list of
3819+# directories (or patterns, but directories should suffice) that should
3820+# be excluded from the distro. This is not the place to put things that
3821+# should be ignored everywhere, like "build" directories; that happens in
3822+# rosbuild/rosbuild.cmake. Here should be listed packages that aren't
3823+# ready for inclusion in a distro.
3824+#
3825+# This list is combined with the list in rosbuild/rosbuild.cmake. Note
3826+# that CMake 2.6 may be required to ensure that the two lists are combined
3827+# properly. CMake 2.4 seems to have unpredictable scoping rules for such
3828+# variables.
3829+#list(APPEND CPACK_SOURCE_IGNORE_FILES /core/experimental)
3830+
3831+rosbuild_make_distribution(0.1.0)
3832
3833=== added file 'shadow_robot/dataglove/Makefile'
3834--- shadow_robot/dataglove/Makefile 1970-01-01 00:00:00 +0000
3835+++ shadow_robot/dataglove/Makefile 2010-11-03 16:17:45 +0000
3836@@ -0,0 +1,1 @@
3837+include $(shell rospack find mk)/cmake_stack.mk
3838\ No newline at end of file
3839
3840=== added directory 'shadow_robot/dataglove/dataglove_processing'
3841=== added file 'shadow_robot/dataglove/dataglove_processing/CMakeLists.txt'
3842--- shadow_robot/dataglove/dataglove_processing/CMakeLists.txt 1970-01-01 00:00:00 +0000
3843+++ shadow_robot/dataglove/dataglove_processing/CMakeLists.txt 2010-11-03 16:17:45 +0000
3844@@ -0,0 +1,34 @@
3845+cmake_minimum_required(VERSION 2.4.6)
3846+include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)
3847+
3848+# Set the build type. Options are:
3849+# Coverage : w/ debug symbols, w/o optimization, w/ code-coverage
3850+# Debug : w/ debug symbols, w/o optimization
3851+# Release : w/o debug symbols, w/ optimization
3852+# RelWithDebInfo : w/ debug symbols, w/ optimization
3853+# MinSizeRel : w/o debug symbols, w/ optimization, stripped binaries
3854+#set(ROS_BUILD_TYPE RelWithDebInfo)
3855+
3856+rosbuild_init()
3857+
3858+#set the default path for built executables to the "bin" directory
3859+set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
3860+#set the default path for built libraries to the "lib" directory
3861+set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
3862+
3863+#uncomment if you have defined messages
3864+#rosbuild_genmsg()
3865+#uncomment if you have defined services
3866+rosbuild_gensrv()
3867+
3868+#common commands for building c++ executables and libraries
3869+#rosbuild_add_library(${PROJECT_NAME} src/example.cpp)
3870+#target_link_libraries(${PROJECT_NAME} another_library)
3871+#rosbuild_add_boost_directories()
3872+#rosbuild_link_boost(${PROJECT_NAME} thread)
3873+#rosbuild_add_executable(example examples/example.cpp)
3874+#target_link_libraries(example ${PROJECT_NAME})
3875+
3876+#rosbuild_add_executable(optical_dataglove src/optical_dataglove.cpp src/optical_dataglove_node.cpp)
3877+rosbuild_add_executable(message_publisher src/three_dimensions src/two_dimensions.cpp src/reverse_kinematics.cpp src/database_mapping.cpp src/message_publisher.cpp src/optical_dataglove_node.cpp)
3878+
3879
3880=== added file 'shadow_robot/dataglove/dataglove_processing/Makefile'
3881--- shadow_robot/dataglove/dataglove_processing/Makefile 1970-01-01 00:00:00 +0000
3882+++ shadow_robot/dataglove/dataglove_processing/Makefile 2010-11-03 16:17:45 +0000
3883@@ -0,0 +1,1 @@
3884+include $(shell rospack find mk)/cmake.mk
3885\ No newline at end of file
3886
3887=== added file 'shadow_robot/dataglove/dataglove_processing/dataglove-UML.png'
3888Binary files shadow_robot/dataglove/dataglove_processing/dataglove-UML.png 1970-01-01 00:00:00 +0000 and shadow_robot/dataglove/dataglove_processing/dataglove-UML.png 2010-11-03 16:17:45 +0000 differ
3889=== added directory 'shadow_robot/dataglove/dataglove_processing/include'
3890=== added directory 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove'
3891=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/data_analyser.h'
3892--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/data_analyser.h 1970-01-01 00:00:00 +0000
3893+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/data_analyser.h 2010-11-03 16:17:45 +0000
3894@@ -0,0 +1,41 @@
3895+#ifndef DATA_ANALYSER_H_
3896+#define DATA_ANALYSER_H_
3897+
3898+#include "optical_dataglove/joint_data.h"
3899+#include <map>
3900+
3901+namespace opticaldataglove{
3902+
3903+/*
3904+ * Abstract class to define methods to make conversions between the raw source to the fingertips positions
3905+ * Key methods to implement in subclass are getFingerTipPositions and getHandModel, which is used to determine the distances between the human hand articulations
3906+ */
3907+class DataAnalyser
3908+{
3909+
3910+public:
3911+/*
3912+ * Constructor
3913+ */
3914+ DataAnalyser()
3915+ {
3916+ };
3917+/*
3918+ * Destructor
3919+ */
3920+ ~DataAnalyser()
3921+ {
3922+ };
3923+
3924+ virtual std::map<std::string, double> getFingerTipPositions()=0;
3925+ virtual std::map<std::string, double> getHandModel()=0;
3926+
3927+protected:
3928+
3929+ std::map<std::string, double> fingerTipPositions;
3930+ std::map<std::string, double> handModel;
3931+
3932+
3933+};
3934+}
3935+#endif //DATA_ANALYSER_H_
3936
3937=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/database_mapping.h'
3938--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/database_mapping.h 1970-01-01 00:00:00 +0000
3939+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/database_mapping.h 2010-11-03 16:17:45 +0000
3940@@ -0,0 +1,41 @@
3941+#ifndef DATABASEMAPPING_H_
3942+#define DATABASEMAPPING_H_
3943+
3944+#include "optical_dataglove/position_mapper.h"
3945+
3946+namespace opticaldataglove{
3947+
3948+/*
3949+ * Class used to perform the conversion between fingertips positions to joints values using a Database of known positions
3950+ */
3951+class DatabaseMapping : public PositionMapper
3952+{
3953+public :
3954+
3955+/*
3956+ * Constructor
3957+ * @param data_analyser : data analyser performing computing to get information from hand
3958+ */
3959+ DatabaseMapping(boost::shared_ptr<DataAnalyser> data_analyser);
3960+
3961+/*
3962+ * Destructor
3963+ */
3964+ ~DatabaseMapping();
3965+
3966+/*
3967+ * Returns a map with the angles of that the hand should take
3968+ */
3969+ virtual std::map<std::string, JointData> getHandPositions();
3970+
3971+private :
3972+
3973+/*
3974+ * Initializes the hand position
3975+ */
3976+ virtual void initializeHandPositions();
3977+
3978+};
3979+}
3980+
3981+#endif //#DATABASEMAPPING_H_
3982
3983=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/hand_model.h'
3984--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/hand_model.h 1970-01-01 00:00:00 +0000
3985+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/hand_model.h 2010-11-03 16:17:45 +0000
3986@@ -0,0 +1,52 @@
3987+#ifndef HAND_MODEL_H_
3988+#define HAND_MODEL_H_
3989+
3990+#include <string>
3991+
3992+namespace opticaldataglove{
3993+
3994+/*
3995+ * Class describing the distances between the joints on the human hand. These should be get only once.
3996+ */
3997+class HandModel
3998+{
3999+
4000+public :
4001+
4002+ double THJ3_to_THJ2;
4003+ double THJ2_to_THJ1;
4004+
4005+ double FFJ3_to_FFJ2;
4006+ double FFJ2_to_FFJ1;
4007+
4008+ double MFJ3_to_MFJ2;
4009+ double MFJ2_to_MFJ1;
4010+
4011+ double RFJ3_to_RFJ2;
4012+ double RFJ2_to_RFJ1;
4013+
4014+ double LFJ3_to_LFJ2;
4015+ double LFJ2_to_LFJ1;
4016+
4017+ HandModel() :
4018+ THJ3_to_THJ2(1.0),THJ2_to_THJ1(2.0),FFJ3_to_FFJ2(1.0),FFJ2_to_FFJ1(2.0),
4019+ MFJ3_to_MFJ2(1.0),MFJ2_to_MFJ1(2.0),RFJ3_to_RFJ2(1.0),RFJ2_to_RFJ1(2.0),
4020+ LFJ3_to_LFJ2(1.0),LFJ2_to_LFJ1(2.0)
4021+ {
4022+ }
4023+
4024+ HandModel(HandModel& hm) :
4025+ THJ3_to_THJ2(hm.THJ3_to_THJ2),THJ2_to_THJ1(hm.THJ2_to_THJ1),FFJ3_to_FFJ2(hm.FFJ3_to_FFJ2),FFJ2_to_FFJ1(hm.FFJ2_to_FFJ1),
4026+ MFJ3_to_MFJ2(hm.MFJ3_to_MFJ2),MFJ2_to_MFJ1(hm.MFJ2_to_MFJ1),RFJ3_to_RFJ2(hm.RFJ3_to_RFJ2),RFJ2_to_RFJ1(hm.RFJ2_to_RFJ1),
4027+ LFJ3_to_LFJ2(hm.LFJ3_to_LFJ2),LFJ2_to_LFJ1(hm.LFJ2_to_LFJ1)
4028+ {
4029+ };
4030+
4031+ HandModel(const HandModel& hm) :
4032+ THJ3_to_THJ2(hm.THJ3_to_THJ2),THJ2_to_THJ1(hm.THJ2_to_THJ1),FFJ3_to_FFJ2(hm.FFJ3_to_FFJ2),FFJ2_to_FFJ1(hm.FFJ2_to_FFJ1),
4033+ MFJ3_to_MFJ2(hm.MFJ3_to_MFJ2),MFJ2_to_MFJ1(hm.MFJ2_to_MFJ1),RFJ3_to_RFJ2(hm.RFJ3_to_RFJ2),RFJ2_to_RFJ1(hm.RFJ2_to_RFJ1),
4034+ LFJ3_to_LFJ2(hm.LFJ3_to_LFJ2),LFJ2_to_LFJ1(hm.LFJ2_to_LFJ1)
4035+ {
4036+}
4037+
4038+#endif //HAND_MODEL_H_
4039
4040=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/joint_data.h'
4041--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/joint_data.h 1970-01-01 00:00:00 +0000
4042+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/joint_data.h 2010-11-03 16:17:45 +0000
4043@@ -0,0 +1,46 @@
4044+#ifndef JOINT_DATA_H_
4045+#define JOINT_DATA_H_
4046+
4047+#include <string>
4048+
4049+namespace opticaldataglove{
4050+
4051+/*
4052+ * Describes a joint of the hand with any possible information
4053+ */
4054+class JointData
4055+{
4056+
4057+public:
4058+ double position;
4059+ double target;
4060+ double temperature;
4061+ double current;
4062+ double force;
4063+ std::string flags;
4064+ int jointIndex;
4065+ double min;
4066+ double max;
4067+ short isJointZero;
4068+
4069+ JointData() :
4070+ position(0.0), target(0.0), temperature(0.0), current(0.0), force(0.0), flags(""), jointIndex(0),
4071+ min(0.0), max(90.0), isJointZero(0)
4072+ {
4073+ }
4074+
4075+ JointData(JointData& jd) :
4076+ position(jd.position), target(jd.target), temperature(jd.temperature), current(jd.current), force(jd.force),
4077+ flags(jd.flags), jointIndex(jd.jointIndex), min(jd.min), max(jd.max), isJointZero(jd.isJointZero)
4078+ {
4079+ }
4080+
4081+ JointData(const JointData& jd) :
4082+ position(jd.position), target(jd.target), temperature(jd.temperature), current(jd.current), force(jd.force),
4083+ flags(jd.flags), jointIndex(jd.jointIndex), min(jd.min), max(jd.max), isJointZero(jd.isJointZero)
4084+ {
4085+ }
4086+};
4087+
4088+}
4089+#endif //JOINT_DATA_H_
4090
4091=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/message_publisher.h'
4092--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/message_publisher.h 1970-01-01 00:00:00 +0000
4093+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/message_publisher.h 2010-11-03 16:17:45 +0000
4094@@ -0,0 +1,56 @@
4095+#ifndef MESSAGE_PUBLISHER_H_
4096+#define MESSAGE_PUBLISHER_H_
4097+
4098+#include <string>
4099+#include <vector>
4100+#include <map>
4101+#include <ros/ros.h>
4102+#include "opticaldataglove/Start.h"
4103+#include "opticaldataglove/Stop.h"
4104+#include "optical_dataglove/joint_data.h"
4105+#include "optical_dataglove/position_mapper.h"
4106+#include <boost/smart_ptr.hpp>
4107+#include <sensor_msgs/JointState.h>
4108+
4109+namespace opticaldataglove
4110+{
4111+
4112+/*
4113+ * Interfacing the acquisition and computing process with the hand over ROS
4114+ */
4115+class MessagePublisher
4116+{
4117+public:
4118+
4119+ MessagePublisher(boost::shared_ptr<PositionMapper> position_mapper);
4120+
4121+
4122+ ~MessagePublisher();
4123+
4124+ std::string publishedTopic;
4125+
4126+/*
4127+ * Publishes the position of the hand on the specified topic
4128+ */
4129+ void publish();
4130+/*
4131+ * ROS service to start the publishing
4132+ */
4133+ bool start(opticaldataglove::Start::Request &req, opticaldataglove::Start::Response &res);
4134+/*
4135+ * ROS service to stop the publishing
4136+ */
4137+ bool stop(opticaldataglove::Stop::Request &req, opticaldataglove::Stop::Response &res);
4138+
4139+private:
4140+
4141+ std::map<std::string, JointData> handPositions;
4142+ ros::NodeHandle node;
4143+ boost::shared_ptr<PositionMapper> positionMapper;
4144+ ros::Publisher publisher;
4145+ ros::ServiceServer service_start;
4146+ ros::ServiceServer service_stop;
4147+ bool isPublishing;
4148+};
4149+}
4150+#endif //MESSAGE_PUBLISHER_H_
4151
4152=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/optical_dataglove.h'
4153--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/optical_dataglove.h 1970-01-01 00:00:00 +0000
4154+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/optical_dataglove.h 2010-11-03 16:17:45 +0000
4155@@ -0,0 +1,45 @@
4156+/**
4157+ * @file optical_dataglove.h
4158+ * @author Ugo Cupcic <ugo@shadowrobot.com>
4159+ * @date Wed Jul 7 18:08:41 2010
4160+ *
4161+ * @brief The Optical Dataglove Class.
4162+ *
4163+ *
4164+ */
4165+
4166+#ifndef OPTICAL_DATAGLOVE_H_
4167+#define OPTICAL_DATAGLOVE_H_
4168+
4169+#include <ros/ros.h>
4170+#include <sensor_msgs/Image.h>
4171+#include <image_transport/image_transport.h>
4172+#include "cv_bridge/CvBridge.h"
4173+#include <opencv/cv.h>
4174+#include <opencv/highgui.h>
4175+#include <math.h>
4176+
4177+namespace optical_dataglove
4178+{
4179+ class OpticalDataglove
4180+ {
4181+ public:
4182+ OpticalDataglove(ros::NodeHandle & nh);
4183+ ~OpticalDataglove(){};
4184+
4185+ protected:
4186+ ros::NodeHandle nh_;
4187+ image_transport::ImageTransport it_;
4188+ image_transport::Subscriber image_sub_;
4189+ sensor_msgs::CvBridge bridge_;
4190+ image_transport::Publisher image_pub_;
4191+ cv::Mat img_in_;
4192+ cv::Mat img_hsv_;
4193+ IplImage *cv_input_;
4194+ IplImage cv_output_;
4195+
4196+ void imageCallback (const sensor_msgs::ImageConstPtr & msg_ptr);
4197+ };
4198+};
4199+
4200+#endif /* ! OPTICAL_DATAGLOVE_H_ */
4201
4202=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/position_mapper.h'
4203--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/position_mapper.h 1970-01-01 00:00:00 +0000
4204+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/position_mapper.h 2010-11-03 16:17:45 +0000
4205@@ -0,0 +1,44 @@
4206+#ifndef POSITION_MAPPER_H_
4207+#define POSITION_MAPPER_H_
4208+
4209+#include "optical_dataglove/joint_data.h"
4210+#include "optical_dataglove/data_analyser.h"
4211+#include <boost/smart_ptr.hpp>
4212+#include <map>
4213+
4214+namespace opticaldataglove{
4215+
4216+/*
4217+ * Abstract class to interface the DataAnalyser with the Message Publisher : computing the data received by the analyser and convert it to joints positions
4218+ */
4219+class PositionMapper
4220+{
4221+
4222+public:
4223+
4224+/*
4225+ * Constructor
4226+ */
4227+ PositionMapper()
4228+ {
4229+ };
4230+
4231+/*
4232+ * Destructor
4233+ */
4234+ ~PositionMapper()
4235+ {
4236+ };
4237+
4238+ virtual std::map<std::string, JointData> getHandPositions()=0;
4239+
4240+protected:
4241+
4242+ std::map<std::string, JointData> handPositions;
4243+ std::map<std::string, double> fingerTipPositions;
4244+ boost::shared_ptr<DataAnalyser> dataAnalyser;
4245+ virtual void initializeHandPositions()=0;
4246+};
4247+}
4248+
4249+#endif //POSITION_MAPPER_H_
4250
4251=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/reverse_kinematics.h'
4252--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/reverse_kinematics.h 1970-01-01 00:00:00 +0000
4253+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/reverse_kinematics.h 2010-11-03 16:17:45 +0000
4254@@ -0,0 +1,32 @@
4255+#ifndef REVERSE_KINEMATICS_H_
4256+#define REVERSE_KINEMATICS_H_
4257+
4258+#include "optical_dataglove/position_mapper.h"
4259+
4260+namespace opticaldataglove{
4261+
4262+/*
4263+ * Class to use reverse kinematics to perform the mapping between fingertips position and joint positions
4264+ */
4265+class ReverseKinematics : public PositionMapper
4266+{
4267+public :
4268+
4269+/*
4270+ * Constructor
4271+ * @param data_analyser : DataAnalyser which is getting the fingertips positions
4272+ */
4273+ ReverseKinematics(boost::shared_ptr<DataAnalyser> data_analyser);
4274+
4275+ ~ReverseKinematics();
4276+
4277+ virtual std::map<std::string, JointData> getHandPositions();
4278+
4279+private :
4280+
4281+ virtual void initializeHandPositions();
4282+
4283+};
4284+}
4285+
4286+#endif //REVERSE_KINEMATICS_H_
4287
4288=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/three_dimensions.h'
4289--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/three_dimensions.h 1970-01-01 00:00:00 +0000
4290+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/three_dimensions.h 2010-11-03 16:17:45 +0000
4291@@ -0,0 +1,32 @@
4292+#ifndef THREE_DIMENSIONS_H_
4293+#define THREE_DIMENSIONS_H_
4294+
4295+#include "optical_dataglove/data_analyser.h"
4296+
4297+namespace opticaldataglove{
4298+
4299+/*
4300+ * Class performing the conversion between 3D pictures to fingertips positions
4301+ */
4302+class ThreeDimensionsAnalyser : public DataAnalyser
4303+{
4304+public :
4305+
4306+/*
4307+ * Constructor
4308+ */
4309+ ThreeDimensionsAnalyser();
4310+
4311+/*
4312+ * Destructor
4313+ */
4314+ ~ThreeDimensionsAnalyser();
4315+
4316+
4317+ virtual std::map<std::string, double> getFingerTipPositions();
4318+ virtual std::map<std::string, double> getHandModel();
4319+
4320+};
4321+}
4322+
4323+#endif //THREE_DIMENSIONS_H_
4324
4325=== added file 'shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/two_dimensions.h'
4326--- shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/two_dimensions.h 1970-01-01 00:00:00 +0000
4327+++ shadow_robot/dataglove/dataglove_processing/include/optical_dataglove/two_dimensions.h 2010-11-03 16:17:45 +0000
4328@@ -0,0 +1,32 @@
4329+#ifndef TWO_DIMENSIONS_H_
4330+#define TWO_DIMENSIONS_H_
4331+
4332+#include "optical_dataglove/data_analyser.h"
4333+
4334+namespace opticaldataglove{
4335+
4336+/*
4337+ * Class performing the conversion between 2D pictures to fingertips positions
4338+ */
4339+class TwoDimensionsAnalyser : public DataAnalyser
4340+{
4341+public :
4342+
4343+/*
4344+ * Constructor
4345+ */
4346+ TwoDimensionsAnalyser();
4347+
4348+/*
4349+ * Destructor
4350+ */
4351+ ~TwoDimensionsAnalyser();
4352+
4353+
4354+ virtual std::map<std::string, double> getFingerTipPositions();
4355+ virtual std::map<std::string, double> getHandModel();
4356+
4357+};
4358+}
4359+
4360+#endif //TWO_DIMENSIONS_H_
4361
4362=== added directory 'shadow_robot/dataglove/dataglove_processing/launch'
4363=== added file 'shadow_robot/dataglove/dataglove_processing/launch/usb_camera.launch'
4364--- shadow_robot/dataglove/dataglove_processing/launch/usb_camera.launch 1970-01-01 00:00:00 +0000
4365+++ shadow_robot/dataglove/dataglove_processing/launch/usb_camera.launch 2010-11-03 16:17:45 +0000
4366@@ -0,0 +1,11 @@
4367+<launch>
4368+ <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
4369+ <param name="video_device" value="/dev/video0" />
4370+ <param name="image_width" value="640" />
4371+ <param name="image_height" value="480" />
4372+ <param name="pixel_format" value="mjpeg" />
4373+ <param name="camera_frame_id" value="usb_cam" />
4374+ <param name="io_method" value="mmap"/>
4375+ </node>
4376+ <node name="optical_dataglove" pkg="optical_dataglove" type="optical_dataglove" output="screen" />
4377+</launch>
4378
4379=== added file 'shadow_robot/dataglove/dataglove_processing/mainpage.dox'
4380--- shadow_robot/dataglove/dataglove_processing/mainpage.dox 1970-01-01 00:00:00 +0000
4381+++ shadow_robot/dataglove/dataglove_processing/mainpage.dox 2010-11-03 16:17:45 +0000
4382@@ -0,0 +1,43 @@
4383+/**
4384+\mainpage
4385+\htmlinclude manifest.html
4386+
4387+\b optical_dataglove is ...
4388+
4389+<!--
4390+Provide an overview of your package.
4391+-->
4392+
4393+\section dependencies installing dependencies
4394+\subsection usbcam usb_cam ros driver - Bosch
4395+The optical dataglove package depends on the usb_cam driver from Bosch.
4396+To install it, run the following commands:
4397+\verbatim
4398+cd ~/ros/stacks
4399+svn co https://bosch-ros-pkg.svn.sourceforge.net/svnroot/bosch-ros-pkg
4400+cd ~/ros/stacks/bosch-ros-pkg/trunk/bosch_drivers/usb_cam
4401+rosdep install usb_cam
4402+rosmake --rosdep-install image_view usb_cam
4403+
4404+\endverbatim
4405+
4406+You can test it has been installed by running:
4407+\verbatim
4408+roslaunch optical_dataglove test_usb_cam.launch
4409+\endverbatim
4410+
4411+\section codeapi Code API
4412+
4413+<!--
4414+Provide links to specific auto-generated API documentation within your
4415+package that is of particular interest to a reader. Doxygen will
4416+document pretty much every part of your code, so do your best here to
4417+point the reader to the actual API.
4418+
4419+If your codebase is fairly large or has different sets of APIs, you
4420+should use the doxygen 'group' tag to keep these APIs together. For
4421+example, the roscpp documentation has 'libros' group.
4422+-->
4423+
4424+
4425+*/
4426
4427=== added file 'shadow_robot/dataglove/dataglove_processing/manifest.xml'
4428--- shadow_robot/dataglove/dataglove_processing/manifest.xml 1970-01-01 00:00:00 +0000
4429+++ shadow_robot/dataglove/dataglove_processing/manifest.xml 2010-11-03 16:17:45 +0000
4430@@ -0,0 +1,23 @@
4431+<package>
4432+ <description brief="optical_dataglove">
4433+
4434+ optical_dataglove
4435+
4436+ </description>
4437+ <author>Ugo Cupcic</author>
4438+ <license>BSD</license>
4439+ <review status="unreviewed" notes=""/>
4440+ <url>http://ros.org/wiki/optical_dataglove</url>
4441+ <depend package="roscpp"/>
4442+ <depend package="rospy"/>
4443+ <depend package="std_msgs"/>
4444+ <depend package="sensor_msgs"/>
4445+ <depend package="cv_bridge"/>
4446+ <depend package="opencv2"/>
4447+ <depend package="usb_cam"/>
4448+ <depend package="image_transport"/>
4449+
4450+</package>
4451+
4452+
4453+
4454
4455=== added directory 'shadow_robot/dataglove/dataglove_processing/src'
4456=== added file 'shadow_robot/dataglove/dataglove_processing/src/database_mapping.cpp'
4457--- shadow_robot/dataglove/dataglove_processing/src/database_mapping.cpp 1970-01-01 00:00:00 +0000
4458+++ shadow_robot/dataglove/dataglove_processing/src/database_mapping.cpp 2010-11-03 16:17:45 +0000
4459@@ -0,0 +1,62 @@
4460+#include "optical_dataglove/database_mapping.h"
4461+
4462+namespace opticaldataglove{
4463+
4464+DatabaseMapping::DatabaseMapping(boost::shared_ptr<DataAnalyser> data_analyser): PositionMapper()
4465+{
4466+ this->dataAnalyser=data_analyser;
4467+ initializeHandPositions();
4468+}
4469+
4470+DatabaseMapping::~DatabaseMapping()
4471+{
4472+
4473+}
4474+
4475+std::map<std::string, JointData> DatabaseMapping::getHandPositions()
4476+{
4477+ return handPositions;
4478+}
4479+
4480+void DatabaseMapping::initializeHandPositions()
4481+{
4482+ this->handPositions["THJ1"] = JointData();
4483+ this->handPositions["THJ1"].position =0.0;
4484+ this->handPositions["THJ2"] = JointData();
4485+ this->handPositions["THJ2"].position = 0.0;
4486+ this->handPositions["THJ3"] = JointData();
4487+ this->handPositions["THJ3"].position = 0.0;
4488+ this->handPositions["THJ4"] = JointData();
4489+ this->handPositions["THJ4"].position = 0.0;
4490+ this->handPositions["THJ5"] = JointData();
4491+ this->handPositions["THJ5"].position = 0.0;
4492+ this->handPositions["FFJ0"] = JointData();
4493+ this->handPositions["FFJ0"].position = 0.0;
4494+ this->handPositions["FFJ3"] = JointData();
4495+ this->handPositions["FFJ3"].position = 0.0;
4496+ this->handPositions["FFJ4"] = JointData();
4497+ this->handPositions["FFJ4"].position = 0.0;
4498+ this->handPositions["MFJ0"] = JointData();
4499+ this->handPositions["MFJ0"].position = 0.0;
4500+ this->handPositions["MFJ3"] = JointData();
4501+ this->handPositions["MFJ3"].position = 0.0;
4502+ this->handPositions["MFJ4"] = JointData();
4503+ this->handPositions["MFJ4"].position = 0.0;
4504+ this->handPositions["RFJ0"] = JointData();
4505+ this->handPositions["RFJ0"].position = 0.0;
4506+ this->handPositions["RFJ3"] = JointData();
4507+ this->handPositions["RFJ3"].position = 0.0;
4508+ this->handPositions["RFJ4"] = JointData();
4509+ this->handPositions["RFJ4"].position = 0.0;
4510+ this->handPositions["LFJ0"] = JointData();
4511+ this->handPositions["LFJ0"].position = 0.0;
4512+ this->handPositions["LFJ3"] = JointData();
4513+ this->handPositions["LFJ3"].position = 0.0;
4514+ this->handPositions["LFJ4"] = JointData();
4515+ this->handPositions["LFJ4"].position = 0.0;
4516+ this->handPositions["LFJ5"] = JointData();
4517+ this->handPositions["LFJ5"].position = 0.0;
4518+
4519+}
4520+
4521+}
4522
4523=== added file 'shadow_robot/dataglove/dataglove_processing/src/message_publisher.cpp'
4524--- shadow_robot/dataglove/dataglove_processing/src/message_publisher.cpp 1970-01-01 00:00:00 +0000
4525+++ shadow_robot/dataglove/dataglove_processing/src/message_publisher.cpp 2010-11-03 16:17:45 +0000
4526@@ -0,0 +1,55 @@
4527+#include "optical_dataglove/message_publisher.h"
4528+
4529+namespace opticaldataglove
4530+{
4531+
4532+MessagePublisher::MessagePublisher(boost::shared_ptr<PositionMapper> position_mapper): publishedTopic("joint_state"), node("~"), positionMapper(position_mapper), isPublishing(true)
4533+{
4534+ service_start = node.advertiseService("start", &MessagePublisher::start, this);
4535+ service_stop = node.advertiseService("stop", &MessagePublisher::stop, this);
4536+ publisher = node.advertise<sensor_msgs::JointState>("joint_state",2);
4537+ ROS_INFO("Ready to start");
4538+}
4539+
4540+MessagePublisher::~MessagePublisher()
4541+{
4542+
4543+}
4544+
4545+bool MessagePublisher::start(opticaldataglove::Start::Request &req, opticaldataglove::Start::Response &res)
4546+{
4547+ ROS_INFO("Starting publisher");
4548+ isPublishing = true;
4549+ res.state = true;
4550+ return true;
4551+}
4552+
4553+bool MessagePublisher::stop(opticaldataglove::Stop::Request &req, opticaldataglove::Stop::Response &res)
4554+{
4555+ ROS_INFO("Stoping publisher");
4556+ isPublishing = false;
4557+ res.state = false;
4558+ return true;
4559+}
4560+
4561+void MessagePublisher::publish()
4562+{
4563+ if (isPublishing){
4564+ std::map<std::string, JointData> map = this->positionMapper->getHandPositions();
4565+ sensor_msgs::JointState joint_state;
4566+ joint_state.header.stamp = ros::Time::now();
4567+
4568+ for(std::map<std::string, JointData>::const_iterator it = map.begin(); it != map.end(); it++)
4569+ {
4570+ JointData value = it->second;
4571+ joint_state.name.push_back(it->first);
4572+ joint_state.position.push_back(value.position);
4573+ joint_state.velocity.push_back(0.0);
4574+ joint_state.effort.push_back(0.0);
4575+ }
4576+
4577+ this->publisher.publish(joint_state);
4578+ }
4579+}
4580+
4581+}
4582
4583=== added file 'shadow_robot/dataglove/dataglove_processing/src/optical_dataglove.cpp'
4584--- shadow_robot/dataglove/dataglove_processing/src/optical_dataglove.cpp 1970-01-01 00:00:00 +0000
4585+++ shadow_robot/dataglove/dataglove_processing/src/optical_dataglove.cpp 2010-11-03 16:17:45 +0000
4586@@ -0,0 +1,60 @@
4587+/**
4588+ * @file optical_dataglove.cpp
4589+ * @author Ugo Cupcic <ugo@shadowrobot.com>
4590+ * @date Wed Jul 7 18:07:42 2010
4591+ *
4592+ * @brief The Optical Dataglove class
4593+ *
4594+ *
4595+ */
4596+
4597+#include "optical_dataglove/optical_dataglove.h"
4598+
4599+namespace optical_dataglove
4600+{
4601+ OpticalDataglove::OpticalDataglove (ros::NodeHandle & nh):nh_ (nh), it_ (nh_)
4602+ {
4603+ // Advertise image messages to a topic
4604+ image_pub_ = it_.advertise ("/demo/output_image", 1);
4605+ // Listen for image messages on a topic and setup callback
4606+ image_sub_ = it_.subscribe ("/usb_cam/image_raw", 1, &OpticalDataglove::imageCallback, this);
4607+ // Open HighGUI Window
4608+ cv::namedWindow ("hsv", 1);
4609+ }
4610+
4611+ void OpticalDataglove::imageCallback (const sensor_msgs::ImageConstPtr & msg_ptr)
4612+ {
4613+ // Convert ROS Imput Image Message to IplImage
4614+ try
4615+ {
4616+ cv_input_ = bridge_.imgMsgToCv (msg_ptr, "bgr8");
4617+ }
4618+ catch (sensor_msgs::CvBridgeException error)
4619+ {
4620+ ROS_ERROR ("CvBridge Input Error");
4621+ }
4622+
4623+ // Convert IplImage to cv::Mat
4624+ img_in_ = cv::Mat (cv_input_).clone ();
4625+ // Convert Input image from BGR to HSV
4626+ cv::cvtColor (img_in_, img_hsv_, CV_BGR2HSV);
4627+
4628+ // Display HSV Image in HighGUI window
4629+ cv::imshow ("hsv", img_hsv_);
4630+
4631+ // Needed to keep the HighGUI window open
4632+ cv::waitKey (3);
4633+
4634+ // Convert cv::Mat to IplImage
4635+ cv_output_ = img_hsv_;
4636+ // Convert IplImage to ROS Output Image Message and Publish
4637+ try
4638+ {
4639+ image_pub_.publish (bridge_.cvToImgMsg (&cv_output_, "bgr8"));
4640+ }
4641+ catch (sensor_msgs::CvBridgeException error)
4642+ {
4643+ ROS_ERROR ("CvBridge Output error");
4644+ }
4645+ }
4646+}; //end namespace
4647
4648=== added file 'shadow_robot/dataglove/dataglove_processing/src/optical_dataglove_node.cpp'
4649--- shadow_robot/dataglove/dataglove_processing/src/optical_dataglove_node.cpp 1970-01-01 00:00:00 +0000
4650+++ shadow_robot/dataglove/dataglove_processing/src/optical_dataglove_node.cpp 2010-11-03 16:17:45 +0000
4651@@ -0,0 +1,47 @@
4652+/**
4653+ * @file optical_dataglove_node.cpp
4654+ * @author Ugo Cupcic <ugo@shadowrobot.com>
4655+ * @date Wed Jul 7 18:02:38 2010
4656+ *
4657+ * @brief Contains the main for the optical dataglove. Start a ROS node.
4658+ *
4659+ *
4660+ */
4661+
4662+
4663+#include <boost/smart_ptr.hpp>
4664+#include "optical_dataglove/message_publisher.h"
4665+#include "optical_dataglove/data_analyser.h"
4666+#include "optical_dataglove/two_dimensions.h"
4667+#include "optical_dataglove/position_mapper.h"
4668+#include "optical_dataglove/reverse_kinematics.h"
4669+#include "optical_dataglove/optical_dataglove.h"
4670+
4671+using namespace opticaldataglove;
4672+
4673+int main (int argc, char **argv)
4674+{
4675+ // Initialize ROS Node
4676+ ros::init (argc, argv, "optical_dataglove");
4677+ // Start node and create a Node Handle
4678+ ros::NodeHandle nh;
4679+ // Instantiate
4680+ //boost::shared_ptr<OpticalDataglove> optical_dataglove (new OpticalDataglove(nh));
4681+ boost::shared_ptr<DataAnalyser> data (new TwoDimensionsAnalyser());
4682+ boost::shared_ptr<PositionMapper> pos (new ReverseKinematics(data));
4683+ boost::shared_ptr<MessagePublisher> mes (new MessagePublisher(pos));
4684+ //mes->start();
4685+ // Spin ...
4686+ ros::Rate loop_rate(5);
4687+
4688+ while(ros::ok()){
4689+ //ROS_INFO("ros::ok()");
4690+ mes->publish();
4691+ ros::spinOnce();
4692+ loop_rate.sleep();
4693+ }
4694+
4695+ ros::spin ();
4696+ // ... until done
4697+ return 0;
4698+}
4699
4700=== added directory 'shadow_robot/dataglove/dataglove_processing/src/opticaldataglove'
4701=== added file 'shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/__init__.py'
4702=== added directory 'shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv'
4703=== added file 'shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Start.py'
4704--- shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Start.py 1970-01-01 00:00:00 +0000
4705+++ shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Start.py 2010-11-03 16:17:45 +0000
4706@@ -0,0 +1,199 @@
4707+"""autogenerated by genmsg_py from StartRequest.msg. Do not edit."""
4708+import roslib.message
4709+import struct
4710+
4711+
4712+class StartRequest(roslib.message.Message):
4713+ _md5sum = "d41d8cd98f00b204e9800998ecf8427e"
4714+ _type = "opticaldataglove/StartRequest"
4715+ _has_header = False #flag to mark the presence of a Header object
4716+ _full_text = """
4717+"""
4718+ __slots__ = []
4719+ _slot_types = []
4720+
4721+ def __init__(self, *args, **kwds):
4722+ """
4723+ Constructor. Any message fields that are implicitly/explicitly
4724+ set to None will be assigned a default value. The recommend
4725+ use is keyword arguments as this is more robust to future message
4726+ changes. You cannot mix in-order arguments and keyword arguments.
4727+
4728+ The available fields are:
4729+
4730+
4731+ @param args: complete set of field values, in .msg order
4732+ @param kwds: use keyword arguments corresponding to message field names
4733+ to set specific fields.
4734+ """
4735+ if args or kwds:
4736+ super(StartRequest, self).__init__(*args, **kwds)
4737+
4738+ def _get_types(self):
4739+ """
4740+ internal API method
4741+ """
4742+ return self._slot_types
4743+
4744+ def serialize(self, buff):
4745+ """
4746+ serialize message into buffer
4747+ @param buff: buffer
4748+ @type buff: StringIO
4749+ """
4750+ try:
4751+ pass
4752+ except struct.error, se: self._check_types(se)
4753+ except TypeError, te: self._check_types(te)
4754+
4755+ def deserialize(self, str):
4756+ """
4757+ unpack serialized message in str into this message instance
4758+ @param str: byte array of serialized message
4759+ @type str: str
4760+ """
4761+ try:
4762+ end = 0
4763+ return self
4764+ except struct.error, e:
4765+ raise roslib.message.DeserializationError(e) #most likely buffer underfill
4766+
4767+
4768+ def serialize_numpy(self, buff, numpy):
4769+ """
4770+ serialize message with numpy array types into buffer
4771+ @param buff: buffer
4772+ @type buff: StringIO
4773+ @param numpy: numpy python module
4774+ @type numpy module
4775+ """
4776+ try:
4777+ pass
4778+ except struct.error, se: self._check_types(se)
4779+ except TypeError, te: self._check_types(te)
4780+
4781+ def deserialize_numpy(self, str, numpy):
4782+ """
4783+ unpack serialized message in str into this message instance using numpy for array types
4784+ @param str: byte array of serialized message
4785+ @type str: str
4786+ @param numpy: numpy python module
4787+ @type numpy: module
4788+ """
4789+ try:
4790+ end = 0
4791+ return self
4792+ except struct.error, e:
4793+ raise roslib.message.DeserializationError(e) #most likely buffer underfill
4794+
4795+_struct_I = roslib.message.struct_I
4796+"""autogenerated by genmsg_py from StartResponse.msg. Do not edit."""
4797+import roslib.message
4798+import struct
4799+
4800+
4801+class StartResponse(roslib.message.Message):
4802+ _md5sum = "001fde3cab9e313a150416ff09c08ee4"
4803+ _type = "opticaldataglove/StartResponse"
4804+ _has_header = False #flag to mark the presence of a Header object
4805+ _full_text = """bool state
4806+
4807+
4808+"""
4809+ __slots__ = ['state']
4810+ _slot_types = ['bool']
4811+
4812+ def __init__(self, *args, **kwds):
4813+ """
4814+ Constructor. Any message fields that are implicitly/explicitly
4815+ set to None will be assigned a default value. The recommend
4816+ use is keyword arguments as this is more robust to future message
4817+ changes. You cannot mix in-order arguments and keyword arguments.
4818+
4819+ The available fields are:
4820+ state
4821+
4822+ @param args: complete set of field values, in .msg order
4823+ @param kwds: use keyword arguments corresponding to message field names
4824+ to set specific fields.
4825+ """
4826+ if args or kwds:
4827+ super(StartResponse, self).__init__(*args, **kwds)
4828+ #message fields cannot be None, assign default values for those that are
4829+ if self.state is None:
4830+ self.state = False
4831+ else:
4832+ self.state = False
4833+
4834+ def _get_types(self):
4835+ """
4836+ internal API method
4837+ """
4838+ return self._slot_types
4839+
4840+ def serialize(self, buff):
4841+ """
4842+ serialize message into buffer
4843+ @param buff: buffer
4844+ @type buff: StringIO
4845+ """
4846+ try:
4847+ buff.write(_struct_B.pack(self.state))
4848+ except struct.error, se: self._check_types(se)
4849+ except TypeError, te: self._check_types(te)
4850+
4851+ def deserialize(self, str):
4852+ """
4853+ unpack serialized message in str into this message instance
4854+ @param str: byte array of serialized message
4855+ @type str: str
4856+ """
4857+ try:
4858+ end = 0
4859+ start = end
4860+ end += 1
4861+ (self.state,) = _struct_B.unpack(str[start:end])
4862+ self.state = bool(self.state)
4863+ return self
4864+ except struct.error, e:
4865+ raise roslib.message.DeserializationError(e) #most likely buffer underfill
4866+
4867+
4868+ def serialize_numpy(self, buff, numpy):
4869+ """
4870+ serialize message with numpy array types into buffer
4871+ @param buff: buffer
4872+ @type buff: StringIO
4873+ @param numpy: numpy python module
4874+ @type numpy module
4875+ """
4876+ try:
4877+ buff.write(_struct_B.pack(self.state))
4878+ except struct.error, se: self._check_types(se)
4879+ except TypeError, te: self._check_types(te)
4880+
4881+ def deserialize_numpy(self, str, numpy):
4882+ """
4883+ unpack serialized message in str into this message instance using numpy for array types
4884+ @param str: byte array of serialized message
4885+ @type str: str
4886+ @param numpy: numpy python module
4887+ @type numpy: module
4888+ """
4889+ try:
4890+ end = 0
4891+ start = end
4892+ end += 1
4893+ (self.state,) = _struct_B.unpack(str[start:end])
4894+ self.state = bool(self.state)
4895+ return self
4896+ except struct.error, e:
4897+ raise roslib.message.DeserializationError(e) #most likely buffer underfill
4898+
4899+_struct_I = roslib.message.struct_I
4900+_struct_B = struct.Struct("<B")
4901+class Start(roslib.message.ServiceDefinition):
4902+ _type = 'opticaldataglove/Start'
4903+ _md5sum = '001fde3cab9e313a150416ff09c08ee4'
4904+ _request_class = StartRequest
4905+ _response_class = StartResponse
4906
4907=== added file 'shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Stop.py'
4908--- shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Stop.py 1970-01-01 00:00:00 +0000
4909+++ shadow_robot/dataglove/dataglove_processing/src/opticaldataglove/srv/_Stop.py 2010-11-03 16:17:45 +0000
4910@@ -0,0 +1,199 @@
4911+"""autogenerated by genmsg_py from StopRequest.msg. Do not edit."""
4912+import roslib.message
4913+import struct
4914+
4915+
4916+class StopRequest(roslib.message.Message):
4917+ _md5sum = "d41d8cd98f00b204e9800998ecf8427e"
4918+ _type = "opticaldataglove/StopRequest"
4919+ _has_header = False #flag to mark the presence of a Header object
4920+ _full_text = """
4921+"""
4922+ __slots__ = []
4923+ _slot_types = []
4924+
4925+ def __init__(self, *args, **kwds):
4926+ """
4927+ Constructor. Any message fields that are implicitly/explicitly
4928+ set to None will be assigned a default value. The recommend
4929+ use is keyword arguments as this is more robust to future message
4930+ changes. You cannot mix in-order arguments and keyword arguments.
4931+
4932+ The available fields are:
4933+
4934+
4935+ @param args: complete set of field values, in .msg order
4936+ @param kwds: use keyword arguments corresponding to message field names
4937+ to set specific fields.
4938+ """
4939+ if args or kwds:
4940+ super(StopRequest, self).__init__(*args, **kwds)
4941+
4942+ def _get_types(self):
4943+ """
4944+ internal API method
4945+ """
4946+ return self._slot_types
4947+
4948+ def serialize(self, buff):
4949+ """
4950+ serialize message into buffer
4951+ @param buff: buffer
4952+ @type buff: StringIO
4953+ """
4954+ try:
4955+ pass
4956+ except struct.error, se: self._check_types(se)
4957+ except TypeError, te: self._check_types(te)
4958+
4959+ def deserialize(self, str):
4960+ """
4961+ unpack serialized message in str into this message instance
4962+ @param str: byte array of serialized message
4963+ @type str: str
4964+ """
4965+ try:
4966+ end = 0
4967+ return self
4968+ except struct.error, e:
4969+ raise roslib.message.DeserializationError(e) #most likely buffer underfill
4970+
4971+
4972+ def serialize_numpy(self, buff, numpy):
4973+ """
4974+ serialize message with numpy array types into buffer
4975+ @param buff: buffer
4976+ @type buff: StringIO
4977+ @param numpy: numpy python module
4978+ @type numpy module
4979+ """
4980+ try:
4981+ pass
4982+ except struct.error, se: self._check_types(se)
4983+ except TypeError, te: self._check_types(te)
4984+
4985+ def deserialize_numpy(self, str, numpy):
4986+ """
4987+ unpack serialized message in str into this message instance using numpy for array types
4988+ @param str: byte array of serialized message
4989+ @type str: str
4990+ @param numpy: numpy python module
4991+ @type numpy: module
4992+ """
4993+ try:
4994+ end = 0
4995+ return self
4996+ except struct.error, e:
4997+ raise roslib.message.DeserializationError(e) #most likely buffer underfill
4998+
4999+_struct_I = roslib.message.struct_I
5000+"""autogenerated by genmsg_py from StopResponse.msg. Do not edit."""
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: