├── docs ├── graph_legend.md5 ├── a.jpg ├── b.jpg ├── c.jpg ├── doc.png ├── bc_s.png ├── bdwn.png ├── nav_f.png ├── nav_g.png ├── nav_h.png ├── open.png ├── tab_a.png ├── tab_b.png ├── tab_h.png ├── tab_s.png ├── closed.png ├── doxygen.png ├── splitbar.png ├── sync_off.png ├── sync_on.png ├── arrowdown.png ├── arrowright.png ├── folderopen.png ├── folderclosed.png ├── graph_legend.png ├── search │ ├── close.png │ ├── all_2.js │ ├── all_7.js │ ├── mag_sel.png │ ├── search_l.png │ ├── search_m.png │ ├── search_r.png │ ├── all_1.js │ ├── classes_1.js │ ├── classes_6.js │ ├── classes_0.js │ ├── all_4.js │ ├── classes_3.js │ ├── all_6.js │ ├── classes_5.js │ ├── all_0.js │ ├── pages_0.js │ ├── searchdata.js │ ├── all_5.js │ ├── classes_4.js │ ├── all_3.js │ ├── classes_2.js │ ├── nomatches.html │ ├── all_0.html │ ├── all_1.html │ ├── all_2.html │ ├── all_3.html │ ├── all_4.html │ ├── all_5.html │ ├── all_6.html │ ├── all_7.html │ ├── pages_0.html │ ├── classes_0.html │ ├── classes_1.html │ ├── classes_2.html │ ├── classes_3.html │ ├── classes_4.html │ ├── classes_5.html │ └── classes_6.html ├── track_bottle_01.png ├── screen-kuka-experiment-setup.png ├── screen-hand-with-bottle-markers.png ├── tabs.css ├── dynsections.js ├── dir_3a9699586c2666f5dd2484f674b8e68c.html ├── dir_780cbf03eb2d8df5a53bb6655978a892.html ├── dir_207bc6d5b9f459bd1d0132f8aa4f24f2.html ├── dir_0264a9eeecccc418faa03820b097d351.html ├── dir_6f0590c4ed710fa12cc7e1f58d01679d.html ├── dir_dedda661d52f15c544835a0f3f778e7c.html ├── structView-members.html ├── dir_ff79a391858a1a99b2e44653e7309e6f.html ├── dir_d85810bbcd679b2654eecd298e30bc33.html ├── dir_49e56c817e5e54854c35e136979f97ca.html ├── structMarker-members.html ├── annotated.html ├── all__7_8js_source.html ├── classes__6_8js_source.html ├── all__1_8js_source.html ├── classes__1_8js_source.html ├── all__4_8js_source.html ├── classes__3_8js_source.html ├── all__6_8js_source.html ├── classes__5_8js_source.html ├── all__2_8js_source.html ├── pages__0_8js_source.html ├── classes.html ├── structView.html └── structtams__tracker_1_1Ray-members.html ├── tams_tracker_msgs ├── msg │ ├── RigidStamped.msg │ ├── PeakArrayStamped.msg │ ├── RayArrayStamped.msg │ ├── MarkerArrayStamped.msg │ ├── RigidArrayStamped.msg │ ├── Rigid.msg │ ├── Marker.msg │ ├── Ray.msg │ └── Peak.msg ├── CMakeLists.txt └── package.xml ├── screenshots ├── a.jpg ├── b.jpg ├── c.jpg ├── brush.jpg ├── hand01.png ├── hand02.png ├── screw07.png ├── track_bottle_01.png ├── screen-kuka-experiment-setup.png └── screen-hand-with-bottle-markers.png ├── tams_tracker_launch ├── data │ ├── parameters.yaml │ └── calibration.yaml ├── CMakeLists.txt ├── scripts │ ├── configure_cameras.sh │ ├── configure_cameras_for_calibration.sh │ ├── hand_visualization │ └── handbag_trajectories ├── config │ ├── markers.yaml │ ├── test2.yaml │ ├── test.yaml │ ├── bottle.yaml │ └── brush.yaml ├── package.xml └── launch │ ├── run_filters.launch │ └── tams_tracker.launch ├── .gitignore ├── tams_tracker_imu ├── CMakeLists.txt └── package.xml ├── README.md ├── tams_tracker_node ├── src │ ├── imu.h │ ├── common.h │ ├── record.cpp │ ├── rays.h │ ├── calibration.h │ ├── publish_angles.cpp │ └── markers.h ├── scripts │ ├── record_frames │ └── save_marker_views ├── package.xml └── CMakeLists.txt ├── tams_tracker_imu_firmware └── tams_tracker_imu_firmware.ino ├── tams_tracker_firmware └── tams_tracker_firmware.ino └── tams_tracker_esp_firmware └── tams_tracker_esp_firmware.ino /docs/graph_legend.md5: -------------------------------------------------------------------------------- 1 | 387ff8eb65306fa251338d3c9bd7bfff -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/RigidStamped.msg: -------------------------------------------------------------------------------- 1 | Header header 2 | Rigid rigid 3 | -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/PeakArrayStamped.msg: -------------------------------------------------------------------------------- 1 | Header header 2 | Peak[] peaks 3 | -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/RayArrayStamped.msg: -------------------------------------------------------------------------------- 1 | Header header 2 | Ray[] rays 3 | -------------------------------------------------------------------------------- /docs/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/a.jpg -------------------------------------------------------------------------------- /docs/b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/b.jpg -------------------------------------------------------------------------------- /docs/c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/c.jpg -------------------------------------------------------------------------------- /docs/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/doc.png -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/MarkerArrayStamped.msg: -------------------------------------------------------------------------------- 1 | Header header 2 | Marker[] markers 3 | -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/RigidArrayStamped.msg: -------------------------------------------------------------------------------- 1 | Header header 2 | Rigid[] rigids 3 | -------------------------------------------------------------------------------- /docs/bc_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/bc_s.png -------------------------------------------------------------------------------- /docs/bdwn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/bdwn.png -------------------------------------------------------------------------------- /docs/nav_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/nav_f.png -------------------------------------------------------------------------------- /docs/nav_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/nav_g.png -------------------------------------------------------------------------------- /docs/nav_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/nav_h.png -------------------------------------------------------------------------------- /docs/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/open.png -------------------------------------------------------------------------------- /docs/tab_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/tab_a.png -------------------------------------------------------------------------------- /docs/tab_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/tab_b.png -------------------------------------------------------------------------------- /docs/tab_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/tab_h.png -------------------------------------------------------------------------------- /docs/tab_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/tab_s.png -------------------------------------------------------------------------------- /docs/closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/closed.png -------------------------------------------------------------------------------- /docs/doxygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/doxygen.png -------------------------------------------------------------------------------- /docs/splitbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/splitbar.png -------------------------------------------------------------------------------- /docs/sync_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/sync_off.png -------------------------------------------------------------------------------- /docs/sync_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/sync_on.png -------------------------------------------------------------------------------- /screenshots/a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/a.jpg -------------------------------------------------------------------------------- /screenshots/b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/b.jpg -------------------------------------------------------------------------------- /screenshots/c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/c.jpg -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/Rigid.msg: -------------------------------------------------------------------------------- 1 | uint32 id 2 | string name 3 | geometry_msgs/Pose pose 4 | -------------------------------------------------------------------------------- /docs/arrowdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/arrowdown.png -------------------------------------------------------------------------------- /docs/arrowright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/arrowright.png -------------------------------------------------------------------------------- /docs/folderopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/folderopen.png -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/Marker.msg: -------------------------------------------------------------------------------- 1 | uint32 id 2 | string name 3 | geometry_msgs/Point position 4 | -------------------------------------------------------------------------------- /docs/folderclosed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/folderclosed.png -------------------------------------------------------------------------------- /docs/graph_legend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/graph_legend.png -------------------------------------------------------------------------------- /docs/search/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/search/close.png -------------------------------------------------------------------------------- /screenshots/brush.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/brush.jpg -------------------------------------------------------------------------------- /screenshots/hand01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/hand01.png -------------------------------------------------------------------------------- /screenshots/hand02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/hand02.png -------------------------------------------------------------------------------- /docs/search/all_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['view',['View',['../structView.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/all_7.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['view',['View',['../structView.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/mag_sel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/search/mag_sel.png -------------------------------------------------------------------------------- /docs/search/search_l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/search/search_l.png -------------------------------------------------------------------------------- /docs/search/search_m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/search/search_m.png -------------------------------------------------------------------------------- /docs/search/search_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/search/search_r.png -------------------------------------------------------------------------------- /docs/track_bottle_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/track_bottle_01.png -------------------------------------------------------------------------------- /screenshots/screw07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/screw07.png -------------------------------------------------------------------------------- /docs/search/all_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['marker',['Marker',['../structMarker.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/classes_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['view',['View',['../structView.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/classes_6.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['view',['View',['../structView.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/classes_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['marker',['Marker',['../structMarker.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /screenshots/track_bottle_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/track_bottle_01.png -------------------------------------------------------------------------------- /docs/screen-kuka-experiment-setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/screen-kuka-experiment-setup.png -------------------------------------------------------------------------------- /docs/screen-hand-with-bottle-markers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/docs/screen-hand-with-bottle-markers.png -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/Ray.msg: -------------------------------------------------------------------------------- 1 | uint32 marker_id 2 | string marker_name 3 | geometry_msgs/Point origin 4 | geometry_msgs/Vector3 direction 5 | -------------------------------------------------------------------------------- /screenshots/screen-kuka-experiment-setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/screen-kuka-experiment-setup.png -------------------------------------------------------------------------------- /screenshots/screen-hand-with-bottle-markers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TAMS-Group/tams_tracker/HEAD/screenshots/screen-hand-with-bottle-markers.png -------------------------------------------------------------------------------- /docs/search/all_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['point',['Point',['../structtams__tracker_1_1Camera_1_1Point.html',1,'tams_tracker::Camera']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/classes_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['point',['Point',['../structtams__tracker_1_1Camera_1_1Point.html',1,'tams_tracker::Camera']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/all_6.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['trajectory',['Trajectory',['../structtams__tracker_1_1Camera_1_1Trajectory.html',1,'tams_tracker::Camera']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/classes_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['trajectory',['Trajectory',['../structtams__tracker_1_1Camera_1_1Trajectory.html',1,'tams_tracker::Camera']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /tams_tracker_msgs/msg/Peak.msg: -------------------------------------------------------------------------------- 1 | uint32 camera_index 2 | uint32 marker_id 3 | string marker_name 4 | float64 marker_confidence 5 | float64 x 6 | float64 y 7 | float64 brightness 8 | -------------------------------------------------------------------------------- /docs/search/all_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['low_2dcost_20multi_2dview_20pose_20tracking_20using_20active_20markers',['Low-cost multi-view pose tracking using active markers',['../index.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/pages_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['low_2dcost_20multi_2dview_20pose_20tracking_20using_20active_20markers',['Low-cost multi-view pose tracking using active markers',['../index.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /tams_tracker_launch/data/parameters.yaml: -------------------------------------------------------------------------------- 1 | visualization_ray_width: 0.002 2 | min_distance_to_camera: 0.1 3 | visualization_marker_size: 0.01 4 | visualization_ray_length: 10 5 | marker_radius: 0.01 6 | min_marker_confidence: 10 7 | max_reprojection_error: 0.005 8 | tracking_time: 3.0 9 | -------------------------------------------------------------------------------- /tams_tracker_launch/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.3) 2 | project(tams_tracker_launch) 3 | 4 | find_package(catkin REQUIRED COMPONENTS 5 | tams_tracker_node 6 | ${MSG_DEPS} 7 | ) 8 | 9 | catkin_package( 10 | CATKIN_DEPENDS 11 | tams_tracker_node 12 | ${MSG_DEPS} 13 | ) 14 | -------------------------------------------------------------------------------- /docs/search/searchdata.js: -------------------------------------------------------------------------------- 1 | var indexSectionsWithContent = 2 | { 3 | 0: "lmv", 4 | 1: "mv", 5 | 2: "l" 6 | }; 7 | 8 | var indexSectionNames = 9 | { 10 | 0: "all", 11 | 1: "classes", 12 | 2: "pages" 13 | }; 14 | 15 | var indexSectionLabels = 16 | { 17 | 0: "All", 18 | 1: "Classes", 19 | 2: "Pages" 20 | }; 21 | 22 | -------------------------------------------------------------------------------- /tams_tracker_launch/scripts/configure_cameras.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for i in 0 1 2 3 4 5 4 | do 5 | 6 | v4l2-ctl --set-ctrl=gain_automatic=0 -d /dev/video$i 7 | v4l2-ctl --set-ctrl=gain=10 -d /dev/video$i 8 | 9 | v4l2-ctl --set-ctrl=auto_exposure=1 -d /dev/video$i 10 | v4l2-ctl --set-ctrl=exposure=50 -d /dev/video$i 11 | 12 | done 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /tams_tracker_launch/config/markers.yaml: -------------------------------------------------------------------------------- 1 | markers: 2 | - { id: 1, frequency: 2 } 3 | - { id: 2, frequency: 3 } 4 | - { id: 3, frequency: 4 } 5 | - { id: 4, frequency: 5 } 6 | - { id: 5, frequency: 6 } 7 | - { id: 6, frequency: 7 } 8 | - { id: 7, frequency: 8 } 9 | - { id: 8, frequency: 9 } 10 | - { id: 9, frequency: 10 } 11 | - { id: 10, frequency: 11 } 12 | - { id: 11, frequency: 12 } 13 | - { id: 12, frequency: 13 } 14 | - { id: 13, frequency: 14 } 15 | -------------------------------------------------------------------------------- /docs/search/all_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ray',['Ray',['../structtams__tracker_1_1Ray.html',1,'tams_tracker']]], 4 | ['raybuilder',['RayBuilder',['../classtams__tracker_1_1RayBuilder.html',1,'tams_tracker']]], 5 | ['rigid',['Rigid',['../structtams__tracker_1_1Config_1_1Rigid.html',1,'tams_tracker::Config']]], 6 | ['rigid',['Rigid',['../structtams__tracker_1_1Rigid.html',1,'tams_tracker']]], 7 | ['rigidtracker',['RigidTracker',['../classtams__tracker_1_1RigidTracker.html',1,'tams_tracker']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/classes_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ray',['Ray',['../structtams__tracker_1_1Ray.html',1,'tams_tracker']]], 4 | ['raybuilder',['RayBuilder',['../classtams__tracker_1_1RayBuilder.html',1,'tams_tracker']]], 5 | ['rigid',['Rigid',['../structtams__tracker_1_1Config_1_1Rigid.html',1,'tams_tracker::Config']]], 6 | ['rigid',['Rigid',['../structtams__tracker_1_1Rigid.html',1,'tams_tracker']]], 7 | ['rigidtracker',['RigidTracker',['../classtams__tracker_1_1RigidTracker.html',1,'tams_tracker']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/all_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['marker',['Marker',['../structtams__tracker_1_1Config_1_1Rigid_1_1Marker.html',1,'tams_tracker::Config::Rigid']]], 4 | ['marker',['Marker',['../structtams__tracker_1_1Marker.html',1,'tams_tracker']]], 5 | ['marker',['Marker',['../structMarker.html',1,'']]], 6 | ['marker',['Marker',['../structtams__tracker_1_1Config_1_1Marker.html',1,'tams_tracker::Config']]], 7 | ['markerdetector',['MarkerDetector',['../classtams__tracker_1_1MarkerDetector.html',1,'tams_tracker']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/classes_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['marker',['Marker',['../structtams__tracker_1_1Config_1_1Rigid_1_1Marker.html',1,'tams_tracker::Config::Rigid']]], 4 | ['marker',['Marker',['../structtams__tracker_1_1Marker.html',1,'tams_tracker']]], 5 | ['marker',['Marker',['../structMarker.html',1,'']]], 6 | ['marker',['Marker',['../structtams__tracker_1_1Config_1_1Marker.html',1,'tams_tracker::Config']]], 7 | ['markerdetector',['MarkerDetector',['../classtams__tracker_1_1MarkerDetector.html',1,'tams_tracker']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/nomatches.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
No Matches
10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /tams_tracker_launch/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | tams_tracker_launch 4 | 0.0.0 5 | - 6 | 7 | Philipp Ruppel 8 | Philipp Ruppel 9 | 10 | - 11 | 12 | catkin 13 | 14 | tams_tracker_node 15 | tams_tracker_node 16 | 17 | -------------------------------------------------------------------------------- /tams_tracker_msgs/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.3) 2 | project(tams_tracker_msgs) 3 | 4 | set(MSG_DEPS 5 | geometry_msgs 6 | std_msgs 7 | ) 8 | 9 | find_package(catkin REQUIRED COMPONENTS 10 | message_generation 11 | ${MSG_DEPS} 12 | ) 13 | 14 | add_message_files(FILES 15 | MarkerArrayStamped.msg 16 | Marker.msg 17 | PeakArrayStamped.msg 18 | Peak.msg 19 | RayArrayStamped.msg 20 | Ray.msg 21 | RigidArrayStamped.msg 22 | Rigid.msg 23 | RigidStamped.msg 24 | ) 25 | 26 | generate_messages( 27 | DEPENDENCIES 28 | ${MSG_DEPS} 29 | ) 30 | 31 | catkin_package( 32 | CATKIN_DEPENDS 33 | message_runtime 34 | ${MSG_DEPS} 35 | ) 36 | -------------------------------------------------------------------------------- /tams_tracker_msgs/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | tams_tracker_msgs 4 | 0.0.0 5 | - 6 | 7 | Philipp Ruppel 8 | Philipp Ruppel 9 | 10 | - 11 | 12 | catkin 13 | 14 | geometry_msgs 15 | geometry_msgs 16 | 17 | message_generation 18 | message_runtime 19 | 20 | std_msgs 21 | std_msgs 22 | 23 | -------------------------------------------------------------------------------- /tams_tracker_launch/scripts/configure_cameras_for_calibration.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | v4l2-ctl --set-ctrl=gain_automatic=0 -d /dev/video0 4 | v4l2-ctl --set-ctrl=gain=10 -d /dev/video0 5 | 6 | v4l2-ctl --set-ctrl=gain_automatic=0 -d /dev/video1 7 | v4l2-ctl --set-ctrl=gain=10 -d /dev/video1 8 | 9 | v4l2-ctl --set-ctrl=gain_automatic=0 -d /dev/video2 10 | v4l2-ctl --set-ctrl=gain=10 -d /dev/video2 11 | 12 | 13 | 14 | v4l2-ctl --set-ctrl=auto_exposure=1 -d /dev/video0 15 | v4l2-ctl --set-ctrl=exposure=100 -d /dev/video0 16 | 17 | v4l2-ctl --set-ctrl=auto_exposure=1 -d /dev/video1 18 | v4l2-ctl --set-ctrl=exposure=100 -d /dev/video1 19 | 20 | v4l2-ctl --set-ctrl=auto_exposure=1 -d /dev/video2 21 | v4l2-ctl --set-ctrl=exposure=100 -d /dev/video2 22 | -------------------------------------------------------------------------------- /tams_tracker_imu/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.9.3) 2 | project(tams_tracker_imu) 3 | 4 | set(CMAKE_CXX_FLAGS "-std=c++11") 5 | 6 | set(CMAKE_BUILD_TYPE Release) 7 | 8 | find_package(catkin REQUIRED COMPONENTS 9 | roscpp 10 | tf 11 | tf_conversions 12 | sensor_msgs 13 | eigen_conversions 14 | ) 15 | 16 | catkin_package( 17 | CATKIN_DEPENDS 18 | roscpp 19 | tf 20 | tf_conversions 21 | sensor_msgs 22 | eigen_conversions 23 | ) 24 | 25 | include_directories( 26 | ${catkin_INCLUDE_DIRS} 27 | ) 28 | 29 | add_executable(tams_tracker_imu src/tams_tracker_imu.cpp) 30 | add_dependencies(tams_tracker_imu ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 31 | target_link_libraries(tams_tracker_imu ${catkin_LIBRARIES} ${Boost_LIBRARIES}) 32 | -------------------------------------------------------------------------------- /tams_tracker_launch/config/test2.yaml: -------------------------------------------------------------------------------- 1 | markers: 2 | - { id: 1, frequency: 3 } 3 | - { id: 2, frequency: 4 } 4 | - { id: 3, frequency: 5 } 5 | - { id: 4, frequency: 6 } 6 | rigids: 7 | - id: 5 8 | name: test 9 | markers: 10 | - id: 3 11 | position: 12 | x: 0.02643687162389935 13 | y: 0.01289456555861024 14 | z: -0.0374178610756683 15 | - id: 1 16 | position: 17 | y: 0.02599943221380618 18 | x: -0.01288707376721318 19 | z: 0.02070670834513433 20 | - id: 2 21 | position: 22 | x: -0.01831736465319821 23 | y: -0.01032580471342741 24 | z: 0.02561884128940639 25 | - id: 4 26 | position: 27 | x: 0.004767566796512024 28 | y: -0.02856819305898903 29 | z: -0.008907688558872418 30 | -------------------------------------------------------------------------------- /tams_tracker_launch/launch/run_filters.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tams_tracker_imu/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tams_tracker_imu 5 | 0.0.0 6 | - 7 | 8 | Philipp Ruppel 9 | Philipp Ruppel 10 | 11 | ... 12 | 13 | catkin 14 | 15 | roscpp 16 | roscpp 17 | 18 | tf 19 | tf 20 | 21 | tf_conversions 22 | tf_conversions 23 | 24 | sensor_msgs 25 | sensor_msgs 26 | 27 | eigen_conversions 28 | eigen_conversions 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /tams_tracker_launch/config/test.yaml: -------------------------------------------------------------------------------- 1 | markers: 2 | - { id: 1, frequency: 3 } 3 | - { id: 2, frequency: 4 } 4 | - { id: 3, frequency: 5 } 5 | - { id: 4, frequency: 6 } 6 | rigids: 7 | - id: 5 8 | name: test 9 | imu: 10 | topic: /tams_tracker_imu/data_raw 11 | orientation: 12 | x: -0.686077 13 | y: -0.673728 14 | z: 0.0185711 15 | w: 0.273941 16 | markers: 17 | - id: 4 18 | position: 19 | x: -0.009591215811553117 20 | y: 0.02371775085076902 21 | z: 0.01180364559359193 22 | - id: 2 23 | position: 24 | y: 0.01588852630115065 25 | x: 0.02736435642261581 26 | z: -0.005101557278452129 27 | - id: 1 28 | position: 29 | y: -0.01852474541072804 30 | x: 0.02215041898720509 31 | z: -0.01455289879717164 32 | - id: 3 33 | position: 34 | y: -0.02108153174119161 35 | x: -0.03992355959826779 36 | z: 0.007850810482031623 37 | -------------------------------------------------------------------------------- /tams_tracker_launch/launch/tams_tracker.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /docs/search/all_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/all_7.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/pages_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /docs/search/classes_6.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
Loading...
12 |
13 | 16 |
Searching...
17 |
No Matches
18 | 24 |
25 | 26 | 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Low-cost multi-view pose tracking using active markers 2 | 3 | - Pulsed LEDs as active markers 4 | - Works with standard webcams 5 | - Fast 2D marker identification 6 | - Robust 3D marker position reconstruction 7 | - Precise 6D rigid object pose reconstruction 8 | - Tracking supports fusion with IMU data 9 | - ROS interface, usable with robots and other sensors 10 | - Fully open-source software 11 | 12 | ![](screenshots/b.jpg) 13 | 14 | 15 | ## Instrumented Objects 16 | 17 | Teach robots by recording demonstrations of manipulation tasks using instrumented objects and tracking gloves. 18 | 19 | ![](screenshots/a.jpg) 20 | 21 | ![](screenshots/screen-hand-with-bottle-markers.png) 22 | 23 | 24 | ## Visual-Inertial Sensor Fusion 25 | 26 | Increase reliability under marker occlusions through crossmodal sensor fusion with IMUs. 27 | 28 | ![](screenshots/c.jpg) 29 | 30 | 31 | ## Robot Calibration 32 | 33 | Use webcams and LEDs to accurately calibrate your robots. 34 | 35 | ![](screenshots/screen-kuka-experiment-setup.png) 36 | 37 | 38 | ## ROS Integration 39 | 40 | Marker positions and object poses are published as ROS messages for easy integration into robot applications and machine learning projects. 41 | 42 | ![](screenshots/track_bottle_01.png) 43 | 44 | ## Links 45 | 46 | - https://github.com/TAMS-Group/tams_tracker 47 | - https://tams-group.github.io/bio_ik/ 48 | 49 | -------------------------------------------------------------------------------- /docs/tabs.css: -------------------------------------------------------------------------------- 1 | .tabs, .tabs2, .tabs3 { 2 | background-image: url('tab_b.png'); 3 | width: 100%; 4 | z-index: 101; 5 | font-size: 13px; 6 | font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; 7 | } 8 | 9 | .tabs2 { 10 | font-size: 10px; 11 | } 12 | .tabs3 { 13 | font-size: 9px; 14 | } 15 | 16 | .tablist { 17 | margin: 0; 18 | padding: 0; 19 | display: table; 20 | } 21 | 22 | .tablist li { 23 | float: left; 24 | display: table-cell; 25 | background-image: url('tab_b.png'); 26 | line-height: 36px; 27 | list-style: none; 28 | } 29 | 30 | .tablist a { 31 | display: block; 32 | padding: 0 20px; 33 | font-weight: bold; 34 | background-image:url('tab_s.png'); 35 | background-repeat:no-repeat; 36 | background-position:right; 37 | color: #283A5D; 38 | text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); 39 | text-decoration: none; 40 | outline: none; 41 | } 42 | 43 | .tabs3 .tablist a { 44 | padding: 0 10px; 45 | } 46 | 47 | .tablist a:hover { 48 | background-image: url('tab_h.png'); 49 | background-repeat:repeat-x; 50 | color: #fff; 51 | text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); 52 | text-decoration: none; 53 | } 54 | 55 | .tablist li.current a { 56 | background-image: url('tab_a.png'); 57 | background-repeat:repeat-x; 58 | color: #fff; 59 | text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); 60 | } 61 | -------------------------------------------------------------------------------- /tams_tracker_node/src/imu.h: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | #pragma once 4 | 5 | #include "common.h" 6 | 7 | namespace tams_tracker { 8 | 9 | class Imu { 10 | ros::NodeHandle node; 11 | ros::Subscriber subscriber; 12 | mutable std::mutex x_mutex; 13 | Eigen::Vector3d x_angular_velocity = Eigen::Vector3d::Zero(); 14 | bool ok = false; 15 | 16 | public: 17 | Imu() {} 18 | Imu(const std::string &topic_name) { 19 | if (!topic_name.empty()) { 20 | ROS_INFO_STREAM("imu topic " << topic_name); 21 | boost::function callback = 22 | [this](const sensor_msgs::Imu &msg) { 23 | std::lock_guard lock(x_mutex); 24 | ok = true; 25 | tf::vectorMsgToEigen(msg.angular_velocity, x_angular_velocity); 26 | }; 27 | subscriber = node.subscribe(topic_name, 10, callback); 28 | } 29 | } 30 | bool hasReceivedMessages() const { return ok; } 31 | Eigen::Vector3d getAngularVelocity() const { 32 | Eigen::Vector3d angular_velocity; 33 | { 34 | std::lock_guard lock(x_mutex); 35 | angular_velocity = x_angular_velocity; 36 | } 37 | /*ROS_INFO_STREAM("imu " << angular_velocity.x() << " " 38 | << angular_velocity.y() << " " 39 | << angular_velocity.z());*/ 40 | return angular_velocity; 41 | } 42 | }; 43 | 44 | } // namespace tams_tracker 45 | -------------------------------------------------------------------------------- /tams_tracker_node/src/common.h: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | #pragma once 4 | 5 | #include 6 | 7 | #include 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | 31 | #include 32 | #include 33 | 34 | #include 35 | 36 | #include 37 | 38 | #include 39 | #include 40 | #include 41 | #include 42 | 43 | #include 44 | 45 | #include 46 | 47 | #include 48 | 49 | #include 50 | 51 | #include 52 | #include 53 | 54 | #include 55 | #include 56 | 57 | #include 58 | 59 | #include 60 | 61 | #include 62 | 63 | #include 64 | 65 | #include 66 | 67 | namespace tams_tracker { 68 | 69 | double squared(double d) { return d * d; } 70 | 71 | } // namespace tams_tracker 72 | -------------------------------------------------------------------------------- /tams_tracker_launch/config/bottle.yaml: -------------------------------------------------------------------------------- 1 | markers: 2 | - { id: 1, frequency: 2 } 3 | - { id: 2, frequency: 3 } 4 | - { id: 3, frequency: 4 } 5 | - { id: 4, frequency: 5 } 6 | - { id: 5, frequency: 6 } 7 | - { id: 6, frequency: 7 } 8 | - { id: 7, frequency: 8 } 9 | - { id: 8, frequency: 9 } 10 | - { id: 9, frequency: 10 } 11 | - { id: 10, frequency: 11 } 12 | - { id: 11, frequency: 12 } 13 | - { id: 12, frequency: 13 } 14 | - { id: 13, frequency: 14 } 15 | rigids: 16 | - id: 5 17 | name: bottle 18 | markers: 19 | - id: 8 20 | position: 21 | x: -0.004924747268085271 22 | y: 0.06271904899221323 23 | z: -0.04102270570913806 24 | - id: 1 25 | position: 26 | y: -0.06483658378475692 27 | x: 0.01864883424540117 28 | z: -0.02068157575547783 29 | - id: 7 30 | position: 31 | y: 0.07002121465355042 32 | x: -0.02859201058158393 33 | z: 0.008585107756586548 34 | - id: 5 35 | position: 36 | y: -0.05449364733807639 37 | x: -0.03817287140425184 38 | z: 0.01869625400957256 39 | - id: 3 40 | position: 41 | y: -0.05655355343935121 42 | x: -0.02750029664860519 43 | z: -0.02348526399387418 44 | - id: 2 45 | position: 46 | y: 0.06205476366078089 47 | x: 0.03686616387935688 48 | z: -0.0175879152155449 49 | - id: 6 50 | position: 51 | y: 0.05040218755777908 52 | x: 0.0297997125645846 53 | z: 0.01785165617119075 54 | - id: 4 55 | position: 56 | y: -0.0531502111771706 57 | x: 0.01478376387168187 58 | z: 0.03529580789894328 59 | -------------------------------------------------------------------------------- /tams_tracker_imu_firmware/tams_tracker_imu_firmware.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | int imu_address = 0x68; 4 | 5 | void setup() { 6 | 7 | Serial.begin(9600); 8 | 9 | Wire.begin(); 10 | 11 | // wake up 12 | Wire.beginTransmission(imu_address); 13 | Wire.write(0x6B); 14 | Wire.write(0); 15 | Wire.endTransmission(true); 16 | 17 | // set gyro range to 250deg/s 18 | Wire.beginTransmission(imu_address); //I2C address of the MPU 19 | Wire.write(0x1B); 20 | Wire.write(0x00000000); //Setting the gyro to full scale +/- 250deg./s 21 | Wire.endTransmission(); 22 | 23 | // set accelerometer range to 2g 24 | Wire.beginTransmission(imu_address); 25 | Wire.write(0x1C); 26 | Wire.write(0b00000000); 27 | Wire.endTransmission(); 28 | } 29 | 30 | void loop() { 31 | 32 | Wire.beginTransmission(imu_address); 33 | Wire.write(0x3B); 34 | Wire.endTransmission(false); 35 | 36 | Wire.requestFrom(imu_address, 14, true); 37 | int16_t ax = Wire.read() << 8 | Wire.read(); 38 | int16_t ay = Wire.read() << 8 | Wire.read(); 39 | int16_t az = Wire.read() << 8 | Wire.read(); 40 | int16_t t = Wire.read() << 8 | Wire.read(); 41 | int16_t rx = Wire.read() << 8 | Wire.read(); 42 | int16_t ry = Wire.read() << 8 | Wire.read(); 43 | int16_t rz = Wire.read() << 8 | Wire.read(); 44 | 45 | Serial.print("imu "); 46 | Serial.print(ax); 47 | Serial.print(" "); 48 | Serial.print(ay); 49 | Serial.print(" "); 50 | Serial.print(az); 51 | Serial.print(" "); 52 | Serial.print(rx); 53 | Serial.print(" "); 54 | Serial.print(ry); 55 | Serial.print(" "); 56 | Serial.print(rz); 57 | Serial.print(" "); 58 | Serial.println(ax + ay + az + rx + ry + rz); // checksum 59 | delay(20); 60 | } 61 | -------------------------------------------------------------------------------- /tams_tracker_node/src/record.cpp: -------------------------------------------------------------------------------- 1 | #include "common.h" 2 | 3 | int main(int argc, char **argv) { 4 | 5 | ros::init(argc, argv, "node"); 6 | 7 | ros::NodeHandle node; 8 | 9 | ros::AsyncSpinner spinner(4); 10 | spinner.start(); 11 | 12 | std::vector cameras; 13 | for (size_t i = 0; ; i++) { 14 | cameras.emplace_back(i); 15 | if(!cameras.back().isOpened()) { 16 | cameras.pop_back(); 17 | break; 18 | } 19 | } 20 | 21 | mkdir("recordings", 0777); 22 | 23 | std::string path = 24 | "recordings/rec-" + std::to_string(ros::WallTime::now().toNSec()); 25 | mkdir(path.c_str(), 0777); 26 | 27 | std::vector writers; 28 | for (size_t i = 0; i < cameras.size(); i++) { 29 | writers.emplace_back(); 30 | cv::Mat image; 31 | cameras[i].read(image); 32 | writers.back().open(path + "/" + std::to_string(i) + ".avi", 33 | CV_FOURCC('M', 'J', '2', 'C'), 2, 34 | cv::Size(image.cols, image.rows), true); 35 | } 36 | 37 | std::vector images(cameras.size()); 38 | 39 | while (ros::ok()) { 40 | 41 | for (size_t i = 0; i < cameras.size(); i++) { 42 | cameras[i].read(images[i]); 43 | } 44 | 45 | for (size_t i = 0; i < cameras.size(); i++) { 46 | cv::imshow(std::to_string(i).c_str(), images[i]); 47 | } 48 | 49 | int key = cv::waitKey(1); 50 | // ROS_INFO_STREAM(key); 51 | if (key == 27) 52 | break; 53 | if (key == 32) { 54 | for (size_t i = 0; i < cameras.size(); i++) { 55 | writers[i].write(images[i]); 56 | } 57 | for (size_t i = 0; i < cameras.size(); i++) { 58 | images[i] = images[i] / 2 + 127; 59 | cv::imshow(std::to_string(i).c_str(), images[i]); 60 | } 61 | cv::waitKey(100); 62 | } 63 | 64 | // ros::Duration(0.5).sleep(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /tams_tracker_node/src/rays.h: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | #pragma once 4 | 5 | #include "common.h" 6 | 7 | #include "calibration.h" 8 | #include "camera.h" 9 | #include "config.h" 10 | 11 | namespace tams_tracker { 12 | 13 | struct Ray { 14 | size_t marker_index; 15 | Eigen::Vector3d origin; 16 | Eigen::Vector3d direction; 17 | }; 18 | 19 | class RayBuilder { 20 | Config config; 21 | Calibration calibration; 22 | std::vector points; 23 | std::vector rays, x_rays; 24 | mutable std::mutex x_mutex; 25 | 26 | public: 27 | RayBuilder(const Config &config, const Calibration &calibration) 28 | : config(config), calibration(calibration) {} 29 | 30 | void update(const std::deque &cameras) { 31 | rays.clear(); 32 | for (size_t icam = 0; icam < cameras.size(); icam++) { 33 | auto &cam = cameras[icam]; 34 | cam.getPoints(points); 35 | for (auto &pt : points) { 36 | Ray ray; 37 | cv::Point2f point(pt.position.x(), pt.position.y()); 38 | cv::Point2f p; 39 | cv::undistortPoints(cv::_InputArray(&point, 1), cv::_OutputArray(&p, 1), 40 | calibration.camera_matrices[icam], 41 | calibration.dist_coeffs[icam]); 42 | ray.origin = calibration.camera_poses[icam].translation(); 43 | ray.direction = 44 | (calibration.camera_poses[icam] * Eigen::Vector3d(p.x, p.y, 1.0) - 45 | ray.origin) 46 | .normalized(); 47 | ray.marker_index = pt.marker_index; 48 | rays.push_back(ray); 49 | } 50 | } 51 | { 52 | std::lock_guard lock(x_mutex); 53 | x_rays = rays; 54 | } 55 | } 56 | void getRays(std::vector &rays) { 57 | { 58 | std::lock_guard lock(x_mutex); 59 | rays = x_rays; 60 | } 61 | } 62 | }; 63 | 64 | } // namespace tams_tracker 65 | -------------------------------------------------------------------------------- /tams_tracker_node/scripts/record_frames: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import rospy 4 | import re 5 | import os 6 | import sys 7 | import control_msgs.msg 8 | import trajectory_msgs.msg 9 | import random 10 | import math 11 | import numpy as np 12 | import sensor_msgs.msg 13 | import curses 14 | import tams_tracker_msgs.msg 15 | import json 16 | import time 17 | import cv2 18 | 19 | def main(stdscr): 20 | 21 | rospy.init_node("save_marker_views") 22 | 23 | stdscr.clear() 24 | 25 | counter = 0 26 | 27 | cameras = [cv2.VideoCapture(i) for i in range(3)] 28 | 29 | path = "recordings/rec-" + str(time.time()) 30 | os.mkdir(path) 31 | 32 | stdscr.nodelay(True) 33 | 34 | while not rospy.is_shutdown(): 35 | 36 | stdscr.clear() 37 | stdscr.addstr("tams tracker multiview frame recorder\n\n") 38 | stdscr.addstr("press [space] to save a set of images\n") 39 | stdscr.addstr("press [return] or [escape] to exit\n") 40 | stdscr.addstr("\n") 41 | stdscr.addstr(str(counter) + " image sets\n") 42 | stdscr.addstr("\n") 43 | stdscr.refresh() 44 | 45 | images = [camera.read()[1] for camera in cameras]; 46 | for i in range(len(images)): 47 | cv2.imshow(str(i), images[i]) 48 | cv2.waitKey(1) 49 | 50 | chr = stdscr.getch() 51 | if chr == 32: 52 | view = { } 53 | view["markers"] = [ ] 54 | msg = x_msg 55 | for m in msg.markers: 56 | marker = { 57 | "id": m.id, 58 | "position": { 59 | "x": m.position.x, 60 | "y": m.position.y, 61 | "z": m.position.z, 62 | } 63 | } 64 | view["markers"].append(marker) 65 | total_marker_count = total_marker_count + 1 66 | data["views"].append(view) 67 | if chr == 27 or chr == 10: 68 | break; 69 | 70 | curses.wrapper(main) 71 | -------------------------------------------------------------------------------- /tams_tracker_node/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | tams_tracker_node 5 | 0.0.0 6 | - 7 | 8 | Philipp Ruppel 9 | Philipp Ruppel 10 | 11 | ... 12 | 13 | catkin 14 | 15 | roscpp 16 | roscpp 17 | 18 | robot_model_loader 19 | robot_model_loader 20 | 21 | kinematics_base 22 | kinematics_base 23 | 24 | tf 25 | tf 26 | 27 | tf_conversions 28 | tf_conversions 29 | 30 | robot_state_publisher 31 | robot_state_publisher 32 | 33 | visualization_msgs 34 | visualization_msgs 35 | 36 | interactive_markers 37 | interactive_markers 38 | 39 | sensor_msgs 40 | sensor_msgs 41 | 42 | image_transport 43 | image_transport 44 | 45 | cv_bridge 46 | cv_bridge 47 | 48 | opencv2 49 | opencv2 50 | 51 | actionlib_msgs 52 | actionlib_msgs 53 | 54 | tams_tracker_msgs 55 | tams_tracker_msgs 56 | 57 | eigen_conversions 58 | eigen_conversions 59 | 60 | rosbag 61 | rosbag 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /tams_tracker_node/src/calibration.h: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | #pragma once 4 | 5 | #include "common.h" 6 | 7 | namespace tams_tracker { 8 | 9 | struct Calibration { 10 | 11 | std::vector camera_matrices; 12 | std::vector dist_coeffs; 13 | std::vector camera_poses; 14 | size_t view_count = 0; 15 | 16 | void load() { 17 | 18 | ros::NodeHandle node("~"); 19 | 20 | std::vector translations; 21 | std::vector rotations; 22 | 23 | std::string calibration_file; 24 | node.getParam("calibration_file", calibration_file); 25 | ROS_INFO_STREAM("calibration file: \"" << calibration_file << "\""); 26 | cv::FileStorage fs(calibration_file, cv::FileStorage::READ); 27 | if (!fs.isOpened()) { 28 | ROS_ERROR_STREAM("failed to open calibration file"); 29 | return; 30 | } 31 | ROS_INFO_STREAM("cameras: " << fs["cameras"].size()); 32 | for (auto c : fs["cameras"]) { 33 | ROS_INFO("camera"); 34 | camera_matrices.emplace_back(); 35 | dist_coeffs.emplace_back(); 36 | translations.emplace_back(); 37 | rotations.emplace_back(); 38 | c["k"] >> camera_matrices.back(); 39 | c["d"] >> dist_coeffs.back(); 40 | c["t"] >> translations.back(); 41 | c["r"] >> rotations.back(); 42 | camera_matrices.back().convertTo(camera_matrices.back(), CV_64F); 43 | dist_coeffs.back().convertTo(dist_coeffs.back(), CV_64F); 44 | translations.back().convertTo(translations.back(), CV_64F); 45 | rotations.back().convertTo(rotations.back(), CV_64F); 46 | } 47 | 48 | view_count = camera_matrices.size(); 49 | 50 | camera_poses.resize(camera_matrices.size()); 51 | for (size_t icam = 0; icam < camera_matrices.size(); icam++) { 52 | Eigen::Matrix3d r; 53 | cv::cv2eigen(rotations[icam], r); 54 | Eigen::Vector3d t; 55 | cv::cv2eigen(translations[icam], t); 56 | Eigen::Affine3d pose = Eigen::Affine3d::Identity(); 57 | pose.translation() = t; 58 | pose.linear() = r; 59 | pose = pose.inverse(); 60 | camera_poses[icam] = pose; 61 | } 62 | } 63 | }; 64 | 65 | } // namespace tams_tracker 66 | -------------------------------------------------------------------------------- /tams_tracker_node/src/publish_angles.cpp: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | #include "common.h" 4 | 5 | #include 6 | #include 7 | 8 | int main(int argc, char **argv) { 9 | 10 | ros::init(argc, argv, "publish_angles", 0); 11 | 12 | ros::NodeHandle node("~"); 13 | 14 | ros::AsyncSpinner spinner(4); 15 | spinner.start(); 16 | 17 | ros::Duration(1.0).sleep(); 18 | 19 | std::string parent_name = argv[1]; 20 | 21 | std::vector frame_names; 22 | for (size_t i = 2; i < argc; i++) { 23 | frame_names.push_back(argv[i]); 24 | } 25 | 26 | tf::TransformListener tf_listener; 27 | 28 | auto getOrientation = [&](const std::string &frame_name) { 29 | auto time = ros::Time(0); 30 | /*std::string parent_name; 31 | bool ok = tf_listener.getParent(frame_name, time, parent_name); 32 | if (!ok) { 33 | ROS_ERROR_STREAM("failed to get parent frame"); 34 | throw std::runtime_error("failed to get parent frame"); 35 | }*/ 36 | tf::StampedTransform transform; 37 | tf_listener.waitForTransform(parent_name, frame_name, time, 38 | ros::Duration(3.0)); 39 | tf_listener.lookupTransform(parent_name, frame_name, time, transform); 40 | return transform.getRotation(); 41 | }; 42 | 43 | std::vector inverse_reference_orientations; 44 | for (auto &frame_name : frame_names) { 45 | inverse_reference_orientations.push_back( 46 | getOrientation(frame_name).inverse()); 47 | } 48 | 49 | std::vector angle_publishers; 50 | for (auto &frame_name : frame_names) { 51 | angle_publishers.emplace_back(node.advertise( 52 | frame_name + "/orientation", 1000)); 53 | } 54 | 55 | while (ros::ok()) { 56 | for (size_t i = 0; i < frame_names.size(); i++) { 57 | tf::Quaternion quat = 58 | inverse_reference_orientations[i] * getOrientation(frame_names[i]); 59 | tf::Vector3 vec = quat.getAxis() * (quat.getAngle() * 180 / M_PI); 60 | geometry_msgs::Vector3 msg; 61 | msg.x = vec.x(); 62 | msg.y = vec.y(); 63 | msg.z = vec.z(); 64 | angle_publishers[i].publish(msg); 65 | } 66 | ros::Duration(0.01).sleep(); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /tams_tracker_firmware/tams_tracker_firmware.ino: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | const int marker_frequencies[] = { 4 | 3, 5 | 4, 6 | 5, 7 | 6, 8 | }; 9 | const int marker_pins[] = { 10 | 24, 11 | 52, 12 | 13, 13 | 56, 14 | }; 15 | const size_t marker_count = 4; 16 | const int ground_pins[] = { 17 | 53, 18 | 25, 19 | 55, 20 | }; 21 | const size_t ground_pin_count = 3; 22 | 23 | /* 24 | const uint16_t marker_frequencies[] = { 25 | 2, 26 | 3, 27 | 4, 28 | 5, 29 | 6, 30 | 7, 31 | 8, 32 | 9, 33 | 10, 34 | 11, 35 | 12, 36 | 13, 37 | 14, 38 | }; 39 | const int marker_pins[] = { 40 | 2, 41 | 3, 42 | 4, 43 | 5, 44 | 6, 45 | 7, 46 | 8, 47 | 9, 48 | 10, 49 | 11, 50 | 12, 51 | 13, 52 | 14, 53 | }; 54 | const size_t marker_count = 13; 55 | const int ground_pins[] = { 56 | }; 57 | const size_t ground_pin_count = 0; 58 | */ 59 | 60 | uint8_t marker_states[marker_count]; 61 | uint16_t marker_times[marker_count]; 62 | 63 | void setup() { 64 | for (size_t i = 0; i < marker_count; i++) { 65 | pinMode(marker_pins[i], OUTPUT); 66 | digitalWrite(marker_pins[i], HIGH); 67 | } 68 | for (size_t i = 0; i < ground_pin_count; i++) { 69 | pinMode(ground_pins[i], OUTPUT); 70 | digitalWrite(ground_pins[i], LOW); 71 | } 72 | } 73 | 74 | void loop() { 75 | /*uint32_t t = micros(); 76 | //bool pwm = (((t >> 10) & 1) == 0); 77 | bool pwm = 0; 78 | for (size_t i = 0; i < marker_count; i++) { 79 | int p = marker_pins[i]; 80 | int v = ((t * marker_frequencies[i] * 2 / (1000 * 1000)) & 1); 81 | v |= pwm; 82 | digitalWrite(p, v); 83 | }*/ 84 | 85 | /*uint16_t t = millis(); 86 | static uint16_t lt = 0; 87 | uint16_t dt = t - lt; 88 | if(dt > 100) dt = 100; 89 | lt = t; 90 | 91 | for (size_t i = 0; i < marker_count; i++) { 92 | marker_times[i] += dt * marker_frequencies[i]; 93 | if(marker_times[i] > (uint16_t)500) { 94 | marker_times[i] = 0; 95 | marker_states[i] = !marker_states; 96 | digitalWrite(marker_pins[i], marker_states[i]); 97 | } 98 | }*/ 99 | 100 | static uint8_t pwm = 0; 101 | pwm = ((pwm + 1) & 3); 102 | uint32_t t = millis(); 103 | for (size_t i = 0; i < marker_count; i++) { 104 | digitalWrite(marker_pins[i], ((t * marker_frequencies[i]) / 500) & 1 || !pwm); 105 | } 106 | } 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /tams_tracker_node/scripts/save_marker_views: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import rospy 4 | import re 5 | import os 6 | import sys 7 | import control_msgs.msg 8 | import trajectory_msgs.msg 9 | import random 10 | import math 11 | import numpy as np 12 | import sensor_msgs.msg 13 | import curses 14 | import tams_tracker_msgs.msg 15 | import json 16 | import time 17 | 18 | def main(stdscr): 19 | 20 | rospy.init_node("save_marker_views") 21 | 22 | global x_msg 23 | x_msg = tams_tracker_msgs.msg.MarkerArrayStamped() 24 | 25 | def callback(msg): 26 | global x_msg 27 | x_msg = msg 28 | rospy.Subscriber("/tams_tracker_node/markers", tams_tracker_msgs.msg.MarkerArrayStamped, callback) 29 | 30 | data = { } 31 | data["views"] = [ ] 32 | 33 | total_marker_count = 0 34 | 35 | save = False 36 | 37 | stdscr.clear() 38 | 39 | while not rospy.is_shutdown(): 40 | 41 | stdscr.clear() 42 | stdscr.addstr("save tams tracker markers\n\n") 43 | stdscr.addstr("press [space] to add markers\n") 44 | stdscr.addstr("press [return] to save and exit\n") 45 | stdscr.addstr("press [escape] to exit without saving\n") 46 | stdscr.addstr("\n") 47 | stdscr.addstr(str(len(data["views"])) + " views\n") 48 | stdscr.addstr(str(total_marker_count) + " markers total\n") 49 | stdscr.addstr("\n") 50 | stdscr.refresh() 51 | 52 | chr = stdscr.getch() 53 | if chr == 32: 54 | view = { } 55 | view["markers"] = [ ] 56 | msg = x_msg 57 | for m in msg.markers: 58 | marker = { 59 | "id": m.id, 60 | "position": { 61 | "x": m.position.x, 62 | "y": m.position.y, 63 | "z": m.position.z, 64 | } 65 | } 66 | view["markers"].append(marker) 67 | total_marker_count = total_marker_count + 1 68 | data["views"].append(view) 69 | if chr == 10: 70 | if total_marker_count > 0: 71 | save = True 72 | break 73 | if chr == 27: 74 | break; 75 | 76 | if save: 77 | prefix = "marker_views_" + str(int(round(time.time() * 1000))) 78 | stdscr.addstr("enter label (optional):\n") 79 | stdscr.refresh() 80 | curses.echo() 81 | fname = stdscr.getstr() 82 | curses.noecho() 83 | if len(fname) != 0: 84 | fname = "_" + fname 85 | fname = prefix + fname + ".json" 86 | stdscr.addstr("file name: " + fname + "\n") 87 | with open(fname, "w") as f: 88 | json.dump(data, f) 89 | stdscr.addstr("ready\n") 90 | 91 | curses.wrapper(main) 92 | -------------------------------------------------------------------------------- /tams_tracker_launch/scripts/hand_visualization: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import rospy 4 | import rosbag 5 | import sys 6 | import visualization_msgs.msg 7 | import random 8 | import std_msgs.msg 9 | import tams_tracker_msgs.msg 10 | 11 | rospy.init_node("phasespace_marker_trajectories") 12 | 13 | random.seed(0) 14 | 15 | marker_message = tams_tracker_msgs.msg.MarkerArrayStamped() 16 | def callback(msg): 17 | global marker_message 18 | marker_message = msg 19 | rospy.Subscriber("/tams_tracker_node/markers", tams_tracker_msgs.msg.MarkerArrayStamped, callback) 20 | 21 | publisher = rospy.Publisher("/tams_tracker_node/visualization_markers", visualization_msgs.msg.MarkerArray, queue_size=100) 22 | 23 | chains = [ 24 | [10, 9], 25 | [8, 4, 6], 26 | [7, 5], 27 | [2, 3], 28 | [13, 11, 12, 1], 29 | ] 30 | 31 | links = [ ] 32 | for chain in chains: 33 | for i in range(1, len(chain)): 34 | links.append([chain[i - 1], chain[i]]) 35 | 36 | colors = [ ] 37 | 38 | while True: 39 | 40 | if rospy.is_shutdown(): 41 | break 42 | 43 | msg = marker_message 44 | 45 | marker = visualization_msgs.msg.Marker() 46 | marker.type = marker.SPHERE_LIST 47 | marker.action = marker.ADD 48 | marker.header.frame_id = "/tams_tracker" 49 | marker.pose.orientation.w = 1.0 50 | marker.ns = "hand_joints" 51 | marker.scale.x = 0.01 52 | marker.lifetime = rospy.Duration(0.1) 53 | for p in msg.markers: 54 | marker.points.append(p.position) 55 | while len(colors) <= p.id: 56 | color = std_msgs.msg.ColorRGBA() 57 | color.r = random.random() 58 | color.g = random.random() 59 | color.b = random.random() 60 | color.a = 1.0 61 | colors.append(color) 62 | marker.colors.append(colors[p.id]) 63 | marker_array = visualization_msgs.msg.MarkerArray() 64 | marker_array.markers.append(marker) 65 | publisher.publish(marker_array) 66 | 67 | marker = visualization_msgs.msg.Marker() 68 | marker.type = marker.LINE_LIST 69 | marker.action = marker.ADD 70 | marker.header.frame_id = "/tams_tracker" 71 | marker.pose.orientation.w = 1.0 72 | marker.ns = "hand_links" 73 | marker.scale.x = 0.01 74 | marker.lifetime = rospy.Duration(0.1) 75 | for link in links: 76 | a = [p for p in msg.markers if p.id == link[0]] 77 | b = [p for p in msg.markers if p.id == link[1]] 78 | if len(a) == 0 or len(b) == 0: continue 79 | a = a[0] 80 | b = b[0] 81 | marker.points.append(a.position) 82 | marker.points.append(b.position) 83 | marker.colors.append(colors[a.id]) 84 | marker.colors.append(colors[b.id]) 85 | marker_array = visualization_msgs.msg.MarkerArray() 86 | marker_array.markers.append(marker) 87 | publisher.publish(marker_array) 88 | 89 | rospy.sleep(0.05) 90 | -------------------------------------------------------------------------------- /tams_tracker_launch/data/calibration.yaml: -------------------------------------------------------------------------------- 1 | %YAML:1.0 2 | --- 3 | cameras: 4 | - 5 | t: !!opencv-matrix 6 | rows: 3 7 | cols: 1 8 | dt: d 9 | data: [ 3.1722908502348818e-01, 4.6607660328598652e-03, 10 | 9.2108190130109388e-02 ] 11 | r: !!opencv-matrix 12 | rows: 3 13 | cols: 3 14 | dt: d 15 | data: [ 8.6963272467202701e-01, 2.5611249829858452e-03, 16 | -4.9369258128751342e-01, 1.5457076042431855e-02, 17 | 9.9935506988442746e-01, 3.2411774041381597e-02, 18 | 4.9345719467824661e-01, -3.5817383141606318e-02, 19 | 8.6903228483478234e-01 ] 20 | k: !!opencv-matrix 21 | rows: 3 22 | cols: 3 23 | dt: d 24 | data: [ 7.7339720942051133e+02, 0., 2.8789137376513975e+02, 0., 25 | 7.7671618496258179e+02, 2.3136114913021564e+02, 0., 0., 1. ] 26 | d: !!opencv-matrix 27 | rows: 1 28 | cols: 5 29 | dt: d 30 | data: [ -6.5576698230477806e-02, -4.7392248780011448e-01, 31 | -5.7175905182575678e-03, -2.2201234485322127e-03, 32 | 2.7895013181766002e+00 ] 33 | - 34 | t: !!opencv-matrix 35 | rows: 3 36 | cols: 1 37 | dt: d 38 | data: [ -3.1422302589561446e-01, -8.6659639312489762e-04, 39 | 1.0248358582671023e-01 ] 40 | r: !!opencv-matrix 41 | rows: 3 42 | cols: 3 43 | dt: d 44 | data: [ 8.7043396710894483e-01, 2.0841512829770221e-02, 45 | 4.9184381692357471e-01, 1.7576263273908280e-04, 46 | 9.9909019798512644e-01, -4.2646751312822896e-02, 47 | -4.9228515924256877e-01, 3.7207628693687968e-02, 48 | 8.6963838137268956e-01 ] 49 | k: !!opencv-matrix 50 | rows: 3 51 | cols: 3 52 | dt: d 53 | data: [ 7.7555439837423614e+02, 0., 3.1477486599371264e+02, 0., 54 | 7.7699486780013603e+02, 2.1945625340835542e+02, 0., 0., 1. ] 55 | d: !!opencv-matrix 56 | rows: 1 57 | cols: 5 58 | dt: d 59 | data: [ -1.1404753053709260e-01, 1.4541774614776706e-01, 60 | 2.8725709855532240e-04, -2.8712769278016765e-03, 61 | 5.1233450484862209e-01 ] 62 | - 63 | t: !!opencv-matrix 64 | rows: 3 65 | cols: 1 66 | dt: f 67 | data: [ 0., 0., 0. ] 68 | r: !!opencv-matrix 69 | rows: 3 70 | cols: 3 71 | dt: f 72 | data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1. ] 73 | k: !!opencv-matrix 74 | rows: 3 75 | cols: 3 76 | dt: d 77 | data: [ 7.6033777526969902e+02, 0., 3.0151488186782291e+02, 0., 78 | 7.5931633530575982e+02, 2.2623232965440928e+02, 0., 0., 1. ] 79 | d: !!opencv-matrix 80 | rows: 1 81 | cols: 5 82 | dt: d 83 | data: [ -1.6299673225573669e-01, 6.8169663731260410e-01, 84 | -3.0840363902212727e-04, -8.3622945298044728e-04, 85 | -2.2242724411441999e+00 ] 86 | -------------------------------------------------------------------------------- /tams_tracker_node/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.9.3) 2 | project(tams_tracker_node) 3 | 4 | set(CMAKE_CXX_FLAGS "-std=c++11") 5 | 6 | set(CMAKE_BUILD_TYPE Release) 7 | #set(CMAKE_BUILD_TYPE Debug) 8 | 9 | #add_compile_options($<$:-O3>) 10 | #add_compile_options($<$:-O0>) 11 | #add_compile_options($<$:-ffast-math>) 12 | 13 | find_package(OpenCV REQUIRED) 14 | 15 | find_package(catkin REQUIRED COMPONENTS 16 | tf 17 | tf_conversions 18 | roscpp 19 | std_srvs 20 | visualization_msgs 21 | interactive_markers 22 | image_transport 23 | sensor_msgs 24 | cv_bridge 25 | tams_tracker_msgs 26 | eigen_conversions 27 | rosbag 28 | ) 29 | 30 | catkin_package( 31 | CATKIN_DEPENDS 32 | roscpp 33 | tf 34 | tf_conversions 35 | sensor_msgs 36 | cv_bridge 37 | actionlib_msgs 38 | image_transport 39 | tams_tracker_msgs 40 | eigen_conversions 41 | rosbag 42 | ) 43 | 44 | include_directories( 45 | ${catkin_INCLUDE_DIRS} 46 | ) 47 | 48 | find_package(Boost REQUIRED COMPONENTS program_options) 49 | 50 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") 51 | 52 | #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_DONT_VECTORIZE") 53 | 54 | add_executable(tams_tracker_node src/tracker.cpp) 55 | add_dependencies(tams_tracker_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 56 | target_link_libraries(tams_tracker_node yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 57 | 58 | add_executable(tams_tracker_calibrate src/calibrate.cpp) 59 | add_dependencies(tams_tracker_calibrate ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 60 | target_link_libraries(tams_tracker_calibrate yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 61 | 62 | add_executable(tams_tracker_record src/record.cpp) 63 | add_dependencies(tams_tracker_record ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 64 | target_link_libraries(tams_tracker_record yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 65 | 66 | add_executable(tams_tracker_reconstruct src/reconstruct.cpp) 67 | add_dependencies(tams_tracker_reconstruct ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 68 | target_link_libraries(tams_tracker_reconstruct yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 69 | 70 | add_executable(tams_tracker_align_imu src/align_imu.cpp) 71 | add_dependencies(tams_tracker_align_imu ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 72 | target_link_libraries(tams_tracker_align_imu yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 73 | 74 | add_executable(tams_tracker_publish_angles src/publish_angles.cpp) 75 | add_dependencies(tams_tracker_publish_angles ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 76 | target_link_libraries(tams_tracker_publish_angles yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 77 | 78 | add_executable(tams_tracker_filter src/filter.cpp) 79 | add_dependencies(tams_tracker_filter ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 80 | target_link_libraries(tams_tracker_filter yaml-cpp ${catkin_LIBRARIES} ${Boost_LIBRARIES} ${OpenCV_LIBS}) 81 | -------------------------------------------------------------------------------- /tams_tracker_launch/config/brush.yaml: -------------------------------------------------------------------------------- 1 | markers: 2 | - { id: 1, frequency: 4 } 3 | - { id: 2, frequency: 5 } 4 | - { id: 3, frequency: 6 } 5 | - { id: 4, frequency: 7 } 6 | - { id: 5, frequency: 8 } 7 | - { id: 6, frequency: 9 } 8 | - { id: 7, frequency: 10 } 9 | - { id: 8, frequency: 11 } 10 | rigids: 11 | - id: 5 12 | name: brush_visual 13 | markers: 14 | - id: 2 15 | position: 16 | x: 0.01719074426564354 17 | y: 0.01637483920647365 18 | z: -0.01854670921248546 19 | - id: 1 20 | position: 21 | y: 0.02592199428835176 22 | x: -0.007109933818185518 23 | z: 0.01483094417540801 24 | - id: 4 25 | position: 26 | y: -0.000669658119556521 27 | x: -0.005899686913403125 28 | z: 0.02692949436328635 29 | - id: 5 30 | position: 31 | x: 0.02201653160712675 32 | z: 0.0107605268572762 33 | y: 0.01055637044219218 34 | - id: 6 35 | position: 36 | y: -0.002344673772430084 37 | x: -0.02960277897648649 38 | z: 0.006133771067792795 39 | - id: 3 40 | position: 41 | y: -0.02513044422296509 42 | x: -0.00834207758772007 43 | z: 0.0007732056080576692 44 | - id: 8 45 | position: 46 | y: -0.01058550134724645 47 | x: -0.00641641133112901 48 | z: -0.02755638175252761 49 | - id: 7 50 | position: 51 | y: -0.0141229264748195 52 | x: 0.01816361275415396 53 | z: -0.01332485110680794 54 | - id: 6 55 | name: brush_crossmodal 56 | imu: 57 | topic: /tams_tracker_imu/data_raw 58 | orientation: 59 | x: -0.634334 60 | y: 0.0652255 61 | z: -0.502025 62 | w: 0.584241 63 | markers: 64 | - id: 2 65 | position: 66 | x: 0.01719074426564354 67 | y: 0.01637483920647365 68 | z: -0.01854670921248546 69 | - id: 1 70 | position: 71 | y: 0.02592199428835176 72 | x: -0.007109933818185518 73 | z: 0.01483094417540801 74 | - id: 4 75 | position: 76 | y: -0.000669658119556521 77 | x: -0.005899686913403125 78 | z: 0.02692949436328635 79 | - id: 5 80 | position: 81 | x: 0.02201653160712675 82 | z: 0.0107605268572762 83 | y: 0.01055637044219218 84 | - id: 6 85 | position: 86 | y: -0.002344673772430084 87 | x: -0.02960277897648649 88 | z: 0.006133771067792795 89 | - id: 3 90 | position: 91 | y: -0.02513044422296509 92 | x: -0.00834207758772007 93 | z: 0.0007732056080576692 94 | - id: 8 95 | position: 96 | y: -0.01058550134724645 97 | x: -0.00641641133112901 98 | z: -0.02755638175252761 99 | - id: 7 100 | position: 101 | y: -0.0141229264748195 102 | x: 0.01816361275415396 103 | z: -0.01332485110680794 104 | -------------------------------------------------------------------------------- /tams_tracker_launch/scripts/handbag_trajectories: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import rospy 4 | import rosbag 5 | import sys 6 | import visualization_msgs.msg 7 | import random 8 | import std_msgs.msg 9 | import tams_tracker_msgs.msg 10 | import geometry_msgs.msg 11 | import math 12 | 13 | rospy.init_node("tams_tracker_handbag_trajectories") 14 | 15 | random.seed(0) 16 | 17 | bag = rosbag.Bag(sys.argv[1], "r") 18 | 19 | publisher = rospy.Publisher("/tams_tracker_node/visualization_markers", visualization_msgs.msg.MarkerArray, queue_size=1) 20 | 21 | marker_array = visualization_msgs.msg.MarkerArray() 22 | 23 | id_set = set() 24 | for msg in bag: 25 | if msg.topic == "/tams_tracker_node/markers": 26 | for p in msg.message.markers: 27 | id_set.add(p.id) 28 | 29 | def distance(a, b): 30 | dx = a.x - b.x 31 | dy = a.y - b.y 32 | dz = a.z - b.z 33 | return math.sqrt(dx * dx + dy * dy + dz * dz) 34 | 35 | for id in id_set: 36 | marker = visualization_msgs.msg.Marker() 37 | 38 | marker.ns = "trajectory" 39 | marker.id = id 40 | 41 | marker.type = marker.LINE_LIST 42 | marker.action = marker.ADD 43 | marker.header.frame_id = "/tams_tracker" 44 | marker.pose.orientation.w = 1.0 45 | 46 | marker.scale.x = 0.001 47 | 48 | marker.color.a = 0.5 49 | marker.color.r = random.random() 50 | marker.color.g = random.random() 51 | marker.color.b = random.random() 52 | 53 | previous_position = geometry_msgs.msg.Point() 54 | 55 | for msg in bag: 56 | if msg.topic == "/tams_tracker_node/markers": 57 | for p in msg.message.markers: 58 | if p.id == id: 59 | q = geometry_msgs.msg.Point() 60 | q.x = p.position.x 61 | q.y = p.position.z 62 | q.z = p.position.y 63 | if distance(q, previous_position) < 0.005: 64 | marker.points.append(previous_position) 65 | marker.points.append(q) 66 | previous_position = q 67 | #marker.points.append(q) 68 | 69 | marker_array.markers.append(marker) 70 | 71 | publisher.publish(marker_array) 72 | 73 | rospy.sleep(3.0) 74 | 75 | ''' 76 | marker = visualization_msgs.msg.Marker() 77 | 78 | publisher = rospy.Publisher("/tams_tracker_node/visualization_markers", visualization_msgs.msg.MarkerArray, queue_size=1) 79 | 80 | marker.ns = "trajectory" 81 | marker.id = 0 82 | 83 | marker.type = marker.POINTS 84 | marker.action = marker.ADD 85 | marker.header.frame_id = "/tams_tracker" 86 | marker.pose.orientation.w = 1.0 87 | 88 | marker.scale.x = 0.001 89 | 90 | marker.color.a = 1.0 91 | marker.color.r = 1.0 92 | marker.color.g = 1.0 93 | marker.color.b = 0.0 94 | 95 | colors = [ ] 96 | 97 | for msg in bag: 98 | if msg.topic == "/tams_tracker_node/markers": 99 | for p in msg.message.markers: 100 | #print p 101 | marker.points.append(p.position) 102 | while len(colors) <= p.id: 103 | color = std_msgs.msg.ColorRGBA() 104 | color.r = random.random() 105 | color.g = random.random() 106 | color.b = random.random() 107 | color.a = 1.0 108 | colors.append(color) 109 | marker.colors.append(colors[p.id]) 110 | if rospy.is_shutdown(): 111 | break 112 | 113 | marker_array = visualization_msgs.msg.MarkerArray() 114 | marker_array.markers.append(marker) 115 | publisher.publish(marker_array) 116 | 117 | rospy.sleep(3.0) 118 | ''' 119 | -------------------------------------------------------------------------------- /docs/dynsections.js: -------------------------------------------------------------------------------- 1 | function toggleVisibility(linkObj) 2 | { 3 | var base = $(linkObj).attr('id'); 4 | var summary = $('#'+base+'-summary'); 5 | var content = $('#'+base+'-content'); 6 | var trigger = $('#'+base+'-trigger'); 7 | var src=$(trigger).attr('src'); 8 | if (content.is(':visible')===true) { 9 | content.hide(); 10 | summary.show(); 11 | $(linkObj).addClass('closed').removeClass('opened'); 12 | $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); 13 | } else { 14 | content.show(); 15 | summary.hide(); 16 | $(linkObj).removeClass('closed').addClass('opened'); 17 | $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); 18 | } 19 | return false; 20 | } 21 | 22 | function updateStripes() 23 | { 24 | $('table.directory tr'). 25 | removeClass('even').filter(':visible:even').addClass('even'); 26 | } 27 | 28 | function toggleLevel(level) 29 | { 30 | $('table.directory tr').each(function() { 31 | var l = this.id.split('_').length-1; 32 | var i = $('#img'+this.id.substring(3)); 33 | var a = $('#arr'+this.id.substring(3)); 34 | if (l 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "os_type.h" 7 | #include "osapi.h" 8 | 9 | // markers 10 | 11 | const int marker_frequencies[] = { 12 | 4, 13 | 5, 14 | 6, 15 | 7, 16 | 8, 17 | 9, 18 | 10, 19 | 11, 20 | }; 21 | const int marker_pins[] = { 22 | D3, 23 | TX, 24 | D5, 25 | D6, 26 | D7, 27 | D8, 28 | D0, 29 | RX, 30 | }; 31 | const size_t marker_count = 8; 32 | 33 | os_timer_t marker_timer; 34 | 35 | void marker_timer_callback(void *arg) { 36 | static uint8_t pwm = 1; 37 | pwm = ((pwm + 1) & 3); 38 | uint32_t t = millis(); 39 | for (size_t i = 0; i < marker_count; i++) { 40 | digitalWrite(marker_pins[i], ((t * marker_frequencies[i]) / 500) & 1 || !pwm); 41 | } 42 | } 43 | 44 | void marker_init() { 45 | for (size_t i = 0; i < marker_count; i++) { 46 | pinMode(marker_pins[i], OUTPUT); 47 | digitalWrite(marker_pins[i], HIGH); 48 | } 49 | os_timer_setfn(&marker_timer, marker_timer_callback, nullptr); 50 | os_timer_arm(&marker_timer, 1, true); 51 | } 52 | 53 | 54 | 55 | // imu 56 | 57 | int imu_address = 0x68; 58 | 59 | int16_t imu_ax = 0; 60 | int16_t imu_ay = 0; 61 | int16_t imu_az = 0; 62 | 63 | int16_t imu_rx = 0; 64 | int16_t imu_ry = 0; 65 | int16_t imu_rz = 0; 66 | 67 | void imu_init() { 68 | Wire.begin(); 69 | 70 | // wake up 71 | Wire.beginTransmission(imu_address); 72 | Wire.write(0x6B); 73 | Wire.write(0); 74 | Wire.endTransmission(true); 75 | 76 | // set gyro range to 250deg/s 77 | Wire.beginTransmission(imu_address); //I2C address of the MPU 78 | Wire.write(0x1B); 79 | Wire.write(0x00000000); //Setting the gyro to full scale +/- 250deg./s 80 | Wire.endTransmission(); 81 | 82 | // set accelerometer range to 2g 83 | Wire.beginTransmission(imu_address); 84 | Wire.write(0x1C); 85 | Wire.write(0b00000000); 86 | Wire.endTransmission(); 87 | } 88 | 89 | void imu_read() { 90 | Wire.beginTransmission(imu_address); 91 | Wire.write(0x3B); 92 | Wire.endTransmission(false); 93 | 94 | Wire.requestFrom(imu_address, 14, true); 95 | imu_ax = Wire.read() << 8 | Wire.read(); 96 | imu_ay = Wire.read() << 8 | Wire.read(); 97 | imu_az = Wire.read() << 8 | Wire.read(); 98 | int16_t t = Wire.read() << 8 | Wire.read(); 99 | imu_rx = Wire.read() << 8 | Wire.read(); 100 | imu_ry = Wire.read() << 8 | Wire.read(); 101 | imu_rz = Wire.read() << 8 | Wire.read(); 102 | } 103 | 104 | 105 | 106 | // wifi 107 | 108 | const char *ssid = "tams_tracker_object"; 109 | const char *password = "password"; 110 | 111 | char wifi_buffer[256]; 112 | 113 | IPAddress localIp(192,168,1,200); 114 | WiFiServer server(10000); 115 | 116 | void wifi_init() { 117 | IPAddress subnet(255,255,255,0); 118 | WiFi.mode(WIFI_AP); 119 | WiFi.softAPConfig(localIp, localIp, subnet); 120 | WiFi.softAP(ssid, password, 1, 0, 32); 121 | WiFi.begin(); 122 | WiFi.setSleepMode(WIFI_NONE_SLEEP); 123 | IPAddress myIP = WiFi.softAPIP(); 124 | server.begin(); 125 | } 126 | 127 | 128 | 129 | // main 130 | 131 | void setup() { 132 | Serial.begin(9600); 133 | wifi_init(); 134 | imu_init(); 135 | marker_init(); 136 | } 137 | 138 | void loop() { 139 | WiFiClient client = server.available(); 140 | if (client) { 141 | Serial.println("connected"); 142 | while (client.connected()) { 143 | while (client.available() > 0) { 144 | client.read(); 145 | } 146 | imu_read(); 147 | delay(20); 148 | sprintf(wifi_buffer, "imu %i %i %i %i %i %i %i\n", imu_ax, imu_ay, imu_az, imu_rx, imu_ry, imu_rz, (int16_t)(imu_ax + imu_ay + imu_az + imu_rx + imu_ry + imu_rz)); 149 | client.write(wifi_buffer); 150 | } 151 | client.stop(); 152 | Serial.println("disconnected"); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /docs/dir_3a9699586c2666f5dd2484f674b8e68c.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_imu Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
tams_tracker_imu Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Directories

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_780cbf03eb2d8df5a53bb6655978a892.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_node Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
tams_tracker_node Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Directories

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_207bc6d5b9f459bd1d0132f8aa4f24f2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_firmware Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
tams_tracker_firmware Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Files

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_0264a9eeecccc418faa03820b097d351.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_esp_firmware Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
tams_tracker_esp_firmware Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Files

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_6f0590c4ed710fa12cc7e1f58d01679d.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_imu_firmware Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
tams_tracker_imu_firmware Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Files

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_dedda661d52f15c544835a0f3f778e7c.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
search Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Files

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/structView-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: Member List 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 68 | 69 |
73 |
74 | 75 | 76 |
77 | 80 |
81 | 82 |
83 |
84 |
85 |
View Member List
86 |
87 |
88 | 89 |

This is the complete list of members for View, including all inherited members.

90 | 91 | 92 |
markers (defined in View)View
93 | 94 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /docs/dir_ff79a391858a1a99b2e44653e7309e6f.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_imu/src Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
src Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Files

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_d85810bbcd679b2654eecd298e30bc33.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: tams_tracker_node/src Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
src Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Files

95 |
96 | 97 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /docs/dir_49e56c817e5e54854c35e136979f97ca.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs Directory Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
docs Directory Reference
89 |
90 |
91 | 92 | 94 |

93 | Directories

95 | 97 |

96 | Files

98 |
99 | 100 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /docs/structMarker-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: Member List 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 68 | 69 |
73 |
74 | 75 | 76 |
77 | 80 |
81 | 82 |
83 |
84 |
85 |
Marker Member List
86 |
87 |
88 | 89 |

This is the complete list of members for Marker, including all inherited members.

90 | 91 | 92 | 93 |
id (defined in Marker)Marker
position (defined in Marker)Marker
94 | 95 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /docs/annotated.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: Class List 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 68 |
69 | 70 |
74 |
75 | 76 | 77 |
78 | 81 |
82 | 83 |
84 |
85 |
Class List
86 |
87 |
88 |
Here are the classes, structs, unions and interfaces with brief descriptions:
89 | 90 | 91 | 92 |
 CMarker
 CView
93 |
94 |
95 | 96 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /docs/all__7_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/all_7.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
all_7.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['view',['View',['../structView.html',1,'']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/classes__6_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/classes_6.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
classes_6.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['view',['View',['../structView.html',1,'']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/all__1_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/all_1.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
all_1.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['imu',['Imu',['../classtams__tracker_1_1Imu.html',1,'tams_tracker']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/classes__1_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/classes_1.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
classes_1.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['imu',['Imu',['../classtams__tracker_1_1Imu.html',1,'tams_tracker']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/all__4_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/all_4.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
all_4.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['point',['Point',['../structtams__tracker_1_1Camera_1_1Point.html',1,'tams_tracker::Camera']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/classes__3_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/classes_3.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
classes_3.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['point',['Point',['../structtams__tracker_1_1Camera_1_1Point.html',1,'tams_tracker::Camera']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/all__6_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/all_6.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
all_6.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['trajectory',['Trajectory',['../structtams__tracker_1_1Camera_1_1Trajectory.html',1,'tams_tracker::Camera']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /tams_tracker_node/src/markers.h: -------------------------------------------------------------------------------- 1 | // 2018, Philipp Ruppel, ruppel@informatik.uni-hamburg.de 2 | 3 | #pragma once 4 | 5 | #include "common.h" 6 | 7 | #include "config.h" 8 | #include "rays.h" 9 | 10 | namespace tams_tracker { 11 | 12 | struct Marker { 13 | size_t marker_index; 14 | Eigen::Vector3d position; 15 | double min_squared_distance_to_camera; 16 | }; 17 | 18 | class MarkerDetector { 19 | 20 | Config config; 21 | std::vector markers; 22 | std::vector ray_up, ray_side; 23 | mutable std::mutex x_mutex; 24 | std::vector x_markers; 25 | 26 | public: 27 | MarkerDetector(const Config &config) : config(config) {} 28 | 29 | void update(const std::vector &rays) { 30 | 31 | ray_up.resize(rays.size()); 32 | ray_side.resize(rays.size()); 33 | Eigen::Vector3d v = Eigen::Vector3d::Random(); 34 | for (size_t iray = 0; iray < rays.size(); iray++) { 35 | ray_up[iray] = rays[iray].direction.cross(v).normalized(); 36 | ray_side[iray] = rays[iray].direction.cross(ray_up[iray]).normalized(); 37 | } 38 | 39 | markers.clear(); 40 | for (size_t ir = 0; ir < rays.size(); ir++) { 41 | for (size_t jr = 0; jr < rays.size(); jr++) { 42 | 43 | if (rays[ir].marker_index != rays[jr].marker_index) { 44 | continue; 45 | } 46 | 47 | std::array ray_indices; 48 | ray_indices[0] = ir; 49 | ray_indices[1] = jr; 50 | 51 | Eigen::Matrix jacobian; 52 | Eigen::Matrix residual; 53 | Eigen::Matrix solution; 54 | 55 | Eigen::Vector3d position = (rays[ir].origin + rays[jr].origin) * 0.5; 56 | 57 | for (size_t i = 0; i < 2; i++) { 58 | 59 | jacobian(i * 2 + 0, 0) = ray_up[ray_indices[i]].x(); 60 | jacobian(i * 2 + 0, 1) = ray_up[ray_indices[i]].y(); 61 | jacobian(i * 2 + 0, 2) = ray_up[ray_indices[i]].z(); 62 | 63 | jacobian(i * 2 + 1, 0) = ray_side[ray_indices[i]].x(); 64 | jacobian(i * 2 + 1, 1) = ray_side[ray_indices[i]].y(); 65 | jacobian(i * 2 + 1, 2) = ray_side[ray_indices[i]].z(); 66 | 67 | residual[i * 2 + 0] = 68 | ray_up[ray_indices[i]].dot(position) - 69 | ray_up[ray_indices[i]].dot(rays[ray_indices[i]].origin); 70 | residual[i * 2 + 1] = 71 | ray_side[ray_indices[i]].dot(position) - 72 | ray_side[ray_indices[i]].dot(rays[ray_indices[i]].origin); 73 | } 74 | 75 | solution = jacobian.colPivHouseholderQr().solve(residual); 76 | 77 | position -= solution; 78 | 79 | bool ok = true; 80 | for (size_t i = 0; i < 2; i++) { 81 | auto &origin = rays[ray_indices[i]].origin; 82 | auto &direction = rays[ray_indices[i]].direction; 83 | Eigen::Vector3d diff = position - origin; 84 | if (diff.dot(direction) < config.min_distance_to_camera) { 85 | ok = false; 86 | break; 87 | } 88 | diff -= direction * diff.dot(direction); 89 | if (diff.squaredNorm() / (position - origin).squaredNorm() > 90 | squared(config.max_reprojection_error)) { 91 | ok = false; 92 | break; 93 | } 94 | } 95 | if (!ok) { 96 | continue; 97 | } 98 | 99 | Marker marker; 100 | marker.position = position; 101 | marker.marker_index = rays[ir].marker_index; 102 | markers.push_back(marker); 103 | } 104 | } 105 | 106 | { 107 | std::vector> clusters; 108 | for (auto &m : markers) { 109 | bool added = false; 110 | for (auto &c : clusters) { 111 | for (auto &n : c) { 112 | if (m.marker_index == n.marker_index && 113 | (m.position - n.position).squaredNorm() < 114 | squared(config.marker_radius)) { 115 | c.push_back(m); 116 | added = true; 117 | break; 118 | } 119 | } 120 | if (added) { 121 | break; 122 | } 123 | } 124 | if (!added) { 125 | clusters.emplace_back(); 126 | clusters.back().push_back(m); 127 | } 128 | } 129 | markers.clear(); 130 | for (auto &cluster : clusters) { 131 | auto m = cluster.front(); 132 | m.position.setZero(); 133 | for (auto &n : cluster) { 134 | m.position += n.position; 135 | } 136 | m.position /= cluster.size(); 137 | markers.push_back(m); 138 | } 139 | } 140 | 141 | { 142 | std::lock_guard lock(x_mutex); 143 | x_markers = markers; 144 | } 145 | } 146 | 147 | void getMarkers(std::vector &markers) { 148 | std::lock_guard lock(x_mutex); 149 | markers = x_markers; 150 | } 151 | }; 152 | 153 | } // namespace tams_tracker 154 | -------------------------------------------------------------------------------- /docs/classes__5_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/classes_5.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
classes_5.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['trajectory',['Trajectory',['../structtams__tracker_1_1Camera_1_1Trajectory.html',1,'tams_tracker::Camera']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/all__2_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/all_2.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
all_2.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['low_2dcost_20multi_2dview_20pose_20tracking_20using_20active_20markers',['Low-cost multi-view pose tracking using active markers',['../index.html',1,'']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/pages__0_8js_source.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: docs/search/pages_0.js Source File 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 67 | 68 |
72 |
73 | 74 | 75 |
76 | 79 |
80 | 81 | 85 |
86 |
87 |
88 |
pages_0.js
89 |
90 |
91 |
1 var searchData=
2 [
3  ['low_2dcost_20multi_2dview_20pose_20tracking_20using_20active_20markers',['Low-cost multi-view pose tracking using active markers',['../index.html',1,'']]]
4 ];
92 | 93 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /docs/classes.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: Class Index 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 68 |
69 | 70 |
74 |
75 | 76 | 77 |
78 | 81 |
82 | 83 |
84 |
85 |
Class Index
86 |
87 |
88 |
M | V
89 | 90 | 93 | 94 | 95 | 96 |
  M  
91 |
  V  
92 |
Marker   View   
97 |
M | V
98 |
99 | 100 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /docs/structView.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: View Struct Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 68 | 69 |
73 |
74 | 75 | 76 |
77 | 80 |
81 | 82 |
83 |
84 | 87 |
88 |
View Struct Reference
89 |
90 |
91 | 92 | 94 | 96 | 97 |

93 | Public Attributes

95 | std::vector< Markermarkers
 
98 |

Detailed Description

99 |
100 |

Definition at line 8 of file reconstruct.cpp.

101 |

The documentation for this struct was generated from the following file: 104 |
105 | 106 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /docs/structtams__tracker_1_1Ray-members.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | tams_tracker: Member List 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 | 20 |
21 |
22 | 23 | 24 | 25 | 30 | 31 | 32 |
26 |
tams_tracker 27 |
28 |
Low-cost multi-view pose tracking using active markers
29 |
33 |
34 | 35 | 36 | 39 | 62 | 68 | 69 |
73 |
74 | 75 | 76 |
77 | 80 |
81 | 82 | 86 |
87 |
88 |
89 |
tams_tracker::Ray Member List
90 |
91 |
92 | 93 |

This is the complete list of members for tams_tracker::Ray, including all inherited members.

94 | 95 | 96 | 97 | 98 |
direction (defined in tams_tracker::Ray)tams_tracker::Ray
marker_index (defined in tams_tracker::Ray)tams_tracker::Ray
origin (defined in tams_tracker::Ray)tams_tracker::Ray
99 | 100 | 105 | 106 | 107 | --------------------------------------------------------------------------------