diff --git a/localization/pose_initializer/README.md b/localization/pose_initializer/README.md
index 961f3a8e3293c..3063e13c10226 100644
--- a/localization/pose_initializer/README.md
+++ b/localization/pose_initializer/README.md
@@ -22,6 +22,8 @@ This node depends on the map height fitter library.
 | `gnss_enabled`        | bool | If true, use the GNSS pose when no pose is specified.                                    |
 | `gnss_pose_timeout`   | bool | The duration that the GNSS pose is valid.                                                |
 
+{{ json_to_markdown("localization/pose_initializer/schema/pose_initializer.schema.json") }}
+
 ### Services
 
 | Name                       | Type                                                | Description           |
diff --git a/localization/pose_initializer/config/pose_initializer.param.yaml b/localization/pose_initializer/config/pose_initializer.param.yaml
index a05cc7c35cb1a..88acbfb52611d 100644
--- a/localization/pose_initializer/config/pose_initializer.param.yaml
+++ b/localization/pose_initializer/config/pose_initializer.param.yaml
@@ -2,6 +2,11 @@
   ros__parameters:
     gnss_pose_timeout: 3.0 # [sec]
     stop_check_duration: 3.0 # [sec]
+    ekf_enabled: $(var ekf_enabled)
+    gnss_enabled: $(var gnss_enabled)
+    yabloc_enabled: $(var yabloc_enabled)
+    ndt_enabled: $(var ndt_enabled)
+    stop_check_enabled: $(var stop_check_enabled)
 
     # from gnss
     gnss_particle_covariance:
diff --git a/localization/pose_initializer/launch/pose_initializer.launch.xml b/localization/pose_initializer/launch/pose_initializer.launch.xml
index 43e8d48c4fda0..a0fdde13c65c5 100644
--- a/localization/pose_initializer/launch/pose_initializer.launch.xml
+++ b/localization/pose_initializer/launch/pose_initializer.launch.xml
@@ -9,13 +9,7 @@
   <arg name="sub_gnss_pose_cov" default="sub_gnss_pose_cov"/>
 
   <node pkg="pose_initializer" exec="pose_initializer_node" name="pose_initializer_node">
-    <param from="$(var config_file)"/>
-    <param name="ndt_enabled" value="$(var ndt_enabled)"/>
-    <param name="gnss_enabled" value="$(var gnss_enabled)"/>
-    <param name="ekf_enabled" value="$(var ekf_enabled)"/>
-    <param name="yabloc_enabled" value="$(var yabloc_enabled)"/>
-    <param name="stop_check_enabled" value="$(var stop_check_enabled)"/>
-
+    <param from="$(var config_file)" allow_substs="true"/>
     <remap from="yabloc_align" to="/localization/pose_estimator/yabloc/initializer/yabloc_align_srv"/>
     <remap from="ndt_align" to="/localization/pose_estimator/ndt_align_srv"/>
     <remap from="stop_check_twist" to="/sensing/vehicle_velocity_converter/twist_with_covariance"/>
diff --git a/localization/pose_initializer/schema/pose_initializer.schema.json b/localization/pose_initializer/schema/pose_initializer.schema.json
new file mode 100644
index 0000000000000..14a286f059030
--- /dev/null
+++ b/localization/pose_initializer/schema/pose_initializer.schema.json
@@ -0,0 +1,85 @@
+{
+  "$schema": "http://json-schema.org/draft-07/schema#",
+  "title": "Parameters for Pose Initializer Node",
+  "type": "object",
+  "definitions": {
+    "pose_initializer": {
+      "type": "object",
+      "properties": {
+        "gnss_pose_timeout": {
+          "type": "number",
+          "description": "The duration that the GNSS pose is valid. [sec]",
+          "default": "3.0",
+          "minimum": 0.0
+        },
+        "stop_check_enabled": {
+          "type": "string",
+          "description": "If true, initialization is accepted only when the vehicle is stopped.",
+          "default": "true"
+        },
+        "stop_check_duration": {
+          "type": "number",
+          "description": "The duration used for the stop check above. [sec]",
+          "default": "3.0",
+          "minimum": 0.0
+        },
+        "ekf_enabled": {
+          "type": "string",
+          "description": "If true, EKF localizer is activated.",
+          "default": "true"
+        },
+        "gnss_enabled": {
+          "type": "string",
+          "description": "If true, use the GNSS pose when no pose is specified.",
+          "default": "true"
+        },
+        "yabloc_enabled": {
+          "type": "string",
+          "description": "If true, YabLocModule is used.",
+          "default": "true"
+        },
+        "ndt_enabled": {
+          "type": "string",
+          "description": "If true, the pose will be estimated by NDT scan matcher, otherwise it is passed through.",
+          "default": "true"
+        },
+        "gnss_particle_covariance": {
+          "type": "array",
+          "description": "gnss particle covariance",
+          "default": "[1.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n  0.0, 1.0, 0.0, 0.0, 0.0, 0.0,\n 0.0, 0.0, 0.01, 0.0, 0.0, 0.0,\n 0.0, 0.0, 0.0, 0.01, 0.0, 0.0,\n 0.0, 0.0, 0.0, 0.0, 0.01, 0.0,\n 0.0, 0.0, 0.0, 0.0, 0.0, 10.0]"
+        },
+        "output_pose_covariance": {
+          "type": "array",
+          "description": "output pose covariance",
+          "default": "[1.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0,  0.0,  0.0,  0.0,\n 0.0, 0.0, 0.01, 0.0, 0.0, 0.0,\n 0.0, 0.0, 0.0, 0.01, 0.0, 0.0,\n 0.0, 0.0, 0.0, 0.0, 0.01, 0.0,\n 0.0, 0.0, 0.0, 0.0, 0.0, 0.2]"
+        }
+      },
+      "required": [
+        "gnss_pose_timeout",
+        "stop_check_duration",
+        "ekf_enabled",
+        "gnss_enabled",
+        "yabloc_enabled",
+        "ndt_enabled",
+        "stop_check_enabled",
+        "gnss_particle_covariance",
+        "output_pose_covariance"
+      ],
+      "additionalProperties": false
+    }
+  },
+  "properties": {
+    "/**": {
+      "type": "object",
+      "properties": {
+        "ros__parameters": {
+          "$ref": "#/definitions/pose_initializer"
+        }
+      },
+      "required": ["ros__parameters"],
+      "additionalProperties": false
+    }
+  },
+  "required": ["/**"],
+  "additionalProperties": false
+}