{"record":{"id":"d43ef641f8c31334","repo":"Unity-Technologies/ml-agents","slug":"sensor-sensor-getname-have-an-invalid-rank-ra","errorCode":null,"errorMessage":"Sensor {sensor.GetName()} have an invalid rank {rank}","messagePattern":"Sensor (.+?) have an invalid rank (.+?)","errorType":"exception","errorClass":"UnityAgentsException","httpStatus":null,"severity":"error","filePath":"com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs","lineNumber":133,"sourceCode":"                            }\n                            obsGen = vecObsGen;\n                            obsGenName = TensorNames.VectorObservationPlaceholder;\n                            break;\n                        case 2:\n                            // If the tensor is of rank 2, we use the index of the sensor\n                            // to create the name\n                            obsGen = new ObservationGenerator();\n                            obsGenName = TensorNames.GetObservationName(sensorIndex);\n                            break;\n                        case 3:\n                            // If the tensor is of rank 3, we use the \"visual observation\n                            // index\", which only counts the rank 3 sensors\n                            obsGen = new ObservationGenerator();\n                            obsGenName = TensorNames.GetVisualObservationName(visIndex);\n                            visIndex++;\n                            break;\n                        default:\n                            throw new UnityAgentsException(\n                                $\"Sensor {sensor.GetName()} have an invalid rank {rank}\");\n                    }\n                    obsGen.AddSensorIndex(sensorIndex);\n                    m_Dict[obsGenName] = obsGen;\n                }\n            }\n\n            if (m_ApiVersion == (int)SentisModelParamLoader.ModelApiVersion.MLAgents2_0)\n            {\n                for (var sensorIndex = 0; sensorIndex < sensors.Count; sensorIndex++)\n                {\n                    var obsGen = new ObservationGenerator();\n                    var obsGenName = TensorNames.GetObservationName(sensorIndex);\n                    obsGen.AddSensorIndex(sensorIndex);\n                    m_Dict[obsGenName] = obsGen;\n                }\n            }\n        }","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/Unity-Technologies/ml-agents/blob/3ecb446f75d1e7400eb404c562dc005d3164cffc/com.unity.ml-agents/Runtime/Inference/TensorGenerator.cs#L115-L151","documentation":"TensorGenerator.InitializeObservations maps each sensor to an observation generator based on the sensor's observation rank. Only ranks 1 (vector), 2, and 3 are supported; any other rank hits the default case and throws. The message names the offending sensor and its rank.","triggerScenarios":"A sensor's GetObservationSpec() returns a shape with rank 0 or rank >= 4; reached when a ModelRunner initializes its observation generators.","commonSituations":"Custom sensors returning multi-dimensional (4+) observation specs that the inference path doesn't support; buggy observation spec construction (empty dimensions); using heuristics-only specs that don't fit inference expectations.","solutions":["Reshape the sensor's observation to rank 3 or less (e.g. flatten extra dimensions into the channel or height/width axes)","Ensure ObservationSpec dimensions are non-empty and the spec matches what the model was trained with","Split the observation into multiple sensors if the data is genuinely 4D"],"exampleFix":"// before\nvar spec = ObservationSpec.Visual(4, 8, 8, 3); // rank 4\n// after\nvar spec = ObservationSpec.Visual(8, 8, 12); // merge 4 frames into channels, rank 3","handlingStrategy":"validation","validationCode":"foreach (var sensor in sensors)\n{\n    int rank = sensor.GetObservationSpec().Rank();\n    if (rank < 1 || rank > 3) throw new InvalidOperationException($\"Sensor {sensor.GetName()} rank {rank} unsupported for inference\");\n}","typeGuard":"bool IsInferenceCompatibleRank(ISensor s) { var r = s.GetObservationSpec().Rank(); return r >= 1 && r <= 3; }","tryCatchPattern":"try { modelRunner.InitializeObservations(infos, ...); }\ncatch (UnityAgentsException e) when (e.Message.Contains(\"invalid rank\"))\n{ Debug.LogError($\"Reshape sensor observation to rank <= 3: {e.Message}\"); }","preventionTips":["Keep sensor ObservationSpec rank at 1-3 (vector, 2D, or 3D image)","Flatten or merge higher-dimensional data into channels before exposing it as an observation","Test custom sensors through a ModelRunner early in development"],"tags":["unity","ml-agents","inference","sensor","rank","observation-shape"],"backgroundTag":"invalid-observation-rank","analyzedSha":"3ecb446f75d1e7400eb404c562dc005d3164cffc","analyzedAt":"2026-09-02T16:33:12.832Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T21:17:11.164Z"}