2021-10-10 19:03:57 +00:00
package main
import (
2021-12-02 08:16:50 +00:00
"context"
2021-10-10 19:03:57 +00:00
"flag"
"github.com/cyrilix/robocar-base/cli"
2021-12-02 08:16:50 +00:00
"github.com/cyrilix/robocar-steering-tflite-edgetpu/pkg/metrics"
2021-10-10 19:03:57 +00:00
"github.com/cyrilix/robocar-steering-tflite-edgetpu/pkg/steering"
"go.uber.org/zap"
"log"
"os"
)
const (
DefaultClientId = "robocar-steering-tflite-edgetpu"
)
func main ( ) {
var mqttBroker , username , password , clientId string
var cameraTopic , steeringTopic string
var modelPath string
var edgeVerbosity int
2021-11-25 16:12:16 +00:00
var imgWidth , imgHeight , horizon int
2021-10-12 15:34:47 +00:00
var debug bool
2021-10-10 19:03:57 +00:00
mqttQos := cli . InitIntFlag ( "MQTT_QOS" , 0 )
_ , mqttRetain := os . LookupEnv ( "MQTT_RETAIN" )
cli . InitMqttFlags ( DefaultClientId , & mqttBroker , & username , & password , & clientId , & mqttQos , & mqttRetain )
flag . StringVar ( & modelPath , "model" , "" , "path to model file" )
flag . StringVar ( & steeringTopic , "mqtt-topic-road" , os . Getenv ( "MQTT_TOPIC_STEERING" ) , "Mqtt topic to publish road detection result, use MQTT_TOPIC_STEERING if args not set" )
flag . StringVar ( & cameraTopic , "mqtt-topic-camera" , os . Getenv ( "MQTT_TOPIC_CAMERA" ) , "Mqtt topic that contains camera frame values, use MQTT_TOPIC_CAMERA if args not set" )
flag . IntVar ( & edgeVerbosity , "edge-verbosity" , 0 , "Edge TPU Verbosity" )
2021-11-25 16:12:16 +00:00
flag . IntVar ( & imgWidth , "img-width" , 0 , "image width expected by model (mandatory)" )
flag . IntVar ( & imgHeight , "img-height" , 0 , "image height expected by model (mandatory)" )
flag . IntVar ( & horizon , "horizon" , 0 , "upper zone to crop from image. Models expect size 'imgHeight - horizon'" )
2021-10-12 15:34:47 +00:00
flag . BoolVar ( & debug , "debug" , false , "Display debug logs" )
2021-10-10 19:03:57 +00:00
flag . Parse ( )
if len ( os . Args ) <= 1 {
flag . PrintDefaults ( )
os . Exit ( 1 )
}
2021-10-12 15:34:47 +00:00
config := zap . NewDevelopmentConfig ( )
if debug {
config . Level = zap . NewAtomicLevelAt ( zap . DebugLevel )
} else {
config . Level = zap . NewAtomicLevelAt ( zap . InfoLevel )
}
lgr , err := config . Build ( )
if err != nil {
log . Fatalf ( "unable to init logger: %v" , err )
}
defer func ( ) {
if err := lgr . Sync ( ) ; err != nil {
log . Printf ( "unable to Sync logger: %v\n" , err )
}
} ( )
zap . ReplaceGlobals ( lgr )
2021-12-02 08:16:50 +00:00
cleanup := metrics . Init ( context . Background ( ) )
defer cleanup ( )
2021-10-10 19:03:57 +00:00
if modelPath == "" {
zap . L ( ) . Error ( "model path is mandatory" )
flag . PrintDefaults ( )
os . Exit ( 1 )
}
2021-11-25 16:12:16 +00:00
if imgWidth <= 0 || imgHeight <= 0 {
zap . L ( ) . Error ( "img-width and img-height are mandatory" )
flag . PrintDefaults ( )
os . Exit ( 1 )
}
2021-10-10 19:03:57 +00:00
client , err := cli . Connect ( mqttBroker , username , password , clientId )
if err != nil {
zap . L ( ) . Fatal ( "unable to connect to mqtt bus" , zap . Error ( err ) )
}
defer client . Disconnect ( 50 )
2021-11-25 16:12:16 +00:00
p := steering . NewPart ( client , modelPath , steeringTopic , cameraTopic , edgeVerbosity , imgWidth , imgHeight , horizon )
2021-10-10 19:03:57 +00:00
defer p . Stop ( )
cli . HandleExit ( p )
err = p . Start ( )
if err != nil {
zap . L ( ) . Fatal ( "unable to start service" , zap . Error ( err ) )
}
}