├── 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 |
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 | 
13 |
14 |
15 | ## Instrumented Objects
16 |
17 | Teach robots by recording demonstrations of manipulation tasks using instrumented objects and tracking gloves.
18 |
19 | 
20 |
21 | 
22 |
23 |
24 | ## Visual-Inertial Sensor Fusion
25 |
26 | Increase reliability under marker occlusions through crossmodal sensor fusion with IMUs.
27 |
28 | 
29 |
30 |
31 | ## Robot Calibration
32 |
33 | Use webcams and LEDs to accurately calibrate your robots.
34 |
35 | 
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 | 
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
68 |
69 |
73 |
74 |
75 |
76 |
77 |
80 |
81 |
82 |
83 |
87 |
88 |
89 |
This is the complete list of members for View , including all inherited members.
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
68 |
69 |
73 |
74 |
75 |
76 |
77 |
80 |
81 |
82 |
83 |
87 |
88 |
89 |
This is the complete list of members for Marker , including all inherited members.
90 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
68 |
69 |
70 |
74 |
75 |
76 |
77 |
78 |
81 |
82 |
83 |
87 |
88 |
Here are the classes, structs, unions and interfaces with brief descriptions:
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'view' ,[
'View' ,[
'../structView.html' ,1,
'' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'view' ,[
'View' ,[
'../structView.html' ,1,
'' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'imu' ,[
'Imu' ,[
'../classtams__tracker_1_1Imu.html' ,1,
'tams_tracker' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'imu' ,[
'Imu' ,[
'../classtams__tracker_1_1Imu.html' ,1,
'tams_tracker' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'point' ,[
'Point' ,[
'../structtams__tracker_1_1Camera_1_1Point.html' ,1,
'tams_tracker::Camera' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'point' ,[
'Point' ,[
'../structtams__tracker_1_1Camera_1_1Point.html' ,1,
'tams_tracker::Camera' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'trajectory' ,[
'Trajectory' ,[
'../structtams__tracker_1_1Camera_1_1Trajectory.html' ,1,
'tams_tracker::Camera' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'trajectory' ,[
'Trajectory' ,[
'../structtams__tracker_1_1Camera_1_1Trajectory.html' ,1,
'tams_tracker::Camera' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'low_2dcost_20multi_2dview_20pose_20tracking_20using_20active_20markers' ,[
'Low-cost multi-view pose tracking using active markers' ,[
'../index.html' ,1,
'' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
67 |
68 |
72 |
73 |
74 |
75 |
76 |
79 |
80 |
81 |
85 |
86 |
90 |
91 |
3 [
'low_2dcost_20multi_2dview_20pose_20tracking_20using_20active_20markers' ,[
'Low-cost multi-view pose tracking using active markers' ,[
'../index.html' ,1,
'' ]]]
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
68 |
69 |
70 |
74 |
75 |
76 |
77 |
78 |
81 |
82 |
83 |
87 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
68 |
69 |
73 |
74 |
75 |
76 |
77 |
80 |
81 |
82 |
83 |
90 |
91 |
92 |
94 |
95 | std::vector< Marker > markers
96 |
97 |
98 |
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 |
26 | tams_tracker
27 |
28 | Low-cost multi-view pose tracking using active markers
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
62 |
68 |
69 |
73 |
74 |
75 |
76 |
77 |
80 |
81 |
82 |
86 |
87 |
91 |
92 |
93 |
This is the complete list of members for tams_tracker::Ray , including all inherited members.
94 |
99 |
100 |
105 |
106 |
107 |
--------------------------------------------------------------------------------