prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Create a way to add your own arm model[FEATURE]
  ## User Story
  
  <!-- A clear and concise description of what the problem is. 
  I want to add my own arm configuration to the list of pre-trained models.
  
  ## Potential Solutions
  
  <!-- A clear and concise description of what you want to happen. -->
  If there was a comment next to each line of one of the arrays containing the pre-trained model saying what exactly each value was supposed to represent, that would help.
  <!-- A clear and concise description of any alternative solutions or features you've considered. -->
  I tried looking at the spec sheets of the arms and matching up values but I couldn't figure much out. 
  
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `pybotics/predefined_models.py`
  Content:
  ```
  1 """Predefined robot models."""
  2 import numpy as np  # type: ignore
  3 
  4 
  5 def kuka_lbr_iiwa_7() -> np.ndarray:  # pragma: no cover
  6     """Get KUKA LBR iiwa 7 MDH model."""
  7     return np.array(
  8         [
  9             [0, 0, 0, 340],
  10             [-np.pi / 2, 0, 0, 0],
  11             [np.pi / 2, 0, 0, 400],
  12             [np.pi / 2, 0, 0, 0],
  13             [-np.pi / 2, 0, 0, 400],
  14             [-np.pi / 2, 0, 0, 0],
  15             [np.pi / 2, 0, 0, 126],
  16         ]
  17     )
  18 
  19 
  20 def mecademic_meca500() -> np.ndarray:  # pragma: no cover
  21     """Get Meca500 MDH model."""
  22     return np.array(
  23         [
  24             [0, 0, 0, 135],
  25             [-np.pi / 2, 0, -np.pi / 2, 0],
  26             [0, 135, 0, 0],
  27             [-np.pi / 2, 38, 0, 120],
  28             [np.pi / 2, 0, 0, 0],
  29             [-np.pi / 2, 0, np.pi, 72],
  30         ]
  31     )
  32 
  33 
  34 def puma560() -> np.ndarray:  # pragma: no cover
  35     """Get PUMA560 MDH model."""
  36     return np.array(
  37         [
  38             [0, 0, 0, 0],
  39             [-np.pi / 2, 0, 0, 0],
  40             [0, 612.7, 0, 0],
  41             [0, 571.6, 0, 163.9],
  42             [-np.pi / 2, 0, 0, 115.7],
  43             [np.pi / 2, 0, np.pi, 92.2],
  44         ]
  45     )
  46 
  47 
  48 def ur10() -> np.ndarray:  # pragma: no cover
  49     """Get UR10 MDH model."""
  50     return np.array(
  51         [
  52             [0, 0, 0, 118],
  53             [np.pi / 2, 0, np.pi, 0],
  54             [0, 612.7, 0, 0],
  55             [0, 571.6, 0, 163.9],
  56             [-np.pi / 2, 0, 0, 115.7],
  57             [np.pi / 2, 0, np.pi, 92.2],
  58         ]
  59     )
  60 
  61 
  62 def abb_irb120() -> np.ndarray:  # pragma: no cover
  63     """Get ABB irb120 MDH model."""
  64     return np.array(
  65         [
  66             [0, 0, 0, 290],
  67             [-np.pi / 2, 0, -np.pi / 2, 0],
  68             [0, 270, 0, 0],
  69             [-np.pi / 2, 70, 0, 302],
  70             [np.pi / 2, 0, 0, 0],
  71             [-np.pi / 2, 0, np.pi, 72],
  72         ]
  73     )
  74
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/pybotics/predefined_models.py b/pybotics/predefined_models.py
  --- a/pybotics/predefined_models.py
  +++ b/pybotics/predefined_models.py
  @@ -1,4 +1,8 @@
  -"""Predefined robot models."""
  +"""Predefined robot models.
  +
  +These models correspond to the Modified Denavit–Hartenberg parameters:
  +https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters
  +"""
   import numpy as np  # type: ignore
  
verification_info: {"golden_diff": "diff --git a/pybotics/predefined_models.py b/pybotics/predefined_models.py\n--- a/pybotics/predefined_models.py\n+++ b/pybotics/predefined_models.py\n@@ -1,4 +1,8 @@\n-\"\"\"Predefined robot models.\"\"\"\n+\"\"\"Predefined robot models.\n+\n+These models correspond to the Modified Denavit\u2013Hartenberg parameters:\n+https://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters\n+\"\"\"\n import numpy as np  # type: ignore\n", "issue": "Create a way to add your own arm model[FEATURE]\n## User Story\r\n\r\n<!-- A clear and concise description of what the problem is. \r\nI want to add my own arm configuration to the list of pre-trained models.\r\n\r\n## Potential Solutions\r\n\r\n<!-- A clear and concise description of what you want to happen. -->\r\nIf there was a comment next to each line of one of the arrays containing the pre-trained model saying what exactly each value was supposed to represent, that would help.\r\n<!-- A clear and concise description of any alternative solutions or features you've considered. -->\r\nI tried looking at the spec sheets of the arms and matching up values but I couldn't figure much out. \r\n\r\n\n", "before_files": [{"content": "\"\"\"Predefined robot models.\"\"\"\nimport numpy as np  # type: ignore\n\n\ndef kuka_lbr_iiwa_7() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get KUKA LBR iiwa 7 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 340],\n            [-np.pi / 2, 0, 0, 0],\n            [np.pi / 2, 0, 0, 400],\n            [np.pi / 2, 0, 0, 0],\n            [-np.pi / 2, 0, 0, 400],\n            [-np.pi / 2, 0, 0, 0],\n            [np.pi / 2, 0, 0, 126],\n        ]\n    )\n\n\ndef mecademic_meca500() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get Meca500 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 135],\n            [-np.pi / 2, 0, -np.pi / 2, 0],\n            [0, 135, 0, 0],\n            [-np.pi / 2, 38, 0, 120],\n            [np.pi / 2, 0, 0, 0],\n            [-np.pi / 2, 0, np.pi, 72],\n        ]\n    )\n\n\ndef puma560() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get PUMA560 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 0],\n            [-np.pi / 2, 0, 0, 0],\n            [0, 612.7, 0, 0],\n            [0, 571.6, 0, 163.9],\n            [-np.pi / 2, 0, 0, 115.7],\n            [np.pi / 2, 0, np.pi, 92.2],\n        ]\n    )\n\n\ndef ur10() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get UR10 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 118],\n            [np.pi / 2, 0, np.pi, 0],\n            [0, 612.7, 0, 0],\n            [0, 571.6, 0, 163.9],\n            [-np.pi / 2, 0, 0, 115.7],\n            [np.pi / 2, 0, np.pi, 92.2],\n        ]\n    )\n\n\ndef abb_irb120() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get ABB irb120 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 290],\n            [-np.pi / 2, 0, -np.pi / 2, 0],\n            [0, 270, 0, 0],\n            [-np.pi / 2, 70, 0, 302],\n            [np.pi / 2, 0, 0, 0],\n            [-np.pi / 2, 0, np.pi, 72],\n        ]\n    )\n", "path": "pybotics/predefined_models.py"}], "after_files": [{"content": "\"\"\"Predefined robot models.\n\nThese models correspond to the Modified Denavit\u2013Hartenberg parameters:\nhttps://en.wikipedia.org/wiki/Denavit%E2%80%93Hartenberg_parameters\n\"\"\"\nimport numpy as np  # type: ignore\n\n\ndef kuka_lbr_iiwa_7() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get KUKA LBR iiwa 7 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 340],\n            [-np.pi / 2, 0, 0, 0],\n            [np.pi / 2, 0, 0, 400],\n            [np.pi / 2, 0, 0, 0],\n            [-np.pi / 2, 0, 0, 400],\n            [-np.pi / 2, 0, 0, 0],\n            [np.pi / 2, 0, 0, 126],\n        ]\n    )\n\n\ndef mecademic_meca500() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get Meca500 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 135],\n            [-np.pi / 2, 0, -np.pi / 2, 0],\n            [0, 135, 0, 0],\n            [-np.pi / 2, 38, 0, 120],\n            [np.pi / 2, 0, 0, 0],\n            [-np.pi / 2, 0, np.pi, 72],\n        ]\n    )\n\n\ndef puma560() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get PUMA560 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 0],\n            [-np.pi / 2, 0, 0, 0],\n            [0, 612.7, 0, 0],\n            [0, 571.6, 0, 163.9],\n            [-np.pi / 2, 0, 0, 115.7],\n            [np.pi / 2, 0, np.pi, 92.2],\n        ]\n    )\n\n\ndef ur10() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get UR10 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 118],\n            [np.pi / 2, 0, np.pi, 0],\n            [0, 612.7, 0, 0],\n            [0, 571.6, 0, 163.9],\n            [-np.pi / 2, 0, 0, 115.7],\n            [np.pi / 2, 0, np.pi, 92.2],\n        ]\n    )\n\n\ndef abb_irb120() -> np.ndarray:  # pragma: no cover\n    \"\"\"Get ABB irb120 MDH model.\"\"\"\n    return np.array(\n        [\n            [0, 0, 0, 290],\n            [-np.pi / 2, 0, -np.pi / 2, 0],\n            [0, 270, 0, 0],\n            [-np.pi / 2, 70, 0, 302],\n            [np.pi / 2, 0, 0, 0],\n            [-np.pi / 2, 0, np.pi, 72],\n        ]\n    )\n", "path": "pybotics/predefined_models.py"}]}