<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Documentation Hub |</title><link>https://pouya-shaterzadeh.github.io/docs/</link><atom:link href="https://pouya-shaterzadeh.github.io/docs/index.xml" rel="self" type="application/rss+xml"/><description>Documentation Hub</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 10 Mar 2026 00:00:00 +0000</lastBuildDate><image><url>https://pouya-shaterzadeh.github.io/media/logo_hu_4a3e4e48743249cf.png</url><title>Documentation Hub</title><link>https://pouya-shaterzadeh.github.io/docs/</link></image><item><title>ROS 2 Humble to Jazzy Migration Guide for IsaacLab UR Reach</title><link>https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;This guide details the modifications suggested for the
codebase to migrate from &lt;strong&gt;ROS 2 Humble&lt;/strong&gt; (Ubuntu 22.04) to &lt;strong&gt;ROS 2 Jazzy Jalisco&lt;/strong&gt; (Ubuntu 24.04).&lt;/p&gt;
&lt;p&gt;In addition to syntax and API changes, it covers the environmental configuration tweaks needed to successfully run the task scripts from a separate terminal containing virtual environments (e.g., PyTorch or IsaacLab).&lt;/p&gt;
&lt;h2 id="1-codebase-syntax-and-api-changes"&gt;1. Codebase Syntax and API Changes&lt;/h2&gt;
&lt;h3 id="updating-controller-state-topics"&gt;Updating Controller State Topics&lt;/h3&gt;
&lt;p&gt;Between ROS 2 Humble and Jazzy, the default controller state topic for the scaled joint trajectory controller changed.
In &lt;code&gt;python/run_task.py&lt;/code&gt;, the &lt;code&gt;STATE_TOPIC&lt;/code&gt; must be updated:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Old (ROS 2 Humble)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;STATE_TOPIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/scaled_joint_trajectory_controller/state&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# New (ROS 2 Jazzy)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;STATE_TOPIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/scaled_joint_trajectory_controller/controller_state&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="adapting-to-control_msgs-changes"&gt;Adapting to &lt;code&gt;control_msgs&lt;/code&gt; Changes&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;JointTrajectoryControllerState&lt;/code&gt; message definition changed in ROS 2 Jazzy. The &lt;code&gt;actual&lt;/code&gt; field was deprecated and renamed to &lt;code&gt;feedback&lt;/code&gt;.
In &lt;code&gt;python/run_task.py&lt;/code&gt;, inside the &lt;code&gt;sub_callback&lt;/code&gt; function, update the attributes used to access joint positions and velocities:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Old (ROS 2 Humble)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;joint_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;robot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_joint_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;velocities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# New (ROS 2 Jazzy)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;joint_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;robot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_joint_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;positions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;velocities&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-hardcoded-configuration-paths"&gt;2. Hardcoded Configuration Paths&lt;/h2&gt;
&lt;p&gt;The pre-trained policy loader uses hardcoded paths to initialize the model and environment parameters. These need to be updated to match the local workspace structure on the new machine.&lt;/p&gt;
&lt;p&gt;In &lt;code&gt;python/robots/ur.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Update these to match your local repository clone path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_policy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;/home/&amp;lt;YOUR_USER&amp;gt;/isaaclab_ur_reach_sim2real/sample/ur_reach/ur_reach_policy.pt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;/home/&amp;lt;YOUR_USER&amp;gt;/isaaclab_ur_reach_sim2real/sample/ur_reach/ur_reach_env.yaml&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-environment-and-terminal-setup"&gt;3. Environment and Terminal Setup&lt;/h2&gt;
&lt;p&gt;To run the task scripts from another terminal successfully, you must handle Python dependencies and the integration between deep learning environments (venv/conda) and the ROS 2 workspace.&lt;/p&gt;
&lt;h3 id="dependencies"&gt;Dependencies&lt;/h3&gt;
&lt;p&gt;Create a virtual environment and load the necessary dependencies (&lt;code&gt;torch&lt;/code&gt;, &lt;code&gt;torchvision&lt;/code&gt;, &lt;code&gt;torchaudio&lt;/code&gt;, &lt;code&gt;numpy&lt;/code&gt;, &lt;code&gt;pyyaml&lt;/code&gt;).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 -m venv pytorch_env
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; pytorch_env/bin/activate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install torch torchvision torchaudio numpy pyyaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="resolving-module-not-found-errors-pythonpath"&gt;Resolving Module Not Found Errors (PYTHONPATH)&lt;/h3&gt;
&lt;p&gt;When running within an isolated virtual environment (like a conda env for IsaacLab or a venv for PyTorch), the ROS 2 Python packages might not be correctly recognized even after sourcing the setup file.&lt;/p&gt;
&lt;p&gt;To allow task scripts to run seamlessly from another terminal, source ROS 2 Jazzy and explicitly append its &lt;code&gt;site-packages&lt;/code&gt; to your &lt;code&gt;PYTHONPATH&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Sourcing ROS 2 Jazzy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; /opt/ros/jazzy/setup.bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ensure Python 3.12 (the default for Ubuntu 24.04/Jazzy) sees the ROS 2 packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PYTHONPATH&lt;/span&gt;:/opt/ros/jazzy/lib/python3.12/site-packages
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Navigate and run your task&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/isaaclab_ur_reach_sim2real/python/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 run_task.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This ensures standard tools like &lt;code&gt;rclpy&lt;/code&gt; are successfully imported within your deep learning environment.&lt;/p&gt;
&lt;h2 id="4-visual-guide-to-sim2sim-setup-in-ursim"&gt;4. Visual Guide to Sim2Sim Setup in URSim&lt;/h2&gt;
&lt;p&gt;Running the simulation using URSim? Here is a step-by-step visual process:&lt;/p&gt;
&lt;h3 id="1-launch-ursim"&gt;1. Launch URSim&lt;/h3&gt;
&lt;p&gt;After launching URSim using the &lt;code&gt;ur_robot_driver&lt;/code&gt; scripts, open it in your VNC browser interface. You should see an interface similar to:
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="URSim Interface"
srcset="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/ursim_interface_image_hu_18f9704bfd3554b.webp 320w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/ursim_interface_image_hu_db1c452346f24836.webp 480w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/ursim_interface_image_hu_563285047e7ed5f4.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/ursim_interface_image_hu_18f9704bfd3554b.webp"
width="760"
height="433"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="2-activate-external-control-in-urcaps"&gt;2. Activate External Control in URCaps&lt;/h3&gt;
&lt;p&gt;In the &lt;strong&gt;Programs&lt;/strong&gt; tab, below &lt;strong&gt;URCaps&lt;/strong&gt;, click on &lt;strong&gt;External Control&lt;/strong&gt;. Below &lt;strong&gt;Robot Progam&lt;/strong&gt; you should see appear indicating the host IP properly.
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="URCaps Interface"
srcset="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/urcaps_image_hu_4822806b5d36cbea.webp 320w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/urcaps_image_hu_3a2e220f618c9c86.webp 480w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/urcaps_image_hu_e72405f730a16cc9.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/urcaps_image_hu_4822806b5d36cbea.webp"
width="760"
height="433"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="3-start-the-ur-robot"&gt;3. Start the UR Robot&lt;/h3&gt;
&lt;p&gt;Click on the red button in the bottom left. Click on &lt;strong&gt;On&lt;/strong&gt;, then &lt;strong&gt;Start&lt;/strong&gt; until you obtain the following interface indicating the robot is operational:
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Robot Started Interface"
srcset="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/robot_started_image_hu_2c5f78d459f9f87d.webp 320w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/robot_started_image_hu_b166e38712195178.webp 480w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/robot_started_image_hu_ed59a60a4370465b.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/robot_started_image_hu_2c5f78d459f9f87d.webp"
width="760"
height="433"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="4-proceed-to-move-tab"&gt;4. Proceed to Move Tab&lt;/h3&gt;
&lt;p&gt;Press &lt;strong&gt;Exit&lt;/strong&gt;, and then switch over to the &lt;strong&gt;Move&lt;/strong&gt; tab in the interface:
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Next Tab Interface"
srcset="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/move_tab_image_hu_c4fe3ef77762993e.webp 320w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/move_tab_image_hu_283d004974db1901.webp 480w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/move_tab_image_hu_bd0adfefdd06e9d.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/move_tab_image_hu_c4fe3ef77762993e.webp"
width="760"
height="433"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 id="5-connect-to-computer"&gt;5. Connect to Computer&lt;/h3&gt;
&lt;p&gt;Press the play button in the bottom and select the generated connection profile to effectively prepare for accepting commands!
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Connect Interface"
srcset="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/play_selection_image_hu_b7feeea09d7ab72a.webp 320w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/play_selection_image_hu_65615c8604c0409c.webp 480w, https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/play_selection_image_hu_f061db0ea0fa2130.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://pouya-shaterzadeh.github.io/docs/ur_reach_migration/play_selection_image_hu_b7feeea09d7ab72a.webp"
width="760"
height="433"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;I am &lt;strong&gt;Pouya Shaterzadeh&lt;/strong&gt;. My work involves using open-source tools to build end-to-end robotics and deep learning software!&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s connect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;
&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="display:none;" aria-hidden="true"&gt;
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
&lt;/div&gt;</description></item><item><title>OpenCV Gazebo ROS 1 to ROS 2 Migration</title><link>https://pouya-shaterzadeh.github.io/docs/opencv_migration/</link><pubDate>Sat, 28 Feb 2026 00:00:00 +0000</pubDate><guid>https://pouya-shaterzadeh.github.io/docs/opencv_migration/</guid><description>&lt;h1 id="ros-1-to-ros-2-migration-opencv-with-gazebo"&gt;ROS 1 to ROS 2 Migration: OpenCV with Gazebo&lt;/h1&gt;
&lt;p&gt;This is a documentation of the successful migration of the &lt;code&gt;pkg_cv_ros_tutorial_by_dhanuzch&lt;/code&gt; repository from ROS 1 to ROS 2 (Foxy and newer), following the official ROS 2 Migration Guide.&lt;/p&gt;
&lt;p&gt;This repository was originally a ROS 1 package used in the &amp;ldquo;Using OpenCV with Gazebo in ROS&amp;rdquo; tutorial series by &lt;code&gt;@dhanuzch&lt;/code&gt;. It has now been ported and is available at:&lt;br&gt;
&lt;strong&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The migration includes updating package manifests, the build system (&lt;code&gt;ament_cmake&lt;/code&gt;), Python source code for nodes, and transitioning ROS 1 XML launch files to ROS 2 Python launch files.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="proposed-changes"&gt;Proposed Changes&lt;/h2&gt;
&lt;h3 id="phase-1-package-manifest-and-build-system"&gt;Phase 1: Package Manifest and Build System&lt;/h3&gt;
&lt;p&gt;Ensure the package&amp;rsquo;s foundation is fully ROS 2 compliant. Update dependencies and build configurations to use &lt;code&gt;ament_cmake&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;package.xml&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed &lt;code&gt;&amp;lt;package format=&amp;quot;2&amp;quot;&amp;gt;&lt;/code&gt; to at least format 3 for ROS 2 compatibility.&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;&amp;lt;buildtool_depend&amp;gt;catkin&amp;lt;/buildtool_depend&amp;gt;&lt;/code&gt; with &lt;code&gt;&amp;lt;buildtool_depend&amp;gt;ament_cmake&amp;lt;/buildtool_depend&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Replaced occurrences of &lt;code&gt;rospy&lt;/code&gt; with &lt;code&gt;rclpy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;sensor_msgs&lt;/code&gt; and &lt;code&gt;cv_bridge&lt;/code&gt; as &lt;code&gt;&amp;lt;exec_depend&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;&amp;lt;export&amp;gt;&amp;lt;build_type&amp;gt;ament_cmake&amp;lt;/build_type&amp;gt;&amp;lt;/export&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CMakeLists.txt&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated &lt;code&gt;cmake_minimum_required&lt;/code&gt; to &lt;code&gt;VERSION 3.8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;find_package(catkin ...)&lt;/code&gt; with &lt;code&gt;find_package(ament_cmake REQUIRED)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Used &lt;code&gt;install(PROGRAMS ...)&lt;/code&gt; to install the Python scripts into &lt;code&gt;lib/${PROJECT_NAME}&lt;/code&gt; so they can be executed natively.&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;catkin_package()&lt;/code&gt; with &lt;code&gt;ament_package()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="phase-2-python-node-migration"&gt;Phase 2: Python Node Migration&lt;/h3&gt;
&lt;p&gt;Migrate the ROS 1 specific Python code (&lt;code&gt;rospy&lt;/code&gt;) to the ROS 2 API (&lt;code&gt;rclpy&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;scripts/camera_read.py&lt;/code&gt; &amp;amp; &lt;code&gt;scripts/decode_qr.py&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed &lt;code&gt;import rospy&lt;/code&gt; to &lt;code&gt;import rclpy&lt;/code&gt; and included &lt;code&gt;from rclpy.node import Node&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ensured script node classes inherit natively from &lt;code&gt;Node&lt;/code&gt; and updated constructors via &lt;code&gt;super().__init__()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Replaced &lt;code&gt;rospy.Subscriber&lt;/code&gt; with &lt;code&gt;self.create_subscription()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Built modern logging (&lt;code&gt;self.get_logger().info()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;main()&lt;/code&gt; execution blocks to leverage &lt;code&gt;rclpy.spin()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;
&lt;h3 id="phase-3-launch-files-and-testing"&gt;Phase 3: Launch Files and Testing&lt;/h3&gt;
&lt;p&gt;Recreate the environment execution flow using ROS 2 Python launch files and conduct final system integration and testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;launch/1_world_and_script.launch.py&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Created a modern ROS 2 Python launch script importing logic to extend &lt;code&gt;GAZEBO_MODEL_PATH&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;Node&lt;/code&gt; execution actions sequentially alongside simulation boots.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;launch/2_world_and_script.launch.py&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Converted the legacy target to spawn the QR-decoding process seamlessly via concurrent &lt;code&gt;ExecuteProcess&lt;/code&gt; dependencies!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="verification-plan"&gt;Verification Plan&lt;/h2&gt;
&lt;h3 id="automatedcompilation-tests"&gt;Automated/Compilation Tests&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;colcon build --symlink-install&lt;/code&gt; from the workspace root.&lt;/li&gt;
&lt;li&gt;Ensure the package compiles cleanly without CMake or ament errors.&lt;/li&gt;
&lt;li&gt;Verify that &lt;code&gt;source install/setup.bash&lt;/code&gt; makes the package correctly visible to &lt;code&gt;ros2 pkg list&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="system-integration--manual-verification"&gt;System Integration &amp;amp; Manual Verification&lt;/h3&gt;
&lt;p&gt;To manually test:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initiate the simulation using &lt;code&gt;ros2 launch pkg_cv_ros_tutorial_by_dhanuzch 1_world_and_script.launch.py&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Confirm that the &lt;code&gt;cv2.imshow&lt;/code&gt; window appears and natively resolves drone camera outputs.&lt;/li&gt;
&lt;li&gt;Test &lt;code&gt;2_world_and_script.launch.py&lt;/code&gt; to confirm QR decoding highlights!&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="display:none;" aria-hidden="true"&gt;
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
word word word word word word word word word word word word word word word word word word word word
&lt;/div&gt;</description></item></channel></rss>