183 Commits

Author SHA1 Message Date
Sem van der Hoeven
c219359487 test 2023-05-01 15:58:15 +02:00
Sem van der Hoeven
ea4cfb17ec test 2023-05-01 15:55:15 +02:00
Sem van der Hoeven
8efa23948d no placeholders? 2023-05-01 15:53:39 +02:00
Sem van der Hoeven
a919c5b7f7 add test 2023-05-01 15:52:38 +02:00
Sem van der Hoeven
8be8a6d1f3 bull 2023-05-01 15:51:01 +02:00
Sem van der Hoeven
a24c145968 remove attitude message codes 2023-05-01 15:48:06 +02:00
Sem van der Hoeven
baad3abae2 use pointers 2023-05-01 15:42:29 +02:00
Sem van der Hoeven
0b98dfbf02 add processing of service request 2023-05-01 15:41:51 +02:00
Sem van der Hoeven
4846ee5052 add placeholders back 2023-05-01 15:31:02 +02:00
Sem van der Hoeven
22126929a7 remove placeholders 2023-05-01 15:30:30 +02:00
Sem van der Hoeven
d74b7db6b3 add request header? 2023-05-01 15:29:57 +02:00
Sem van der Hoeven
8f7e496107 add placeholders 2023-05-01 15:28:58 +02:00
Sem van der Hoeven
de2af0cf7c try according to tutorial 2023-05-01 15:27:15 +02:00
Sem van der Hoeven
9abee2b965 add shared ptr 2023-05-01 15:18:06 +02:00
Sem van der Hoeven
f4819381a5 stupid 2023-05-01 15:16:45 +02:00
Sem van der Hoeven
1ff1218359 try something else 2023-05-01 14:50:41 +02:00
Sem van der Hoeven
1c995253bd oops 2023-05-01 14:48:08 +02:00
Sem van der Hoeven
8f807bdfa3 try setting callback with bind 2023-05-01 14:47:22 +02:00
Sem van der Hoeven
b9b8c99f20 add server function 2023-05-01 14:46:06 +02:00
Sem van der Hoeven
6129216d80 add message code hpp file 2023-05-01 14:41:28 +02:00
Sem van der Hoeven
5996ac225a add include own package 2023-05-01 14:34:07 +02:00
Sem van der Hoeven
e7582c5760 add srv include 2023-05-01 14:32:39 +02:00
Sem van der Hoeven
db2b25e60d change int to int8 2023-05-01 14:29:11 +02:00
Sem van der Hoeven
fb34e50b38 add service definition 2023-05-01 14:28:00 +02:00
ubuntu
d82b1925a4 add srv file 2023-05-01 14:17:59 +02:00
Sem van der Hoeven
3e740de48e add circling 2023-05-01 14:07:09 +02:00
Sem van der Hoeven
c7dd7a25a0 try changing yawspeed 2023-05-01 14:02:23 +02:00
Sem van der Hoeven
65cd11ca11 add changing yawspeed 2023-05-01 13:59:48 +02:00
ubuntu
eeb67733d3 create drone_controls package 2023-05-01 13:49:31 +02:00
Sem van der Hoeven
568197a95a change to use d_speed 2023-05-01 12:47:31 +02:00
Sem van der Hoeven
500356f4e9 fix bug 2023-05-01 12:45:34 +02:00
Sem van der Hoeven
7b0520c920 use pointer method get 2023-05-01 12:43:41 +02:00
Sem van der Hoeven
3f2ffd6dc7 add hover after 20 s 2023-05-01 12:43:02 +02:00
Sem van der Hoeven
04cad041b6 change value 2023-05-01 12:39:12 +02:00
Sem van der Hoeven
ac759ace13 change to not check for 30 2023-05-01 12:38:25 +02:00
Sem van der Hoeven
a739fb51c3 change value 2023-05-01 12:36:38 +02:00
Sem van der Hoeven
a9c63cc235 change value 2023-05-01 12:35:08 +02:00
Sem van der Hoeven
e0c9c2601d add launch file to cmakelists 2023-05-01 11:38:16 +02:00
Sem van der Hoeven
6348e5371f add launch file 2023-05-01 11:30:06 +02:00
ubuntu
4eb876df0c add run script 2023-05-01 11:27:38 +02:00
Sem van der Hoeven
9c3dcb463d make dat boi schmoov 2023-05-01 11:23:25 +02:00
Sem van der Hoeven
048a1b4929 change values 2023-05-01 11:18:35 +02:00
Sem van der Hoeven
346e41f475 change values 2023-05-01 11:08:39 +02:00
Sem van der Hoeven
33d173d1e0 try to hover 2023-05-01 11:07:27 +02:00
Sem van der Hoeven
088af872f9 try negative down speed 2023-05-01 11:02:50 +02:00
Sem van der Hoeven
60033323d4 change speeds 2023-05-01 11:01:24 +02:00
Sem van der Hoeven
6b33ded940 add compensation for earth gravity pull 2023-05-01 10:56:43 +02:00
Sem van der Hoeven
ae18d7834a try up velocity of 1 2023-05-01 10:55:01 +02:00
Sem van der Hoeven
4449c6cc1f change checking of ready to fly 2023-05-01 10:51:03 +02:00
Sem van der Hoeven
23a59a449c typo 2023-05-01 10:21:03 +02:00
Sem van der Hoeven
3fe7b60374 add try sending trajectory setpoints 2023-05-01 10:19:45 +02:00
Sem van der Hoeven
19d1987484 try adding hover? 2023-04-28 21:01:12 +02:00
Sem van der Hoeven
c0d327165c change formatting numbers to f in strings 2023-04-28 20:59:38 +02:00
Sem van der Hoeven
799ef4237e try adding hover? 2023-04-28 20:57:35 +02:00
Sem van der Hoeven
0c543614a9 oops 2023-04-28 20:52:38 +02:00
Sem van der Hoeven
c4e9e3bb10 remove heartbeat from px4 controller 2023-04-28 20:52:02 +02:00
Sem van der Hoeven
37b5f14f72 change throttle 2023-04-28 20:48:07 +02:00
Sem van der Hoeven
1515206e2e set throttle to negative 2023-04-28 20:46:41 +02:00
Sem van der Hoeven
52f237fcb5 add extra parameters 2023-04-28 20:45:08 +02:00
Sem van der Hoeven
a037b7f00e try diff values 2023-04-28 20:40:28 +02:00
Sem van der Hoeven
b775f8015c try diff values 2023-04-28 20:36:01 +02:00
Sem van der Hoeven
10c0b5ae5f increase thrust 2023-04-28 20:33:20 +02:00
Sem van der Hoeven
4b063ce9b2 try with increasing thrust 2023-04-28 18:36:23 +02:00
Sem van der Hoeven
f767ee2583 try different values 2023-04-28 18:29:20 +02:00
Sem van der Hoeven
1224735954 waited longer before arming 2023-04-28 18:25:22 +02:00
Sem van der Hoeven
a3b0b761e7 made px4controller also send heartbeat 2023-04-28 18:22:41 +02:00
Sem van der Hoeven
806317a04c oops v2 2023-04-28 18:07:42 +02:00
Sem van der Hoeven
b03951faab oops 2023-04-28 18:07:04 +02:00
Sem van der Hoeven
5b935af894 change attitude value 2023-04-28 18:03:43 +02:00
Sem van der Hoeven
7545a8a2a8 add disarm 2023-04-28 18:03:14 +02:00
Sem van der Hoeven
9464dbf5ac try different values 2023-04-28 17:57:32 +02:00
Sem van der Hoeven
c9f546cb0c try different values 2023-04-28 17:53:46 +02:00
Sem van der Hoeven
f883d826ec change to 100% thrust 2023-04-28 17:50:15 +02:00
Sem van der Hoeven
5a7a54fc53 change 0.5 thrust to 0.8 2023-04-28 17:44:22 +02:00
Sem van der Hoeven
7a2f19d311 add comment 2023-04-28 17:37:07 +02:00
Sem van der Hoeven
b8f572d86f fix 2023-04-28 17:31:16 +02:00
Sem van der Hoeven
c8a61cac40 change name of quaternion array 2023-04-28 17:29:35 +02:00
Sem van der Hoeven
52132684d2 test move up 2023-04-28 17:25:26 +02:00
Sem van der Hoeven
8acd7f2c73 add print of quaternion 2023-04-28 16:50:28 +02:00
Sem van der Hoeven
b4494a726d change heartbeat to attitude 2023-04-28 16:47:54 +02:00
Sem van der Hoeven
c44dcb7f89 change ptr to std::array 2023-04-28 16:40:12 +02:00
Sem van der Hoeven
29931565e2 change ptr to std::array 2023-04-28 16:40:00 +02:00
Sem van der Hoeven
abd5931461 add calculating quaternion 2023-04-28 15:53:44 +02:00
Sem van der Hoeven
7fa1cd5816 100% thrust 2023-04-28 15:19:04 +02:00
Sem van der Hoeven
1775cae443 remove timesync includes 2023-04-28 15:16:13 +02:00
Sem van der Hoeven
d24f91512f change quaternion values 2023-04-28 15:12:08 +02:00
Sem van der Hoeven
bd8cec8516 typo 2023-04-28 14:51:14 +02:00
Sem van der Hoeven
388963511a test with 0 values 2023-04-28 14:47:36 +02:00
Sem van der Hoeven
e3466a1077 change float f to .0 2023-04-28 13:39:18 +02:00
Sem van der Hoeven
0107bb3c0b change vehicle attitude setpoint to trajectory setpoint for velocity 2023-04-28 12:46:05 +02:00
Sem van der Hoeven
6bdb10dd5c change vehicle attitude setpoint to trajectory setpoint for velocity 2023-04-28 12:45:27 +02:00
Sem van der Hoeven
5496e400cf it finally works 2023-04-25 15:45:14 +00:00
Sem van der Hoeven
4ed6dde80e typo v3 2023-04-25 16:58:10 +02:00
Sem van der Hoeven
78ac1963df typo v2 2023-04-25 16:55:55 +02:00
Sem van der Hoeven
fd2ace29ce typo 2023-04-25 16:54:57 +02:00
Sem van der Hoeven
455c495685 add setting to offboard mode and arming 2023-04-25 16:53:40 +02:00
Sem van der Hoeven
4540a24d85 fix name 2023-04-25 16:46:28 +02:00
Sem van der Hoeven
a12d1836fe add filling message with test values 2023-04-25 16:45:01 +02:00
Sem van der Hoeven
43f3838979 add vehicle attitude setpoint publisher 2023-04-25 16:39:15 +02:00
Sem van der Hoeven
5b6c097bd9 update CMakeLists.txt to be similar to object detection 2023-04-25 16:34:05 +02:00
Sem van der Hoeven
b5daa4a77a add px4 controller cmakelists 2023-04-25 14:32:19 +00:00
Sem van der Hoeven
15e530067e remove send setpoints 2023-04-25 14:24:28 +00:00
Sem van der Hoeven
8b1790f763 change CMakeLists.txt of heartbeat to include packages for ros 2023-04-25 16:15:03 +02:00
Sem van der Hoeven
010559ea9b put px4_connection package in src folder 2023-04-25 13:56:48 +00:00
Sem van der Hoeven
9ace6a70b3 add heartbeat package 2023-04-25 13:52:47 +00:00
Sem van der Hoeven
5ea8d5674f finish sending offboard control and check if 5 seconds elapsed 2023-04-25 14:24:56 +02:00
Sem van der Hoeven
f53385ae0a add sending offboardcontrolmode message 2023-04-25 14:08:42 +02:00
Sem van der Hoeven
c748bc5da8 add timer and publisher 2023-04-25 11:58:21 +00:00
Sem van der Hoeven
5c4d47b590 add message includes for sending offboard control mode messages 2023-04-25 11:53:49 +00:00
Sem van der Hoeven
0d52a66d2a Merge branch 'main' into send_setpoints 2023-04-25 11:27:04 +00:00
Sem van der Hoeven
40facd933b move microxrcedds log to script_outputs 2023-04-25 11:15:32 +00:00
Sem van der Hoeven
59421316b4 add script log outputs 2023-04-25 11:15:09 +00:00
Sem van der Hoeven
078a4a1a1a tested microxrcedds 2023-04-25 11:13:18 +00:00
SemvdH
39ca39e983 Merge pull request #4 from SemvdH/heigth_sensor
merge Heigth sensor into main
2023-04-25 11:12:28 +02:00
Sem van der Hoeven
9af542d4ad everything built 2023-04-25 09:11:44 +00:00
Sem van der Hoeven
48b5016897 why 2023-04-24 15:41:11 +00:00
Sem van der Hoeven
09cda4e1d0 bruh 2023-04-24 17:20:42 +02:00
Sem van der Hoeven
8aa5e6fe35 add generators to cmake 2023-04-24 17:19:22 +02:00
Sem van der Hoeven
8fb86a5e2d add publishing of topic 2023-04-24 15:48:50 +02:00
Sem van der Hoeven
ed542e2f21 update package.xml of height package 2023-04-24 15:41:57 +02:00
Sem van der Hoeven
df18c9bba6 add height message definition 2023-04-24 15:38:16 +02:00
Sem van der Hoeven
1c1ea30dc0 created node to read basics of height sensor 2023-04-24 13:36:08 +00:00
Sem van der Hoeven
b258131480 Revert "add node with basic code to read sensor"
This reverts commit 5f98cb2f10.
2023-04-24 13:18:42 +00:00
Sem van der Hoeven
5f98cb2f10 add node with basic code to read sensor 2023-04-24 15:12:34 +02:00
Sem van der Hoeven
8cbf27cd63 add dependencies for terabee api 2023-04-24 14:52:31 +02:00
Sem van der Hoeven
85390c0d4d add height sensor files 2023-04-24 12:47:15 +00:00
Sem van der Hoeven
6da45f1240 remove unnecessary folders 2023-04-24 12:49:44 +02:00
Sem van der Hoeven
9942e65bd3 merge main into this branch 2023-04-24 12:48:30 +02:00
SemvdH
0c944ce3b6 Merge pull request #3 from SemvdH/object_detection
Finished object detection nodes
2023-04-24 12:41:12 +02:00
Sem van der Hoeven
2103260f0f oops 2023-04-24 12:31:23 +02:00
Sem van der Hoeven
1fc71c7ca7 add parameter and launch for lidar reader 2023-04-24 12:29:53 +02:00
Sem van der Hoeven
8fd8662e0d add launch file 2023-04-24 12:21:43 +02:00
Sem van der Hoeven
e8ecc7eac4 add publishing message 2023-04-24 12:10:34 +02:00
Sem van der Hoeven
fd83eb616a fix typo in include 2023-04-24 12:05:10 +02:00
Sem van der Hoeven
3110abcbf0 add message definition include 2023-04-24 12:04:12 +02:00
Sem van der Hoeven
076bb6507b add message interface for multiflex readings 2023-04-24 12:00:48 +02:00
Sem van der Hoeven
de9510c096 add example reading of multiflex data 2023-04-24 11:57:13 +02:00
Sem van der Hoeven
32d73ba229 add files for multiflex reader 2023-04-24 09:41:08 +00:00
Sem van der Hoeven
91354beb0b stuff 2023-04-24 09:18:37 +00:00
Sem van der Hoeven
a1b778b74b fix typo 2023-04-20 16:00:09 +02:00
Sem van der Hoeven
be267f2aff fix typo 2023-04-20 15:59:16 +02:00
Sem van der Hoeven
615d026eb6 fix typo 2023-04-20 15:58:01 +02:00
Sem van der Hoeven
263f1c154e comment 2023-04-20 15:56:18 +02:00
Sem van der Hoeven
68cb8effa9 add px4 includes 2023-04-20 15:54:47 +02:00
Sem van der Hoeven
a444ce3193 add setpoints package 2023-04-20 13:49:43 +00:00
Sem van der Hoeven
091fe9a4ee add putting reading values in message 2023-04-20 13:21:54 +02:00
Sem van der Hoeven
988c546f15 add i to cout of distance data 2023-04-20 12:04:26 +02:00
Sem van der Hoeven
225c9ef7ae fix typo 2023-04-20 12:02:56 +02:00
Sem van der Hoeven
16192c6c8b add imu data to message 2023-04-20 11:50:24 +02:00
Sem van der Hoeven
cedff67864 add todo 2023-04-19 17:00:06 +02:00
Sem van der Hoeven
682b18d396 add terabee log 2023-04-19 14:59:11 +00:00
Sem van der Hoeven
38a34a6de7 Merge branch 'object_detection' of github.com:SemvdH/5g_drone_ROS2 into object_detection 2023-04-19 14:56:52 +00:00
Sem van der Hoeven
1ac0bfead3 lil fix 2023-04-19 16:56:38 +02:00
Sem van der Hoeven
8712315b92 Merge branch 'object_detection' of github.com:SemvdH/5g_drone_ROS2 into object_detection 2023-04-19 14:55:31 +00:00
Sem van der Hoeven
7ae5295134 change to pointer 2023-04-19 16:55:17 +02:00
Sem van der Hoeven
bec6025654 Merge branch 'object_detection' of github.com:SemvdH/5g_drone_ROS2 into object_detection 2023-04-19 14:52:45 +00:00
Sem van der Hoeven
4d4647f348 add example code from terabee 2023-04-19 16:52:29 +02:00
Sem van der Hoeven
98668938cc Merge branch 'object_detection' of github.com:SemvdH/5g_drone_ROS2 into object_detection 2023-04-19 14:44:08 +00:00
Sem van der Hoeven
99b34fa55e custom msg 2023-04-19 14:43:51 +00:00
Sem van der Hoeven
f3e4468339 custom message bullshit doesnt fucking work 2023-04-19 16:19:20 +02:00
Sem van der Hoeven
645754e56f add include of message 2023-04-19 16:14:48 +02:00
Sem van der Hoeven
200f1f97ec add message definition 2023-04-19 16:10:27 +02:00
Sem van der Hoeven
1c3ab27707 add object detection package 2023-04-19 14:00:44 +00:00
Sem van der Hoeven
4e8e1c8177 change binary mode 2023-03-03 14:54:55 +01:00
Sem van der Hoeven
0f0324ab9d add modes and remove close of port 2023-03-03 14:52:43 +01:00
Sem van der Hoeven
126ff49a35 change string to char* 2023-03-03 14:47:11 +01:00
Sem van der Hoeven
345e796392 decrease timer delay 2023-03-03 14:45:26 +01:00
Sem van der Hoeven
e5ddab280e add printing of T value 2023-03-03 14:45:06 +01:00
Sem van der Hoeven
9e5f2363f6 extra print 2023-03-03 14:26:09 +01:00
Sem van der Hoeven
4f530da21d change T to number 2023-03-03 14:22:08 +01:00
Sem van der Hoeven
1df349b478 add reading bytes when getting a T 2023-03-03 14:19:42 +01:00
Sem van der Hoeven
24fc0c2ca5 fix error 2023-03-03 14:04:14 +01:00
Sem van der Hoeven
31503b8b70 add check start of measurement test 2023-03-03 13:59:11 +01:00
Sem van der Hoeven
a6fd08738c change test method 2023-03-03 12:55:22 +00:00
Sem van der Hoeven
b88d8beb39 add test calling method while node spinning 2023-03-03 13:37:31 +01:00
Sem van der Hoeven
4df0d69b53 Merge branch 'heigth_sensor' of github.com:SemvdH/5g_drone_ROS2 into heigth_sensor 2023-03-03 13:29:09 +01:00
Sem van der Hoeven
ed71dfb0e9 test 2023-03-03 13:28:41 +01:00
Sem van der Hoeven
353bf74930 change wait to 1 ms 2023-03-03 12:23:20 +00:00
Sem van der Hoeven
015d7d7596 reading single byte 2023-03-03 13:10:05 +01:00
Sem van der Hoeven
f0f63b1817 serial port test if it can be opened 2023-03-03 12:58:55 +01:00
Sem van der Hoeven
eaeb2dba5a add test print 2023-03-03 12:47:04 +01:00
Sem van der Hoeven
ee2d5c4d54 add gitignore 2023-03-03 11:29:59 +01:00
Sem van der Hoeven
5ce3d43841 initial commit 2023-03-03 10:15:52 +00:00
35 changed files with 8789 additions and 6 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
.vscode/
build/
install/
log/

View File

@@ -10,7 +10,9 @@
"/home/ubuntu/ros2_ws/src/beacon_positioning/include/**",
"/usr/include/**",
"/mnt/Homework/Avans/AFSTUDEERSTAGE/positioning_systems_api/rtls_driver/include/**",
"/mnt/Homework/Avans/AFSTUDEERSTAGE/positioning_systems_api/serial_communication/include/**"
"/mnt/Homework/Avans/AFSTUDEERSTAGE/positioning_systems_api/serial_communication/include/**",
"/mnt/Homework/Avans/AFSTUDEERSTAGE/terabee_api/include/**",
"/home/ubuntu/ros2_ws/build/px4_msgs/rosidl_generator_cpp/px4_msgs/msg/**"
],
"name": "ROS",
"intelliSenseMode": "gcc-x64",

61
.vscode/settings.json vendored
View File

@@ -1,7 +1,66 @@
{
"ros.distro": "humble",
"files.associations": {
"chrono": "cpp"
"chrono": "cpp",
"array": "cpp",
"atomic": "cpp",
"bit": "cpp",
"*.tcc": "cpp",
"cctype": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"compare": "cpp",
"concepts": "cpp",
"condition_variable": "cpp",
"csignal": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"list": "cpp",
"map": "cpp",
"set": "cpp",
"unordered_map": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"functional": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iosfwd": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"memory": "cpp",
"mutex": "cpp",
"new": "cpp",
"numbers": "cpp",
"numeric": "cpp",
"optional": "cpp",
"ostream": "cpp",
"ratio": "cpp",
"semaphore": "cpp",
"shared_mutex": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"stop_token": "cpp",
"streambuf": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"thread": "cpp",
"type_traits": "cpp",
"tuple": "cpp",
"typeindex": "cpp",
"typeinfo": "cpp",
"utility": "cpp",
"variant": "cpp"
},
"python.autoComplete.extraPaths": [
"/home/ubuntu/ros2_ws/install/px4_msgs/lib/python3.8/site-packages",

0
TerabeeLog.log Normal file
View File

7
get_build.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
echo "updating git..."
./fgit.sh
echo "building package..."
colcon build --packages-select px4_connection
#echo "launching controller..."
#ros2 run px4_connection px4_controller

1051
mav.parm Normal file

File diff suppressed because it is too large Load Diff

BIN
mav.tlog Normal file

Binary file not shown.

BIN
mav.tlog.raw Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -31,7 +31,9 @@ rosidl_generate_interfaces(${PROJECT_NAME}
)
add_executable(tracker_position src/tracker_position.cpp)
ament_target_dependencies(tracker_position rclcpp std_msgs beacon_positioning)
ament_target_dependencies(tracker_position rclcpp std_msgs
beacon_positioning
)
target_link_libraries(tracker_position
positioning_systems_api::serial_communication

View File

@@ -149,7 +149,7 @@ int main(int argc, char **argv)
if (tracker_msg.is_valid_position)
{
RCLCPP_INFO(node->get_logger(), "x = %f, y = %f, z = %f", tracker_msg.tracker_position_xyz.at(0), tracker_msg.tracker_position_xyz.at(1), tracker_msg.tracker_position_xyz.at(2));
for (int i = 0; i < tracker_msg.anchors_data.size(); i++)
for (size_t i = 0; i < tracker_msg.anchors_data.size(); i++)
{
RCLCPP_INFO(node->get_logger(), "anchor number= %d, distance = %d, x = %d, y = %d, z = %d", tracker_msg.anchors_data[i].number, tracker_msg.anchors_data[i].distance, tracker_msg.anchors_data[i].pos_x, tracker_msg.anchors_data[i].pos_y, tracker_msg.anchors_data[i].pos_z);
}
@@ -160,7 +160,7 @@ int main(int argc, char **argv)
message.y_pos = tracker_msg.tracker_position_xyz.at(1);
message.z_pos = tracker_msg.tracker_position_xyz.at(2);
message.anchor_distances = {0, 0, 0, 0};
for (int i = 0; i < tracker_msg.anchors_data.size(); i++)
for (size_t i = 0; i < tracker_msg.anchors_data.size(); i++)
{
message.anchor_distances[i] = tracker_msg.anchors_data[i].distance;
}

View File

@@ -0,0 +1,33 @@
cmake_minimum_required(VERSION 3.5)
project(drone_controls)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()

View File

@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>drone_controls</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="ubuntu@todo.todo">ubuntu</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>

58
src/height/CMakeLists.txt Normal file
View File

@@ -0,0 +1,58 @@
cmake_minimum_required(VERSION 3.5)
project(height)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(TerabeeApi REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(height REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/HeightData.msg"
)
add_executable(height_reader src/height_reader.cpp)
target_include_directories(height_reader PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_link_libraries(height_reader ${TerabeeApi_LIBRARIES})
target_include_directories(height_reader PUBLIC ${TerabeeApi_INCLUDE_DIRS})
ament_target_dependencies(
height_reader
rclcpp
TerabeeApi
height
)
install(TARGETS height_reader
DESTINATION lib/${PROJECT_NAME})
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()

View File

@@ -0,0 +1,2 @@
float32[4] heights
float32 min_height

27
src/height/package.xml Normal file
View File

@@ -0,0 +1,27 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>height</name>
<version>0.0.0</version>
<description>package to read Terabee node</description>
<maintainer email="semmer99@gmail.com">ubuntu</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<build_depend>TerabeeApi</build_depend>
<exec_depend>TerabeeApi</exec_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>

View File

@@ -0,0 +1,97 @@
#include <chrono>
#include <iostream>
#include "rclcpp/rclcpp.hpp"
#include "height/msg/height_data.hpp"
#include <terabee/ITerarangerFactory.hpp>
#include <terabee/ITerarangerEvoMini.hpp>
#include <terabee/DistanceData.hpp>
using namespace std::chrono_literals;
using terabee::DistanceData;
using terabee::ITerarangerEvoMini;
std::ostream &operator<<(std::ostream &os, const DistanceData &d)
{
os << "[";
for (size_t i = 0; i < d.distance.size(); i++)
{
os << d.distance[i] << ", ";
}
os << "\b\b"
<< " ]";
return os;
}
class HeightReader : public rclcpp::Node
{
public:
HeightReader() : rclcpp::Node("height_reader")
{
rcl_interfaces::msg::ParameterDescriptor descriptor = rcl_interfaces::msg::ParameterDescriptor{};
descriptor.description = "serial port for the USB port of the height sensor";
this->declare_parameter("height_serial_port", "/dev/ttyACM0", descriptor);
factory = terabee::ITerarangerFactory::getFactory();
evo_mini = factory->createTerarangerEvoMini(this->get_parameter("height_serial_port").as_string());
if (!evo_mini)
{
RCLCPP_ERROR(this->get_logger(), "Failed to create Evo Mini!");
return;
}
evo_mini->setPixelMode(ITerarangerEvoMini::Px4Mode);
if (!evo_mini->initialize())
{
RCLCPP_ERROR(this->get_logger(), "Failed to initialize evo mini!");
return;
}
RCLCPP_INFO(this->get_logger(), "Succesfully initialized Evo mini!");
timer_ = this->create_wall_timer(500ms, std::bind(&HeightReader::read_height, this));
publisher_ = this->create_publisher<height::msg::HeightData>("drone/height", 10);
}
private:
void read_height()
{
auto msg = height::msg::HeightData();
float min = 255;
terabee::DistanceData distance_data = evo_mini->getDistance();
for (size_t i = 0; i < distance_data.size(); i++)
{
msg.heights[i] = distance_data.distance[i];
if (distance_data.distance[i] < min && distance_data.distance[i] >= 0)
{
min = distance_data.distance[i];
}
}
msg.min_height = min;
publisher_->publish(msg);
RCLCPP_INFO(this->get_logger(),"publishing message with min distance %f",msg.min_height);
}
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<height::msg::HeightData>::SharedPtr publisher_;
std::unique_ptr<terabee::ITerarangerFactory> factory;
std::unique_ptr<terabee::ITerarangerEvoMini> evo_mini;
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<HeightReader>());
rclcpp::shutdown();
return 0;
}

View File

@@ -0,0 +1,71 @@
cmake_minimum_required(VERSION 3.5)
project(object_detection)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
find_package(rclcpp REQUIRED)
find_package(TerabeeApi REQUIRED)
find_package(rosidl_default_generators REQUIRED)
find_package(object_detection REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/LidarReading.msg"
"msg/MultiflexReading.msg"
)
add_executable(lidar_reader src/lidar_reader.cpp)
ament_target_dependencies(lidar_reader rclcpp
object_detection
)
target_link_libraries(lidar_reader ${TerabeeApi_LIBRARIES})
target_include_directories(lidar_reader PUBLIC ${TerabeeApi_INCLUDE_DIRS})
add_executable(multiflex_reader src/multiflex_reader.cpp)
ament_target_dependencies(multiflex_reader rclcpp
object_detection
)
target_link_libraries(multiflex_reader ${TerabeeApi_LIBRARIES})
target_include_directories(multiflex_reader PUBLIC ${TerabeeApi_INCLUDE_DIRS})
install(TARGETS
lidar_reader
multiflex_reader
DESTINATION lib/${PROJECT_NAME}
)
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
#set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
#set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()

View File

@@ -0,0 +1,23 @@
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package="object_detection",
executable="multiflex_reader",
name="multiflex_reader",
parameters=[
{"multiflex_serial_port": "/dev/ttyACM0"}
]
),
Node(
package="object_detection",
executable="lidar_reader",
name="lidar_reader",
parameters=[
{"lidar_serial_port": "/dev/ttyUSB0"} # TODO test
]
)
])

View File

@@ -0,0 +1,15 @@
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package="object_detection",
executable="multiflex_reader",
name="multiflex_reader",
parameters=[
{"multiflex_serial_port": "/dev/ttyACM0"}
]
)
])

View File

@@ -0,0 +1,6 @@
float32 sensor_1
float32 sensor_2
float32 sensor_3
float32 sensor_4
float32[] imu_data

View File

@@ -0,0 +1 @@
float32[6] distance_data

View File

@@ -0,0 +1,27 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>object_detection</name>
<version>0.0.0</version>
<description>Package to read the TeraBee lidar and multiflex sensors</description>
<maintainer email="semmer99@gmail.com">sem</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<build_depend>rclcpp</build_depend>
<build_depend>TerabeeApi</build_depend>
<exec_depend>TerabeeApi</exec_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>

View File

@@ -0,0 +1,121 @@
#include <chrono>
#include <functional>
#include <memory>
#include <string>
#include <iostream>
#include "rclcpp/rclcpp.hpp"
#include "object_detection/msg/lidar_reading.hpp"
#include <terabee/ITerarangerFactory.hpp>
#include <terabee/ITerarangerTowerEvo.hpp>
#include <terabee/TowerDistanceData.hpp>
#include <terabee/ImuData.hpp>
using terabee::ImuData;
using terabee::ITerarangerTowerEvo;
using terabee::TowerDistanceData;
using namespace std::chrono_literals;
/* This example creates a subclass of Node and uses std::bind() to register a
* member function as a callback from the timer. */
std::ostream &operator<<(std::ostream &os, const TowerDistanceData &d)
{
os << "[";
for (size_t i = 0; i < d.distance.size(); i++)
{
os << i << " " << d.distance[i] << (d.mask[i] ? " <new>, " : " <old>, ");
}
os << "\b\b"
<< " ]";
return os;
}
std::ostream &operator<<(std::ostream &os, const ImuData &d)
{
os << "[";
for (size_t i = 0; i < d.data.size(); i++)
{
os << d.data[i] << ", ";
}
os << "\b\b"
<< " ]";
return os;
}
class LidarReader : public rclcpp::Node
{
public:
LidarReader()
: Node("lidar_reader")
{
rcl_interfaces::msg::ParameterDescriptor descriptor = rcl_interfaces::msg::ParameterDescriptor{};
descriptor.description = "serial port for the USB port of the LIDAR";
this->declare_parameter("lidar_serial_port", "/dev/ttyACM0", descriptor);
// publisher_ = this->create_publisher<object_detection::msg::LidarReading>("drone/object_detection", 10);
timer_ = this->create_wall_timer(500ms, std::bind(&LidarReader::read_lidar_data, this));
ITerarangerTowerEvo::ImuMode mode(ITerarangerTowerEvo::QuaternionLinearAcc);
factory = terabee::ITerarangerFactory::getFactory();
tower = factory->createTerarangerTowerEvo(this->get_parameter("lidar_serial_port").as_string());
if (!tower)
{
RCLCPP_ERROR(this->get_logger(), "Failed to create TerarangerTowerEvo");
return;
}
tower->setImuMode(mode);
if (!tower->initialize())
{
RCLCPP_ERROR(this->get_logger(), "Failed to initialize TerarangerTowerEvo");
return;
}
}
private:
void read_lidar_data()
{
//TODO publish message with all data from lidar
// std::cout << "Distance = " << tower->getDistance() << std::endl;
// std::cout << "IMU = " << tower->getImuData() << std::endl;
// auto msg = object_detection::msg::LidarReading();
// msg.sensor_1 = tower->getDistance().distance.at(0);
// msg.sensor_2 = tower->getDistance().distance.at(2);
// msg.sensor_3 = tower->getDistance().distance.at(4);
// msg.sensor_4 = tower->getDistance().distance.at(6);
// ImuData imu_data = tower->getImuData();
// for (size_t i = 0; i < imu_data.data.size(); i++)
// {
// msg.imu_data.push_back(imu_data.data[i]);
// }
// // publisher_->publish(msg);
// RCLCPP_INFO(this->get_logger(), "Publishing message");
}
// rclcpp::Publisher<object_detection::msg::LidarReading>::SharedPtr publisher_;
rclcpp::TimerBase::SharedPtr timer_;
// terabee tower evo variables
std::unique_ptr<terabee::ITerarangerTowerEvo> tower;
std::unique_ptr<terabee::ITerarangerFactory> factory;
};
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<LidarReader>());
rclcpp::shutdown();
return 0;
}

View File

@@ -0,0 +1,81 @@
#include <chrono>
#include <functional>
#include <memory>
#include <string>
#include <iostream>
#include "rclcpp/rclcpp.hpp"
#include "object_detection/msg/multiflex_reading.hpp"
#include <terabee/ITerarangerFactory.hpp>
#include <terabee/ITerarangerMultiflex.hpp>
#include <terabee/DistanceData.hpp>
using terabee::DistanceData;
using namespace std::chrono_literals;
class MultiflexReader : public rclcpp::Node
{
public:
MultiflexReader()
: Node("multiflex_reader")
{
rcl_interfaces::msg::ParameterDescriptor serial_port_descriptor = rcl_interfaces::msg::ParameterDescriptor{};
serial_port_descriptor.description = "Serial port of the USB port that the multiflex PCB is connected to.";
this->declare_parameter("multiflex_serial_port", "/dev/ttyACM0", serial_port_descriptor);
factory = terabee::ITerarangerFactory::getFactory();
multiflex = factory->createTerarangerMultiflex(this->get_parameter("multiflex_serial_port").as_string());
if (!multiflex)
{
RCLCPP_ERROR(this->get_logger(), "Failed to create multiflex");
return;
}
if (!multiflex->initialize())
{
RCLCPP_ERROR(this->get_logger(), "Failed to initialize multiflex");
return;
}
if (!multiflex->configureNumberOfSensors(0x3f))
{
RCLCPP_ERROR(this->get_logger(), "Failed to set the number of sensors to 6!");
return;
}
RCLCPP_INFO(this->get_logger(), "Multiflex initialized");
publisher_ = this->create_publisher<object_detection::msg::MultiflexReading>("drone/object_detection", 10);
timer_ = this->create_wall_timer(500ms, std::bind(&MultiflexReader::read_multiflex_data, this));
}
private:
void read_multiflex_data()
{
terabee::DistanceData data = multiflex->getDistance();
auto msg = object_detection::msg::MultiflexReading();
for (size_t i = 0; i < data.size(); i++)
{
msg.distance_data[i] = data.distance[i];
}
publisher_->publish(msg);
}
std::unique_ptr<terabee::ITerarangerFactory> factory;
std::unique_ptr<terabee::ITerarangerMultiflex> multiflex;
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<object_detection::msg::MultiflexReading>::SharedPtr publisher_;
};
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<MultiflexReader>());
rclcpp::shutdown();
return 0;
}

View File

@@ -0,0 +1,76 @@
cmake_minimum_required(VERSION 3.5)
project(px4_connection)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(px4_ros_com REQUIRED)
find_package(px4_msgs REQUIRED)
find_package(px4_connection REQUIRED)
find_package(rosidl_default_generators REQUIRED)
rosidl_generate_interfaces(${PROJECT_NAME}
"srv/SetAttitude.srv"
)
include_directories(include)
add_executable(heartbeat src/heartbeat.cpp)
ament_target_dependencies(
heartbeat
rclcpp
px4_ros_com
px4_msgs
)
add_executable(px4_controller src/px4_controller.cpp)
ament_target_dependencies(
px4_controller
rclcpp
px4_ros_com
px4_msgs
px4_connection
)
target_include_directories(heartbeat PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
target_include_directories(px4_controller PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
install(TARGETS heartbeat px4_controller
DESTINATION lib/${PROJECT_NAME})
install(
DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# uncomment the line when a copyright and license is not present in all source files
# set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# uncomment the line when this package is not in a git repo
# set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()

View File

@@ -0,0 +1,8 @@
#ifndef ATTITUDE_MSG_CODE_HPP
#define ATTITUDE_MSG_CODE_HPP
#define ATTITUDE_STATUS_OK 0
#define ATTITUDE_STATUS_ERROR 1
#endif

View File

@@ -0,0 +1,15 @@
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package="px4_connection",
executable="heartbeat"
),
Node(
package="px4_connection",
executable="px4_controller"
)
])

View File

@@ -0,0 +1,25 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>px4_connection</name>
<version>0.0.0</version>
<description>Package to communicate with PX4 through the XRCE-DDS bridge</description>
<maintainer email="semmer99@gmail.com">ubuntu</maintainer>
<license>Apache License 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
<depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>

View File

@@ -0,0 +1,75 @@
/*
We need to send attitude setpoints to be able to arm the drone:
https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET
We need attitude setpoints because we don't have a GPS:
https://discuss.px4.io/t/cannot-arm-drone-with-companion-computer-arming-denied-manual-control-lost/31565/9
*/
#include <chrono>
#include "rclcpp/rclcpp.hpp"
#include <px4_msgs/msg/offboard_control_mode.hpp>
// #include <px4_msgs/msg/timesync.hpp>
using namespace std::chrono_literals;
class HeartBeat : public rclcpp::Node
{
public:
HeartBeat() : Node("setpoint_sender")
{
// create a publisher on the offboard control mode topic
offboard_control_mode_publisher_ = this->create_publisher<px4_msgs::msg::OffboardControlMode>("/fmu/in/offboard_control_mode", 10);
// create timer to send heartbeat messages (offboard control) every 100ms
timer_ = this->create_wall_timer(100ms, std::bind(&HeartBeat::send_heartbeat, this));
start_time = this->get_clock()->now().seconds();
RCLCPP_INFO(this->get_logger(), "done initializing at %d seconds. Sending heartbeat...", start_time);
}
private:
/**
* @brief Publish offboard control mode messages as a heartbeat.
* Only the attitude is enabled, because that is how the drone will be controlled.
*
*/
void send_heartbeat()
{
// set message to enable attitude
auto msg = px4_msgs::msg::OffboardControlMode();
msg.position = false;
msg.velocity = true;
msg.acceleration = false;
msg.attitude = false;
msg.body_rate = false;
msg.actuator = false;
// get timestamp and publish message
msg.timestamp = this->get_clock()->now().nanoseconds() / 1000;
offboard_control_mode_publisher_->publish(msg);
// RCLCPP_INFO(this->get_logger(), "sent offboard control mode message!");
// check if 5 seconds have elapsed
// if (this->get_clock()->now().seconds() - start_time > 5)
// {
// RCLCPP_INFO(this->get_logger(), "5 seconds elapsed!");
// }
}
rclcpp::Publisher<px4_msgs::msg::OffboardControlMode>::SharedPtr offboard_control_mode_publisher_;
rclcpp::TimerBase::SharedPtr timer_;
double start_time;
};
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<HeartBeat>());
rclcpp::shutdown();
return 0;
}

View File

@@ -0,0 +1,277 @@
/*
We need to send attitude setpoints to be able to arm the drone:
https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET
We need attitude setpoints because we don't have a GPS:
https://discuss.px4.io/t/cannot-arm-drone-with-companion-computer-arming-denied-manual-control-lost/31565/9
*/
#include <chrono>
#include <math.h>
#include "rclcpp/rclcpp.hpp"
// #include "attitude_msg_code.hpp"
#include <px4_msgs/msg/vehicle_attitude_setpoint.hpp>
#include <px4_msgs/msg/trajectory_setpoint.hpp>
// #include <px4_msgs/msg/timesync.hpp>
#include <px4_msgs/msg/vehicle_command.hpp>
#include <px4_msgs/msg/vehicle_control_mode.hpp>
#include <px4_connection/srv/set_attitude.hpp>
// #include <px4_msgs/msg/offboard_control_mode.hpp>
#define D_SPEED(x) -x - 9.81
using namespace std::chrono_literals;
class PX4Controller : public rclcpp::Node
{
public:
PX4Controller() : Node("px4_controller")
{
// create a publisher on the vehicle attitude setpoint topic
vehicle_setpoint_publisher_ = this->create_publisher<px4_msgs::msg::VehicleAttitudeSetpoint>("/fmu/in/vehicle_attitude_setpoint", 10);
vehicle_command_publisher_ = this->create_publisher<px4_msgs::msg::VehicleCommand>("/fmu/in/vehicle_command", 10);
trajectory_setpoint_publisher = this->create_publisher<px4_msgs::msg::TrajectorySetpoint>("/fmu/in/trajectory_setpoint", 10);
// offboard_control_mode_publisher_ = this->create_publisher<px4_msgs::msg::OffboardControlMode>("/fmu/in/offboard_control_mode", 10);
set_attitude_service_ = this->create_service<px4_connection::srv::SetAttitude>("set_attitude", std::bind(&PX4Controller::set_setpoint, this, std::placeholders::_1,std::placeholders::_2,std::placeholders::_3));
// service_ptr_ = this->create_service<std_srvs::srv::Empty>(
// "test_service",
// std::bind(&ServiceNode::service_callback, this, _1, _2, _3)
// );
// create timer to send vehicle attitude setpoints every second
timer_ = this->create_wall_timer(100ms, std::bind(&PX4Controller::send_setpoint, this));
start_time_ = this->get_clock()->now().seconds();
RCLCPP_INFO(this->get_logger(), "finished initializing at %f seconds.", start_time_);
}
private:
rclcpp::Publisher<px4_msgs::msg::VehicleAttitudeSetpoint>::SharedPtr vehicle_setpoint_publisher_;
rclcpp::Publisher<px4_msgs::msg::TrajectorySetpoint>::SharedPtr trajectory_setpoint_publisher;
rclcpp::Publisher<px4_msgs::msg::VehicleCommand>::SharedPtr vehicle_command_publisher_;
rclcpp::Service<px4_connection::srv::SetAttitude>::SharedPtr set_attitude_service_;
// rclcpp::Publisher<px4_msgs::msg::OffboardControlMode>::SharedPtr offboard_control_mode_publisher_;
rclcpp::TimerBase::SharedPtr timer_;
double start_time_;
bool has_sent_status = false;
bool flying = false;
bool has_swithed = false;
int setpoint_count = 0;
float thrust = 0.5;
bool ready_to_fly = false;
float cur_yaw = 0;
float last_setpoint[3] = {0,0,0};
float last_angle = 0;
void set_setpoint(
const std::shared_ptr<rmw_request_id_t> request_header,
const std::shared_ptr<px4_connection::srv::SetAttitude::Request> request,
const std::shared_ptr<px4_connection::srv::SetAttitude::Response> response)
{
last_setpoint[0] = request->x_speed;
last_setpoint[1] = request->y_speed;
last_setpoint[2] = request->x_speed;
last_angle = degrees_to_radians(request->angle);
response->status = 0;
}
void send_trajectory_setpoint()
{
auto msg = px4_msgs::msg::TrajectorySetpoint();
if (this->get_clock()->now().seconds() - start_time_ < 10)
{
msg.velocity[0] = 0;
msg.velocity[1] = 0;
msg.velocity[2] = D_SPEED(10);
msg.yawspeed = 0;
msg.yaw = -3.14;
}
else
{
if (!has_swithed)
{
RCLCPP_INFO(this->get_logger(), "switching to 0 vel");
has_swithed = true;
}
msg.velocity[0] = last_setpoint[0];
msg.velocity[1] = last_setpoint[1];
msg.velocity[2] = D_SPEED(last_setpoint[2]);
msg.yawspeed = 0.5;
msg.yaw = last_angle;
}
msg.timestamp = this->get_clock()->now().nanoseconds() / 1000;
trajectory_setpoint_publisher->publish(msg);
}
void send_attitude_setpoint()
{
if (setpoint_count % 20 == 0 && thrust <= 1)
{
thrust += 0.1;
RCLCPP_INFO(this->get_logger(), "increasing thrust to %f", thrust);
}
// set message to enable attitude
auto msg = px4_msgs::msg::VehicleAttitudeSetpoint();
// result quaternion
std::array<float, 4> q = {0, 0, 0, 0};
if (this->get_clock()->now().seconds() - start_time_ < 10)
{
// move up?
msg.thrust_body[0] = 0; // north
msg.thrust_body[1] = 0; // east
msg.thrust_body[2] = -0.8; // down, 100% thrust up
calculate_quaternion(q, 0, 0, 0);
}
else if (this->get_clock()->now().seconds() - start_time_ < 30)
{
if (!has_swithed)
{
RCLCPP_INFO(this->get_logger(), "changing to 0.5 thrust");
has_swithed = true;
}
msg.thrust_body[0] = 0; // north
msg.thrust_body[1] = 0; // east
msg.thrust_body[2] = -0.5; // down, 100% thrust up
calculate_quaternion(q, 0, 0, 0);
}
else
{
if (flying)
{
publish_vehicle_command(px4_msgs::msg::VehicleCommand::VEHICLE_CMD_COMPONENT_ARM_DISARM, 0.0, 0);
flying = false;
RCLCPP_INFO(this->get_logger(), "Disarm command sent after 30 seconds");
}
}
msg.q_d[0] = q.at(0);
msg.q_d[1] = q.at(1);
msg.q_d[2] = q.at(2);
msg.q_d[3] = q.at(3);
msg.yaw_sp_move_rate = 0;
msg.reset_integral = false;
msg.fw_control_yaw_wheel = false;
msg.timestamp = this->get_clock()->now().nanoseconds() / 1000;
vehicle_setpoint_publisher_->publish(msg);
}
/**
* @brief Send setpoints to PX4. First, 20 setpoints will be sent before offboard mode will be engaged and the drone will be armed.
*
*/
void send_setpoint()
{
// increase amount of setpoints sent
setpoint_count++;
ready_to_fly = setpoint_count == 20;
// after 20 setpoints, send arm command to make drone actually fly
if (ready_to_fly)
{
// switch to offboard mode and arm
// set to offboard mode
this->publish_vehicle_command(px4_msgs::msg::VehicleCommand::VEHICLE_CMD_DO_SET_MODE, 1, 6);
RCLCPP_INFO(this->get_logger(), "Set to offboard mode");
// arm the drone
this->publish_vehicle_command(px4_msgs::msg::VehicleCommand::VEHICLE_CMD_COMPONENT_ARM_DISARM, 1.0, 0);
RCLCPP_INFO(this->get_logger(), "Arm command sent");
flying = true;
}
send_trajectory_setpoint();
}
/**
* @brief Publish vehicle commands
* @param command Command code (matches VehicleCommand and MAVLink MAV_CMD codes)
* @param param1 Command parameter 1
* @param param2 Command parameter 2
*/
void publish_vehicle_command(uint16_t command, float param1, float param2)
{
px4_msgs::msg::VehicleCommand msg{};
msg.param1 = param1;
msg.param2 = param2;
msg.command = command;
msg.target_system = 1;
msg.target_component = 1;
msg.source_system = 1;
msg.source_component = 1;
msg.from_external = true;
msg.timestamp = this->get_clock()->now().nanoseconds() / 1000;
vehicle_command_publisher_->publish(msg);
}
/**
* @brief calculates a quaternion based on the given input values
*
* @param ptr array of result quaternion. Must be of size 4.
* @param heading desired heading (yaw) in radians.
* @param attitude desired attitude (pitch) in radians.
* @param bank desired bank (roll) in radians.
*/
static void calculate_quaternion(std::array<float, 4> ptr, float heading, float attitude, float bank)
{
float c1 = cos(heading / 2);
float c2 = cos(attitude / 2);
float c3 = cos(bank / 2);
float s1 = sin(heading / 2);
float s2 = sin(attitude / 2);
float s3 = sin(bank / 2);
float c1c2 = c1 * c2;
float s1s2 = s1 * s2;
ptr.at(0) = c1c2 * c3 - s1s2 * s3; // w
ptr.at(1) = c1c2 * s3 + s1s2 * c3; // x
ptr.at(2) = s1 * c2 * c3 + c1 * s2 * s3; // y
ptr.at(3) = c1 * s2 * c3 - s1 * c2 * s3; // z
}
/**
* @brief converts degrees to radians
*
* @param deg angle in degrees
* @return float new angle in radians
*/
static float degrees_to_radians(float deg)
{
return deg * (M_PI / 180.0);
}
};
int main(int argc, char *argv[])
{
rclcpp::init(argc, argv);
rclcpp::Node::SharedPtr node = std::make_shared<PX4Controller>();
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}

View File

@@ -0,0 +1,9 @@
#all speeds are in meters/second
float32 x_speed
float32 y_speed
float32 z_speed
#angle is in degrees
float32 angle
---
int8 status