<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Takashi Mori</title>
    <description>The latest articles on DEV Community by Takashi Mori (@kanetugu2020).</description>
    <link>https://dev.to/kanetugu2020</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4043601%2F07b62422-8289-408a-8aeb-69f179ac4afd.png</url>
      <title>DEV Community: Takashi Mori</title>
      <link>https://dev.to/kanetugu2020</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kanetugu2020"/>
    <language>en</language>
    <item>
      <title>I Asked an AI Agent to Build Robot Simulators — Here's What Happened</title>
      <dc:creator>Takashi Mori</dc:creator>
      <pubDate>Thu, 23 Jul 2026 10:32:48 +0000</pubDate>
      <link>https://dev.to/kanetugu2020/i-asked-an-ai-agent-to-build-robot-simulators-heres-what-happened-2kn</link>
      <guid>https://dev.to/kanetugu2020/i-asked-an-ai-agent-to-build-robot-simulators-heres-what-happened-2kn</guid>
      <description>&lt;p&gt;AI is making simulator development much easier.&lt;/p&gt;

&lt;p&gt;Today, we can ask AI to work with high-fidelity physics simulators such as MuJoCo, or use tool integrations to help build simulation environments that previously required a fair amount of specialized knowledge.&lt;/p&gt;

&lt;p&gt;But when you actually try to build a simulator for your own project, the requirements quickly become more specific:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I want to use an existing ROS URDF."&lt;/p&gt;

&lt;p&gt;"I want to reuse ROS 2 message definitions."&lt;/p&gt;

&lt;p&gt;"I want to visualize it in a web browser."&lt;/p&gt;

&lt;p&gt;"And I want it to run on my Mac."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each requirement by itself is not particularly difficult.&lt;/p&gt;

&lt;p&gt;The hard part is &lt;strong&gt;combining all of them into the simulation environment you actually want&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I tried an experiment:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can an AI coding agent build working robot simulators from high-level requirements by combining existing open-source components?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this experiment, I used &lt;a href="https://hakoniwa-lab.net/hakoniwa/" rel="noopener noreferrer"&gt;Hakoniwa&lt;/a&gt; together with an AI coding agent (Codex).&lt;/p&gt;

&lt;p&gt;Here is the latest demo:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/H40vTOm5PQo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Interestingly, this article itself follows the same approach: the AI coding agent that worked on the simulations helped draft the article, and I edited and refined it as a human. Later in the article, I also asked the AI to reflect on what made this development process work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;I tried the same AI-driven development approach with three very different robots:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AgileX Tracer&lt;/strong&gt; — converted a model derived from its ROS URDF for MuJoCo and controlled it using a PDU based on ROS 2 &lt;code&gt;Twist&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FR5 robot arm&lt;/strong&gt; — turned the arm into a Hakoniwa asset and controlled it using a PDU based on &lt;code&gt;JointTrajectory&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unitree Go1&lt;/strong&gt; — used the MuJoCo Menagerie model as a Hakoniwa asset and executed open-loop motion for its 12 joints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also used the existing Hakoniwa Drone with a Three.js web viewer.&lt;/p&gt;

&lt;p&gt;Before going into the experiment, let me briefly explain what Hakoniwa is.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hakoniwa?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hakoniwa-lab.net/hakoniwa/" rel="noopener noreferrer"&gt;Hakoniwa&lt;/a&gt; is an open-source platform for composing robot simulators, control applications, visualization tools, and other software components into a simulation environment.&lt;/p&gt;

&lt;p&gt;For example, you can combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a physics simulator such as MuJoCo&lt;/li&gt;
&lt;li&gt;ROS / ROS 2 applications&lt;/li&gt;
&lt;li&gt;visualization applications running in a web browser&lt;/li&gt;
&lt;li&gt;custom control programs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hakoniwa treats these as independent components called &lt;strong&gt;assets&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of implementing everything inside one monolithic simulator, the basic idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Combine the components you need to build the simulation environment you want.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The components exchange data using structures called &lt;strong&gt;PDUs (Protocol Data Units)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This separation turned out to be particularly useful when working with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development environment
&lt;/h2&gt;

&lt;p&gt;I built these simulations on the Mac I normally use for development.&lt;/p&gt;

&lt;p&gt;The main environment was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS&lt;/li&gt;
&lt;li&gt;MuJoCo&lt;/li&gt;
&lt;li&gt;Hakoniwa&lt;/li&gt;
&lt;li&gt;Codex as the AI coding agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I did not use a dedicated simulation workstation or a special GPU environment.&lt;/p&gt;

&lt;p&gt;Also, I wasn't simply asking AI to operate an already completed simulator.&lt;/p&gt;

&lt;p&gt;The goal was more ambitious:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Start from a requirement, investigate the necessary software and robot models, design the architecture, implement it, and get the resulting simulation actually running.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To help the AI understand the Hakoniwa ecosystem, I used a repository called &lt;a href="https://github.com/hakoniwalab/hakoniwa-business-pack" rel="noopener noreferrer"&gt;Hakoniwa Business Pack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It contains catalogs, recipes, runtime knowledge, and other information intended to help both humans and AI agents understand how Hakoniwa components can be combined.&lt;/p&gt;

&lt;h2&gt;
  
  
  First experiment: AgileX Tracer
&lt;/h2&gt;

&lt;p&gt;The first robot I tried was the &lt;a href="https://github.com/agilexrobotics/tracer_ros" rel="noopener noreferrer"&gt;AgileX Tracer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A ROS repository for Tracer is publicly available and includes a URDF model.&lt;/p&gt;

&lt;p&gt;My requirements were simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reuse the existing ROS URDF&lt;/li&gt;
&lt;li&gt;use MuJoCo instead of Gazebo&lt;/li&gt;
&lt;li&gt;run it on macOS&lt;/li&gt;
&lt;li&gt;use a control interface based on the common ROS 2 &lt;code&gt;Twist&lt;/code&gt; message&lt;/li&gt;
&lt;li&gt;avoid making the asset unnecessarily specific to Tracer&lt;/li&gt;
&lt;li&gt;first make it work in MuJoCo, then turn it into a Hakoniwa asset, then control it from Python&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I want to take this existing ROS robot model, run it in MuJoCo on my Mac, and control it using a Twist-like velocity command."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I gave those requirements to the AI.&lt;/p&gt;

&lt;p&gt;I did &lt;strong&gt;not&lt;/strong&gt; tell it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Edit this file, create this C++ class, and call this API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, I first asked it to understand the Hakoniwa Business Pack.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Understand hakoniwa-business-pack.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI read its README, catalog, recipes, and documentation to understand the available components, runtime conventions, and existing examples.&lt;/p&gt;

&lt;p&gt;Then I asked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Using the AgileX Tracer URDF,
create a recipe for building a Hakoniwa simulation environment.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The architecture that emerged looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AgileX Tracer URDF / robot model
        ↓
hakoniwa-mbody-registry
        ↓
MuJoCo-compatible model
        ↓
hakoniwa-mujoco-robots
        ↓
Hakoniwa asset
        ↑
Twist-derived PDU
        ↑
Python sender
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important point is that the Python program does not directly manipulate MuJoCo.&lt;/p&gt;

&lt;p&gt;MuJoCo runs as a Hakoniwa asset.&lt;/p&gt;

&lt;p&gt;The controller sends commands through a PDU based on ROS 2's &lt;code&gt;geometry_msgs/msg/Twist&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allows us to reuse concepts and data definitions from ROS while composing the simulation itself using MuJoCo and Hakoniwa.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the AI actually did
&lt;/h2&gt;

&lt;p&gt;Based on the requirements and existing Hakoniwa knowledge, the AI worked through tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inspecting the existing Tracer URDF and converted models&lt;/li&gt;
&lt;li&gt;checking the minimum world required to load the model in MuJoCo&lt;/li&gt;
&lt;li&gt;adding actuators for the left and right wheels&lt;/li&gt;
&lt;li&gt;preparing a PDU corresponding to &lt;code&gt;geometry_msgs/Twist&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;implementing a Hakoniwa asset that converts Twist commands into wheel velocities&lt;/li&gt;
&lt;li&gt;implementing a Python sender for &lt;code&gt;linear.x&lt;/code&gt; and &lt;code&gt;angular.z&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;documenting the execution procedure&lt;/li&gt;
&lt;li&gt;updating the recipe with what had actually been validated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, the resulting command interface could be used like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3.12 examples/actuators/agilex_tracer/send_rover_twist.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--linear-x&lt;/span&gt; 0.2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration-sec&lt;/span&gt; 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The execution sequence also matters in Hakoniwa.&lt;/p&gt;

&lt;p&gt;First, start the MuJoCo asset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./src/cmake-build/examples/actuators/agilex_tracer/rover-twist-hakoniwa-asset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The asset registers itself and waits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hako_asset_register :RoverTwistAsset
asset(RoverTwistAsset) is registered.
WAIT START
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start the Python sender:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3.12 examples/actuators/agilex_tracer/send_rover_twist.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--linear-x&lt;/span&gt; 0.2 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration-sec&lt;/span&gt; 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also waits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rover Twist sender is registered.
WAIT START
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the assets are ready, start the simulation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/local/hakoniwa/bin/hako-cmd start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Python sender then publishes the Twist PDU, and the Tracer moves forward in MuJoCo.&lt;/p&gt;

&lt;p&gt;The asset logs showed the command and the changing base position:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rover Twist Hakoniwa asset started.
time=0.502 base=(0.017, 0.000, 0.142) cmd=(0.200, 0.000)
time=1.002 base=(0.055, 0.000, 0.142) cmd=(0.200, 0.000)
time=2.002 base=(0.167, 0.000, 0.142) cmd=(0.200, 0.000)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the complete path was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ROS URDF
  → MuJoCo model
  → Hakoniwa asset
  → Twist PDU
  → Python sender
  → movement in the MuJoCo viewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And all of this ran on my Mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failures were useful too
&lt;/h2&gt;

&lt;p&gt;The AI did not get everything right on the first try.&lt;/p&gt;

&lt;p&gt;For example, after converting the robot model, a large wheel-like primitive appeared near the center of the robot and affected its posture.&lt;/p&gt;

&lt;p&gt;This led to a useful lesson: when primitives or collision geometry are added during URDF/MJCF conversion, they can affect both visualization and contact behavior.&lt;/p&gt;

&lt;p&gt;Instead of treating this as a one-off fix, we fed the knowledge back into the Hakoniwa Business Pack.&lt;/p&gt;

&lt;p&gt;This became an important pattern during the experiment:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The development loop&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The AI reads existing knowledge.&lt;/li&gt;
&lt;li&gt;The AI builds and runs something.&lt;/li&gt;
&lt;li&gt;A failure or missing assumption appears.&lt;/li&gt;
&lt;li&gt;Human and AI investigate it together.&lt;/li&gt;
&lt;li&gt;The result is turned into reusable knowledge.&lt;/li&gt;
&lt;li&gt;The next AI session starts from a better baseline.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;That feedback loop became at least as interesting to me as the simulator itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trying the same approach with a robot arm
&lt;/h2&gt;

&lt;p&gt;Next, I wanted to see whether the same pattern would work for a completely different type of robot.&lt;/p&gt;

&lt;p&gt;I tried the &lt;strong&gt;FR5 robot arm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of velocity commands such as Twist, an arm needs coordinated joint motion.&lt;/p&gt;

&lt;p&gt;So we used a PDU based on ROS's &lt;code&gt;trajectory_msgs/JointTrajectory&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Again, I gave the AI requirements at the architectural level:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I want to run the FR5 arm as a Hakoniwa asset.
I want the interface to be based on JointTrajectory.
Let's begin by replaying a predefined trajectory.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting structure was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FR5 URDF / MuJoCo model
        ↓
Hakoniwa arm asset
        ↑
JointTrajectory-derived PDU
        ↑
Python trajectory sender
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the demo, the Python sender transmitted a nine-point joint trajectory.&lt;/p&gt;

&lt;p&gt;The asset reported:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accepted JointTrajectory: joints=6 points=9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the arm replayed the trajectory in the MuJoCo viewer before returning to its home pose.&lt;/p&gt;

&lt;p&gt;The robot was completely different from Tracer, but the Hakoniwa runtime pattern remained largely the same:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;register asset → wait for start → exchange PDUs → run simulation&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Then a quadruped: Unitree Go1
&lt;/h2&gt;

&lt;p&gt;The third experiment was the &lt;strong&gt;Unitree Go1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This robot has four legs and 12 controlled joints, making it significantly different from both a rover and a robot arm.&lt;/p&gt;

&lt;p&gt;For this experiment, I used the Go1 model from MuJoCo Menagerie.&lt;/p&gt;

&lt;p&gt;The control interface was based on a 12-element &lt;code&gt;std_msgs/Float64MultiArray&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Go1 MuJoCo Menagerie model
        ↓
Hakoniwa quadruped joint asset
        ↑
Float64MultiArray[12]-derived PDU
        ↑
Python open-loop motion sender
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One important lesson here was that the ordering of the 12 joint values matters. If the ordering is wrong, individual legs move in unexpected ways.&lt;/p&gt;

&lt;p&gt;Another important distinction is terminology.&lt;/p&gt;

&lt;p&gt;What we implemented was &lt;strong&gt;open-loop motion playback&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It was not a walking controller that dynamically balances the robot against terrain or disturbances.&lt;/p&gt;

&lt;p&gt;We explicitly recorded that distinction in the Business Pack knowledge so that future AI sessions would not incorrectly describe the demo as a walking controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three robots, one development pattern
&lt;/h2&gt;

&lt;p&gt;The robots and their control interfaces were quite different:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Robot&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;PDU&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AgileX Tracer&lt;/td&gt;
&lt;td&gt;Mobile robot&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Twist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Linear/angular velocity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FR5&lt;/td&gt;
&lt;td&gt;Robot arm&lt;/td&gt;
&lt;td&gt;&lt;code&gt;JointTrajectory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Joint trajectory playback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unitree Go1&lt;/td&gt;
&lt;td&gt;Quadruped&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Float64MultiArray[12]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open-loop joint motion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;But the process followed by the AI was surprisingly similar.&lt;/p&gt;

&lt;p&gt;It repeatedly had to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What existing assets can be reused?&lt;/li&gt;
&lt;li&gt;Which Hakoniwa components are needed?&lt;/li&gt;
&lt;li&gt;What should the control PDU look like?&lt;/li&gt;
&lt;li&gt;What is the smallest useful simulation we can validate first?&lt;/li&gt;
&lt;li&gt;How do we know that the result actually works?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where the Hakoniwa Business Pack became important.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second demo: the three robot experiments together
&lt;/h2&gt;

&lt;p&gt;The first video at the beginning of this article shows the latest result.&lt;/p&gt;

&lt;p&gt;I also recorded an earlier demo that focuses specifically on the three robot experiments described above — &lt;strong&gt;AgileX Tracer, FR5, and Unitree Go1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/pdf5sAIur98"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Seeing these three very different robots side by side helped confirm something important: the robot-specific control interface changes, but the overall development pattern stays surprisingly consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Hakoniwa Business Pack matters
&lt;/h2&gt;

&lt;p&gt;Hakoniwa itself provides many components, but from an AI agent's perspective, a large ecosystem can be difficult to navigate.&lt;/p&gt;

&lt;p&gt;Which repository should it inspect?&lt;/p&gt;

&lt;p&gt;Should it use the PDU Registry or the MBody Registry?&lt;/p&gt;

&lt;p&gt;Who starts the Conductor?&lt;/p&gt;

&lt;p&gt;When should &lt;code&gt;hako-cmd start&lt;/code&gt; be executed?&lt;/p&gt;

&lt;p&gt;Is a command in a README just a standalone example, or part of a validated workflow?&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/hakoniwalab/hakoniwa-business-pack" rel="noopener noreferrer"&gt;Hakoniwa Business Pack&lt;/a&gt; acts as a map.&lt;/p&gt;

&lt;p&gt;Conceptually, it organizes information into things such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Catalog
  → What components exist?

Recipes
  → How can components be combined?

Runtime Primer
  → What are the runtime conventions?

Knowledge
  → What did previous experiments teach us?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This changes how an AI approaches the ecosystem.&lt;/p&gt;

&lt;p&gt;Instead of opening random repositories and trying to infer everything from source code, it can start from the user's goal and work backward.&lt;/p&gt;

&lt;h2&gt;
  
  
  I asked the AI what it thought
&lt;/h2&gt;

&lt;p&gt;After completing the experiments, I asked the AI coding agent a question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What did Hakoniwa make possible, and what was useful about the Hakoniwa Business Pack from an AI agent's perspective?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Its answer was interesting.&lt;/p&gt;

&lt;p&gt;The AI explained that without Hakoniwa, it would naturally tend toward one of two approaches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;implement everything inside MuJoCo, or&lt;/li&gt;
&lt;li&gt;build a dedicated bridge directly between ROS 2 and MuJoCo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Either approach tends to require designing the robot model, communication, timing, process startup, data formats, and visualization as one custom system.&lt;/p&gt;

&lt;p&gt;Hakoniwa allowed the AI to decompose the problem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Physics simulation → MuJoCo asset
Control application → Python / ROS / external app
Communication → PDU
Execution management → Hakoniwa runtime
Visualization → MuJoCo viewer / Three.js viewer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of building everything as one system, the AI could reason about &lt;strong&gt;which components should be connected&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For Tracer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Twist → rover asset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For FR5:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JointTrajectory → arm asset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Go1:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Float64MultiArray[12] → joint target asset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This common structure also made debugging easier.&lt;/p&gt;

&lt;p&gt;If something failed, the AI could investigate separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the robot model wrong?&lt;/li&gt;
&lt;li&gt;Is the actuator configuration wrong?&lt;/li&gt;
&lt;li&gt;Is the PDU arriving?&lt;/li&gt;
&lt;li&gt;Was &lt;code&gt;hako-cmd start&lt;/code&gt; executed at the wrong time?&lt;/li&gt;
&lt;li&gt;Is the problem only in the viewer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That decomposition is particularly useful for an AI coding agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning implicit knowledge into reusable knowledge
&lt;/h2&gt;

&lt;p&gt;The most interesting part, however, was not simply that the AI could use the Business Pack.&lt;/p&gt;

&lt;p&gt;It could also &lt;strong&gt;improve it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;During development, I had to teach the AI several pieces of Hakoniwa-specific knowledge.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;don't call &lt;code&gt;hako-cmd start&lt;/code&gt; before the assets are registered&lt;/li&gt;
&lt;li&gt;wait until the asset reaches &lt;code&gt;WAIT START&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;use the Python 3.12 environment where &lt;code&gt;hakopy&lt;/code&gt; is installed&lt;/li&gt;
&lt;li&gt;using &lt;code&gt;Twist&lt;/code&gt; makes the Tracer implementation easier to generalize into a rover asset&lt;/li&gt;
&lt;li&gt;the Go1 command contains 12 joint values and their ordering matters&lt;/li&gt;
&lt;li&gt;Go1 open-loop motion should not be described as a walking controller&lt;/li&gt;
&lt;li&gt;the Drone mission should be started after the viewer connects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these lessons remained only in a chat session, the next AI session could make the same mistakes again.&lt;/p&gt;

&lt;p&gt;Instead, we moved useful lessons back into recipes, documentation, and knowledge in the Business Pack.&lt;/p&gt;

&lt;p&gt;So the development process started to look like this:&lt;/p&gt;

&lt;h4&gt;
  
  
  From one task to accumulated knowledge
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1. Human requirement&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Describe what should be achieved, not how every file should be implemented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI reads Catalog / Recipes / Knowledge&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The agent starts from the ecosystem map instead of exploring repositories blindly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. AI proposes a simulation architecture&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It chooses reusable assets, PDUs, models, and runtime components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. AI implements and runs it&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The result is not considered complete just because the code was generated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Human and AI inspect the failures&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Runtime ordering, model conversion, actuator settings, PDU semantics, and other implicit assumptions become visible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Reusable knowledge is updated&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Useful discoveries are promoted into recipes, documentation, validation scripts, or runtime knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. The next task starts from a stronger baseline&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The AI was not just generating code. It was helping build the knowledge required for the next AI agent to do a better job.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;AI certainly makes writing simulator code easier.&lt;/p&gt;

&lt;p&gt;But after these experiments, I don't think code generation is the most interesting part.&lt;/p&gt;

&lt;p&gt;The harder problem has always been integration:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to use this URDF.&lt;/p&gt;

&lt;p&gt;I want to reuse ROS assets.&lt;/p&gt;

&lt;p&gt;I want MuJoCo for physics.&lt;/p&gt;

&lt;p&gt;I want it to run on macOS.&lt;/p&gt;

&lt;p&gt;I want web visualization.&lt;/p&gt;

&lt;p&gt;I want to connect my own control application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The challenge is not any single technology.&lt;/p&gt;

&lt;p&gt;The challenge is &lt;strong&gt;combining multiple technologies according to the user's actual requirements&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Hakoniwa turns simulators, control applications, communication, and visualization into independent components.&lt;/p&gt;

&lt;p&gt;The Hakoniwa Business Pack then describes those components and their composition patterns in a form that an AI agent can reason about.&lt;/p&gt;

&lt;p&gt;That means a human does not necessarily need to begin with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use this API, create this class, edit this configuration file..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead, we can increasingly begin with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"This is the robot I have, this is the environment I want, and this is how I want to control it."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI can then investigate existing assets, choose components, build the architecture, implement it, run it, and learn from the result.&lt;/p&gt;

&lt;p&gt;That is what I mean by &lt;strong&gt;AI-driven simulator development&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not just AI generating simulator code.&lt;/p&gt;

&lt;p&gt;But AI helping move from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;requirements → architecture → integration → execution → validation → reusable knowledge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is still a lot to improve, but after seeing the same pattern work with a rover, a robot arm, a quadruped, and a drone, I think this direction is worth exploring further.&lt;/p&gt;

&lt;p&gt;The Hakoniwa Business Pack is open source, so if you're interested in AI-driven robotics simulation, feel free to take a look:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/hakoniwalab/hakoniwa-business-pack" rel="noopener noreferrer"&gt;https://github.com/hakoniwalab/hakoniwa-business-pack&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And here is the demo again:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/H40vTOm5PQo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;I'd be very interested to hear how other robotics developers are using AI agents for simulation development — especially where integration, rather than code generation itself, is the difficult part.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>robotics</category>
      <category>ros</category>
    </item>
  </channel>
</rss>
