Compare commits
28 Commits
crawler-so
...
0d0729cb99
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d0729cb99 | |||
| 6d7d7cbcfd | |||
| ea5978f4e4 | |||
| 942809c95a | |||
| c2695e1971 | |||
| af4c8f978b | |||
| 046c1f7846 | |||
| 03564ed485 | |||
| 19acde6d43 | |||
| d2f85f6aad | |||
| 779127ff73 | |||
| 9e58b2b1af | |||
| b902f8a500 | |||
| f38f1ab8ba | |||
| e092a570d1 | |||
| db52dbff47 | |||
| 9f0fb82831 | |||
| 049b1a7c5c | |||
| d12c7b64ed | |||
| f1696dd006 | |||
| 6fd0c249a0 | |||
| 66dfa763d2 | |||
| 218626d316 | |||
| f9a47e8891 | |||
| e414f63425 | |||
| 513fe74228 | |||
| 1e98970dc3 | |||
| d13b74ed47 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -9,3 +9,4 @@ __pycache__
|
|||||||
*.png
|
*.png
|
||||||
*.jpg
|
*.jpg
|
||||||
*.wav
|
*.wav
|
||||||
|
*.pdf
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
6
companion_software/images/get_endpoint.py
Normal file
6
companion_software/images/get_endpoint.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import json
|
||||||
|
import robot_util
|
||||||
|
|
||||||
|
url = '%s/v1/get_endpoint/jsmpeg_video_capture/%s' % ('https://api.robotstreamer.com', '4618')
|
||||||
|
response = robot_util.getWithRetry(url)
|
||||||
|
print(json.loads(response))
|
||||||
126
companion_software/images/robot_util.py
Normal file
126
companion_software/images/robot_util.py
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
import os
|
||||||
|
import time
|
||||||
|
import traceback
|
||||||
|
import ssl
|
||||||
|
import urllib.request
|
||||||
|
import getpass
|
||||||
|
import json
|
||||||
|
import _thread
|
||||||
|
|
||||||
|
|
||||||
|
ConfigFilename = "/home/pi/config_" + getpass.getuser() + ".json" #this is never used
|
||||||
|
|
||||||
|
KeepAlivePeriod = 6
|
||||||
|
|
||||||
|
|
||||||
|
def times(lst, number):
|
||||||
|
return [x*number for x in lst]
|
||||||
|
|
||||||
|
|
||||||
|
def getWithRetry(url, secure=True):
|
||||||
|
|
||||||
|
for retryNumber in range(2000):
|
||||||
|
try:
|
||||||
|
print("GET", url)
|
||||||
|
if secure:
|
||||||
|
object = urllib.request.urlopen(url)
|
||||||
|
|
||||||
|
else:
|
||||||
|
ctx = ssl.create_default_context()
|
||||||
|
ctx.check_hostname = False
|
||||||
|
ctx.verify_mode = ssl.CERT_NONE
|
||||||
|
object = urllib.request.urlopen(url, context=ctx)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
break
|
||||||
|
except:
|
||||||
|
print("could not open url", url)
|
||||||
|
traceback.print_exc()
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
data = object.read()
|
||||||
|
encoding = object.info().get_content_charset('utf-8')
|
||||||
|
return data.decode(encoding)
|
||||||
|
|
||||||
|
|
||||||
|
def getNoRetry(url, secure=True):
|
||||||
|
#socket test has retry
|
||||||
|
try:
|
||||||
|
print("GET", url)
|
||||||
|
if secure:
|
||||||
|
object = urllib.request.urlopen(url)
|
||||||
|
|
||||||
|
else:
|
||||||
|
ctx = ssl.create_default_context()
|
||||||
|
ctx.check_hostname = False
|
||||||
|
ctx.verify_mode = ssl.CERT_NONE
|
||||||
|
object = urllib.request.urlopen(url, context=ctx)
|
||||||
|
|
||||||
|
except:
|
||||||
|
print("could not open url", url)
|
||||||
|
return
|
||||||
|
|
||||||
|
data = object.read()
|
||||||
|
encoding = object.info().get_content_charset('utf-8')
|
||||||
|
return data.decode(encoding)
|
||||||
|
|
||||||
|
|
||||||
|
def sendSerialCommand(ser, command):
|
||||||
|
|
||||||
|
|
||||||
|
print(ser.name) # check which port was really used
|
||||||
|
ser.nonblocking()
|
||||||
|
|
||||||
|
# loop to collect input
|
||||||
|
#s = "f"
|
||||||
|
#print "string:", s
|
||||||
|
print(str(command.lower()))
|
||||||
|
ser.write(command.lower() + "\r\n") # write a string
|
||||||
|
#ser.write(s)
|
||||||
|
ser.flush()
|
||||||
|
|
||||||
|
#while ser.in_waiting > 0:
|
||||||
|
# print "read:", ser.read()
|
||||||
|
|
||||||
|
#ser.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def makePOST(url, data):
|
||||||
|
|
||||||
|
params = json.dumps(data).encode('utf8')
|
||||||
|
req = urllib.request.Request(url,
|
||||||
|
data=params,
|
||||||
|
headers={'content-type': 'application/json'})
|
||||||
|
response = urllib.request.urlopen(req)
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
def sendCameraAliveMessage(apiServer, cameraID, streamKey):
|
||||||
|
|
||||||
|
print("sending camera alive message")
|
||||||
|
url = '%s/v1/set_camera_status' % (apiServer)
|
||||||
|
print("url", url)
|
||||||
|
try:
|
||||||
|
response = makePOST(url, {'camera_id': cameraID,
|
||||||
|
'camera_status': 'online',
|
||||||
|
'stream_key': streamKey,
|
||||||
|
'type': 'robot_git'})
|
||||||
|
#todo:send unified stream key here
|
||||||
|
except:
|
||||||
|
print("could not make post to", url)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def aplayFile(filename):
|
||||||
|
for hardwareNumber in (2, 0, 1):
|
||||||
|
_thread.start_new_thread(os.system, ('aplay -D plughw:%d,0 %s' % (hardwareNumber, filename),))
|
||||||
|
|
||||||
|
|
||||||
|
def handleSoundCommand(command, keyPosition):
|
||||||
|
print("command:", command, "key position:", keyPosition)
|
||||||
|
if len(command) >= 6:
|
||||||
|
if command[0:5] == "SOUND" and keyPosition == "down":
|
||||||
|
number = int(command[5:])
|
||||||
|
aplayFile('/home/pi/sound/SOUND%d.WAV' % number)
|
||||||
1
companion_software/images/stream.sh
Executable file
1
companion_software/images/stream.sh
Executable file
@@ -0,0 +1 @@
|
|||||||
|
ffmpeg -re -f image2 -loop 1 -framerate 25 -video_size 1280x720 -r 25 -i Test-Pattern.png -c:v libx264 -b:v 1M -g 50 -bf 0 -muxdelay 0.001 -f flv "rtmp://rtmp.robotstreamer.com/live/4619?key=jEquBubjizYDMQNe8nKjLdu88iqFpNe3sVQmGRJ2tzbxd4QJrkSSEZBQhi9UTL3k"
|
||||||
BIN
crawler_cad/DigiCase/Digi Case Base.FCStd
Normal file
BIN
crawler_cad/DigiCase/Digi Case Base.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/DigiCase/Digi Case Lid.FCStd
Normal file
BIN
crawler_cad/DigiCase/Digi Case Lid.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/Frame.FCStd
Normal file
BIN
crawler_cad/Frame.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/9gServo.FCStd
Normal file
BIN
crawler_cad/MastCam/9gServo.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/MastCamFace.FCStd
Normal file
BIN
crawler_cad/MastCam/MastCamFace.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/MastCamMount.FCStd
Normal file
BIN
crawler_cad/MastCam/MastCamMount.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/MastCamRear.FCStd
Normal file
BIN
crawler_cad/MastCam/MastCamRear.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/MastCam/Window Wiper.FCStd
Normal file
BIN
crawler_cad/MastCam/Window Wiper.FCStd
Normal file
Binary file not shown.
BIN
crawler_cad/lewis-crawler.FCStd
Normal file
BIN
crawler_cad/lewis-crawler.FCStd
Normal file
Binary file not shown.
70
crawler_software/arduino/crawler_slave/Makefile
Normal file
70
crawler_software/arduino/crawler_slave/Makefile
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
### DISCLAIMER
|
||||||
|
### This is an example Makefile and it MUST be configured to suit your needs.
|
||||||
|
### For detailed explanations about all the available options,
|
||||||
|
### please refer to https://github.com/sudar/Arduino-Makefile/blob/master/arduino-mk-vars.md
|
||||||
|
|
||||||
|
### PROJECT_DIR
|
||||||
|
### This is the path to where you have created/cloned your project
|
||||||
|
PROJECT_DIR = $(shell dirname $(shell pwd))
|
||||||
|
|
||||||
|
### ARDMK_DIR
|
||||||
|
### Path to the Arduino-Makefile directory.
|
||||||
|
ARDMK_DIR = $(PROJECT_DIR)/Arduino-Makefile
|
||||||
|
|
||||||
|
### ARDUINO_DIR
|
||||||
|
### Path to the Arduino application and resources directory.
|
||||||
|
ARDUINO_DIR = /usr/share/arduino
|
||||||
|
|
||||||
|
### USER_LIB_PATH
|
||||||
|
### Path to where the your project's libraries are stored.
|
||||||
|
USER_LIB_PATH := $(realpath $(PROJECT_DIR)/lib)
|
||||||
|
|
||||||
|
### BOARD_TAG & BOARD_SUB
|
||||||
|
### For Arduino IDE 1.0.x
|
||||||
|
### Only BOARD_TAG is needed. It must be set to the board you are currently using. (i.e uno, mega2560, etc.)
|
||||||
|
# BOARD_TAG = mega2560
|
||||||
|
### For Arduino IDE 1.6.x
|
||||||
|
### Both BOARD_TAG and BOARD_SUB are needed. They must be set to the board you are currently using. (i.e BOARD_TAG = uno, mega, etc. & BOARD_SUB = atmega2560, etc.)
|
||||||
|
### Note: for the Arduino Uno, only BOARD_TAG is mandatory and BOARD_SUB can be equal to anything
|
||||||
|
BOARD_TAG = mega
|
||||||
|
BOARD_SUB = atmega2560
|
||||||
|
|
||||||
|
### MONITOR_PORT
|
||||||
|
### The port your board is connected to. Using an '*' tries all the ports and finds the right one. Choose one of the two.
|
||||||
|
MONITOR_PORT = /dev/ttyUSB*
|
||||||
|
# MONITOR_PORT = /dev/ttyACM*
|
||||||
|
|
||||||
|
### MONITOR_BAUDRATE
|
||||||
|
### It must be set to Serial baudrate value you are using.
|
||||||
|
MONITOR_BAUDRATE = 115200
|
||||||
|
|
||||||
|
### AVR_TOOLS_DIR
|
||||||
|
### Path to the AVR tools directory such as avr-gcc, avr-g++, etc.
|
||||||
|
AVR_TOOLS_DIR = /usr
|
||||||
|
|
||||||
|
### AVRDUDE
|
||||||
|
### Path to avrdude directory.
|
||||||
|
AVRDUDE = /usr/bin/avrdude
|
||||||
|
|
||||||
|
### CFLAGS_STD
|
||||||
|
CFLAGS_STD = -std=gnu11
|
||||||
|
|
||||||
|
### CXXFLAGS_STD
|
||||||
|
### You can choose wich ever you like
|
||||||
|
# CXXFLAGS_STD = -std=gnu++11
|
||||||
|
CXXFLAGS_STD = -std=gnu++17
|
||||||
|
|
||||||
|
|
||||||
|
### CPPFLAGS
|
||||||
|
### Flags you might want to set for debugging purpose. Comment to stop.
|
||||||
|
CXXFLAGS += -pedantic -Wall -Wextra
|
||||||
|
LDFLAGS += -fdiagnostics-color
|
||||||
|
|
||||||
|
### OBJDIR
|
||||||
|
### Don't touch this!
|
||||||
|
### This is were you put the binaries you just compile using 'make'
|
||||||
|
CURRENT_DIR = $(shell basename $(CURDIR))
|
||||||
|
OBJDIR = $(PROJECT_DIR)/build/$(CURRENT_DIR)/$(BOARD_TAG)
|
||||||
|
|
||||||
|
### path to Arduino.mk, inside the ARDMK_DIR, don't touch.
|
||||||
|
include $(ARDMK_DIR)/Arduino.mk
|
||||||
14
crawler_software/raspberry_pi/tests/otp/Pipfile
Normal file
14
crawler_software/raspberry_pi/tests/otp/Pipfile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
picamera = "*"
|
||||||
|
PySSTV = "*"
|
||||||
|
pyotp = "*"
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.9"
|
||||||
88
crawler_software/raspberry_pi/tests/otp/Pipfile.lock
generated
Normal file
88
crawler_software/raspberry_pi/tests/otp/Pipfile.lock
generated
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"_meta": {
|
||||||
|
"hash": {
|
||||||
|
"sha256": "bd19925493e125dc5aa15b339778c61c21e0f1a5574097d1721abf99245fa605"
|
||||||
|
},
|
||||||
|
"pipfile-spec": 6,
|
||||||
|
"requires": {
|
||||||
|
"python_version": "3.9"
|
||||||
|
},
|
||||||
|
"sources": [
|
||||||
|
{
|
||||||
|
"name": "pypi",
|
||||||
|
"url": "https://pypi.org/simple",
|
||||||
|
"verify_ssl": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"default": {
|
||||||
|
"picamera": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:890815aa01e4d855a6a95dd3ad0953b872a6b954982106407df0c5a31a163e50"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==1.13"
|
||||||
|
},
|
||||||
|
"pillow": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:0b2efa07f69dc395d95bb9ef3299f4ca29bcb2157dc615bae0b42c3c20668ffc",
|
||||||
|
"sha256:114f816e4f73f9ec06997b2fde81a92cbf0777c9e8f462005550eed6bae57e63",
|
||||||
|
"sha256:147bd9e71fb9dcf08357b4d530b5167941e222a6fd21f869c7911bac40b9994d",
|
||||||
|
"sha256:15a2808e269a1cf2131930183dcc0419bc77bb73eb54285dde2706ac9939fa8e",
|
||||||
|
"sha256:196560dba4da7a72c5e7085fccc5938ab4075fd37fe8b5468869724109812edd",
|
||||||
|
"sha256:1c03e24be975e2afe70dfc5da6f187eea0b49a68bb2b69db0f30a61b7031cee4",
|
||||||
|
"sha256:1fd5066cd343b5db88c048d971994e56b296868766e461b82fa4e22498f34d77",
|
||||||
|
"sha256:29c9569049d04aaacd690573a0398dbd8e0bf0255684fee512b413c2142ab723",
|
||||||
|
"sha256:2b6dfa068a8b6137da34a4936f5a816aba0ecc967af2feeb32c4393ddd671cba",
|
||||||
|
"sha256:2cac53839bfc5cece8fdbe7f084d5e3ee61e1303cccc86511d351adcb9e2c792",
|
||||||
|
"sha256:2ee77c14a0299d0541d26f3d8500bb57e081233e3fa915fa35abd02c51fa7fae",
|
||||||
|
"sha256:37730f6e68bdc6a3f02d2079c34c532330d206429f3cee651aab6b66839a9f0e",
|
||||||
|
"sha256:3f08bd8d785204149b5b33e3b5f0ebbfe2190ea58d1a051c578e29e39bfd2367",
|
||||||
|
"sha256:479ab11cbd69612acefa8286481f65c5dece2002ffaa4f9db62682379ca3bb77",
|
||||||
|
"sha256:4bc3c7ef940eeb200ca65bd83005eb3aae8083d47e8fcbf5f0943baa50726856",
|
||||||
|
"sha256:660a87085925c61a0dcc80efb967512ac34dbb256ff7dd2b9b4ee8dbdab58cf4",
|
||||||
|
"sha256:67b3666b544b953a2777cb3f5a922e991be73ab32635666ee72e05876b8a92de",
|
||||||
|
"sha256:70af7d222df0ff81a2da601fab42decb009dc721545ed78549cb96e3a1c5f0c8",
|
||||||
|
"sha256:75e09042a3b39e0ea61ce37e941221313d51a9c26b8e54e12b3ececccb71718a",
|
||||||
|
"sha256:8960a8a9f4598974e4c2aeb1bff9bdd5db03ee65fd1fce8adf3223721aa2a636",
|
||||||
|
"sha256:9364c81b252d8348e9cc0cb63e856b8f7c1b340caba6ee7a7a65c968312f7dab",
|
||||||
|
"sha256:969cc558cca859cadf24f890fc009e1bce7d7d0386ba7c0478641a60199adf79",
|
||||||
|
"sha256:9a211b663cf2314edbdb4cf897beeb5c9ee3810d1d53f0e423f06d6ebbf9cd5d",
|
||||||
|
"sha256:a17ca41f45cf78c2216ebfab03add7cc350c305c38ff34ef4eef66b7d76c5229",
|
||||||
|
"sha256:a2f381932dca2cf775811a008aa3027671ace723b7a38838045b1aee8669fdcf",
|
||||||
|
"sha256:a4eef1ff2d62676deabf076f963eda4da34b51bc0517c70239fafed1d5b51500",
|
||||||
|
"sha256:c088a000dfdd88c184cc7271bfac8c5b82d9efa8637cd2b68183771e3cf56f04",
|
||||||
|
"sha256:c0e0550a404c69aab1e04ae89cca3e2a042b56ab043f7f729d984bf73ed2a093",
|
||||||
|
"sha256:c11003197f908878164f0e6da15fce22373ac3fc320cda8c9d16e6bba105b844",
|
||||||
|
"sha256:c2a5ff58751670292b406b9f06e07ed1446a4b13ffced6b6cab75b857485cbc8",
|
||||||
|
"sha256:c35d09db702f4185ba22bb33ef1751ad49c266534339a5cebeb5159d364f6f82",
|
||||||
|
"sha256:c379425c2707078dfb6bfad2430728831d399dc95a7deeb92015eb4c92345eaf",
|
||||||
|
"sha256:cc866706d56bd3a7dbf8bac8660c6f6462f2f2b8a49add2ba617bc0c54473d83",
|
||||||
|
"sha256:d0da39795049a9afcaadec532e7b669b5ebbb2a9134576ebcc15dd5bdae33cc0",
|
||||||
|
"sha256:f156d6ecfc747ee111c167f8faf5f4953761b5e66e91a4e6767e548d0f80129c",
|
||||||
|
"sha256:f4ebde71785f8bceb39dcd1e7f06bcc5d5c3cf48b9f69ab52636309387b097c8",
|
||||||
|
"sha256:fc214a6b75d2e0ea7745488da7da3c381f41790812988c7a92345978414fad37",
|
||||||
|
"sha256:fd7eef578f5b2200d066db1b50c4aa66410786201669fb76d5238b007918fb24",
|
||||||
|
"sha256:ff04c373477723430dce2e9d024c708a047d44cf17166bf16e604b379bf0ca14"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.6'",
|
||||||
|
"version": "==8.3.1"
|
||||||
|
},
|
||||||
|
"pyotp": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:9d144de0f8a601d6869abe1409f4a3f75f097c37b50a36a3bf165810a6e23f28",
|
||||||
|
"sha256:d28ddfd40e0c1b6a6b9da961c7d47a10261fb58f378cb00f05ce88b26df9c432"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==2.6.0"
|
||||||
|
},
|
||||||
|
"pysstv": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:91f85096591606e774811de8940aef57f30e10cbf81387064f8a686cff0ac3fa"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==0.5.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"develop": {}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user