function obj = initialize(obj, pos, collisionGeometry, sensorModel, comRange, maxIter, initialStepSize, label, plotCommsGeometry)
    arguments (Input)
        obj (1, 1) {mustBeA(obj, "agent")};
        pos (1, 3) double;
        collisionGeometry (1, 1) {mustBeGeometry};
        sensorModel (1, 1) {mustBeSensor};
        comRange (1, 1) double;
        maxIter (1, 1) double;
        initialStepSize (1, 1) double = 0.2;
        label (1, 1) string = "";
        plotCommsGeometry (1, 1) logical = false;
    end
    arguments (Output)
        obj (1, 1) {mustBeA(obj, "agent")};
    end

    obj.pos = pos;
    obj.collisionGeometry = collisionGeometry;
    obj.sensorModel = sensorModel;
    obj.label = label;
    obj.plotCommsGeometry = plotCommsGeometry;
    obj.initialStepSize = initialStepSize;
    obj.stepDecayRate = obj.initialStepSize / maxIter;

    % Initialize performance vector
    if coder.target('MATLAB')
        obj.performance = [0, NaN(1, maxIter), 0];
    end

    % Add spherical geometry based on com range
    obj.commsGeometry = obj.commsGeometry.initialize(obj.pos, comRange, REGION_TYPE.COMMS, sprintf("%s Comms Geometry", obj.label));

    % Initialize FOV cone
    obj.fovGeometry = cone;
    obj.fovGeometry = obj.fovGeometry.initialize([obj.pos(1:3)], tand(obj.sensorModel.alphaTilt) * obj.pos(3), obj.pos(3), REGION_TYPE.FOV, sprintf("%s FOV", obj.label));
end