diff --git a/nanosaur/package.xml b/nanosaur/package.xml
index 7540cb1..f7a2693 100644
--- a/nanosaur/package.xml
+++ b/nanosaur/package.xml
@@ -40,9 +40,10 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ament_cmake
+ nanosaur_control
nanosaur_description
nanosaur_msgs
- nanosaur_control
+ nanosaur_visualization
ament_cmake
diff --git a/nanosaur_visualization/CMakeLists.txt b/nanosaur_visualization/CMakeLists.txt
new file mode 100644
index 0000000..8cbe4f0
--- /dev/null
+++ b/nanosaur_visualization/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 3.5)
+
+project(nanosaur_visualization)
+
+################################################################################
+# Find ament packages and libraries for ament and system dependencies
+################################################################################
+find_package(ament_cmake REQUIRED)
+
+################################################################################
+# Install
+################################################################################
+install(
+ DIRECTORY launch rviz
+ DESTINATION share/${PROJECT_NAME}
+)
+
+################################################################################
+# Macro for ament package
+################################################################################
+ament_package()
\ No newline at end of file
diff --git a/nanosaur_visualization/launch/robot_display.launch.py b/nanosaur_visualization/launch/robot_display.launch.py
new file mode 100644
index 0000000..227924f
--- /dev/null
+++ b/nanosaur_visualization/launch/robot_display.launch.py
@@ -0,0 +1,85 @@
+# Copyright (C) 2025, Raffaello Bonghi
+# All rights reserved
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. Neither the name of the copyright holder nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+import os
+from ament_index_python.packages import get_package_share_directory
+
+from launch import LaunchDescription
+from launch.substitutions import LaunchConfiguration
+from launch.actions import DeclareLaunchArgument
+from launch_ros.actions import Node
+
+
+def generate_launch_description():
+
+ nanosaur_visualization = get_package_share_directory('nanosaur_visualization')
+
+ head_type = LaunchConfiguration('head_type')
+ flap_type = LaunchConfiguration('flap_type')
+ namespace = LaunchConfiguration('namespace', default="nanosaur")
+ rvizconfig = LaunchConfiguration('rvizconfig')
+
+ default_rviz_config_path = os.path.join(nanosaur_visualization, 'rviz', 'robot.rviz')
+
+ nanosaur_cmd = DeclareLaunchArgument(
+ name='namespace',
+ default_value='nanosaur',
+ description='nanosaur namespace name. If you are working with multiple robot you can change this namespace.')
+
+ declare_head_type_cmd = DeclareLaunchArgument(
+ name='head_type',
+ default_value='realsense',
+ description='Head type to use. Options: empty, Realsense, zed.')
+
+ declare_flap_type_cmd = DeclareLaunchArgument(
+ name='flap_type',
+ default_value='empty',
+ description='Flap type to use. Options: empty, LD06.')
+
+ declare_rvizconfig_cmd = DeclareLaunchArgument(
+ name='rvizconfig',
+ default_value=default_rviz_config_path,
+ description='Absolute path to rviz config file')
+
+ rviz_node = Node(
+ package='rviz2',
+ executable='rviz2',
+ name='rviz2',
+ output='screen',
+ namespace=namespace,
+ arguments=['-d', rvizconfig],
+ )
+
+ # Define LaunchDescription variable and return it
+ ld = LaunchDescription()
+ ld.add_action(nanosaur_cmd)
+ ld.add_action(declare_head_type_cmd)
+ ld.add_action(declare_flap_type_cmd)
+ ld.add_action(declare_rvizconfig_cmd)
+ ld.add_action(rviz_node)
+
+ return ld
+# EOF
diff --git a/nanosaur_visualization/package.xml b/nanosaur_visualization/package.xml
new file mode 100644
index 0000000..174d6e3
--- /dev/null
+++ b/nanosaur_visualization/package.xml
@@ -0,0 +1,51 @@
+
+
+
+
+ nanosaur_visualization
+ 2.0.0
+ nanosaur visualization tools
+ Raffaello Bonghi
+ Raffaello Bonghi
+ MIT
+
+ https://nanosaur.ai
+ https://github.com/rnanosaur/nanosaur
+ https://github.com/rnanosaur/nanosaur/issues
+
+ ament_cmake
+
+ rviz2
+
+ ament_lint_auto
+ ament_lint_common
+
+
+ ament_cmake
+
+
\ No newline at end of file
diff --git a/nanosaur_visualization/rviz/robot.rviz b/nanosaur_visualization/rviz/robot.rviz
new file mode 100644
index 0000000..9a0ff7e
--- /dev/null
+++ b/nanosaur_visualization/rviz/robot.rviz
@@ -0,0 +1,192 @@
+Panels:
+ - Class: rviz_common/Displays
+ Help Height: 78
+ Name: Displays
+ Property Tree Widget:
+ Expanded:
+ - /Global Options1
+ - /Status1
+ - /RobotModel1
+ - /TF1
+ - /Image1
+ Splitter Ratio: 0.5
+ Tree Height: 489
+ - Class: rviz_common/Selection
+ Name: Selection
+ - Class: rviz_common/Tool Properties
+ Expanded:
+ - /2D Goal Pose1
+ - /Publish Point1
+ Name: Tool Properties
+ Splitter Ratio: 0.5886790156364441
+ - Class: rviz_common/Views
+ Expanded:
+ - /Current View1
+ Name: Views
+ Splitter Ratio: 0.5
+ - Class: rviz_common/Time
+ Experimental: false
+ Name: Time
+ SyncMode: 0
+ SyncSource: ""
+Visualization Manager:
+ Class: ""
+ Displays:
+ - Alpha: 0.5
+ Cell Size: 1
+ Class: rviz_default_plugins/Grid
+ Color: 160; 160; 164
+ Enabled: true
+ Line Style:
+ Line Width: 0.029999999329447746
+ Value: Lines
+ Name: Grid
+ Normal Cell Count: 0
+ Offset:
+ X: 0
+ Y: 0
+ Z: 0
+ Plane: XY
+ Plane Cell Count: 10
+ Reference Frame:
+ Value: true
+ - Alpha: 1
+ Class: rviz_default_plugins/RobotModel
+ Collision Enabled: false
+ Description File: ""
+ Description Source: Topic
+ Description Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /nanosaur/robot_description
+ Enabled: true
+ Links:
+ All Links Enabled: true
+ Expand Joint Details: false
+ Expand Link Details: false
+ Expand Tree: false
+ Link Tree Style: Links in Alphabetic Order
+ Mass Properties:
+ Inertia: false
+ Mass: false
+ Name: RobotModel
+ TF Prefix: ""
+ Update Interval: 0
+ Value: true
+ Visual Enabled: true
+ - Class: rviz_default_plugins/TF
+ Enabled: true
+ Frame Timeout: 15
+ Frames:
+ All Enabled: true
+ Marker Scale: 0.20000000298023224
+ Name: TF
+ Show Arrows: true
+ Show Axes: true
+ Show Names: false
+ Tree:
+ {}
+ Update Interval: 0
+ Value: true
+ - Class: rviz_default_plugins/Image
+ Enabled: true
+ Max Value: 1
+ Median window: 5
+ Min Value: 0
+ Name: Image
+ Normalize Range: true
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /nanosaur/camera/infra1/image_raw
+ Value: true
+ Enabled: true
+ Global Options:
+ Background Color: 48; 48; 48
+ Fixed Frame: base_link
+ Frame Rate: 30
+ Name: root
+ Tools:
+ - Class: rviz_default_plugins/Interact
+ Hide Inactive Objects: true
+ - Class: rviz_default_plugins/MoveCamera
+ - Class: rviz_default_plugins/Select
+ - Class: rviz_default_plugins/FocusCamera
+ - Class: rviz_default_plugins/Measure
+ Line color: 128; 128; 0
+ - Class: rviz_default_plugins/SetInitialPose
+ Covariance x: 0.25
+ Covariance y: 0.25
+ Covariance yaw: 0.06853891909122467
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /initialpose
+ - Class: rviz_default_plugins/SetGoal
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /goal_pose
+ - Class: rviz_default_plugins/PublishPoint
+ Single click: true
+ Topic:
+ Depth: 5
+ Durability Policy: Volatile
+ History Policy: Keep Last
+ Reliability Policy: Reliable
+ Value: /clicked_point
+ Transformation:
+ Current:
+ Class: rviz_default_plugins/TF
+ Value: true
+ Views:
+ Current:
+ Class: rviz_default_plugins/Orbit
+ Distance: 0.5684685707092285
+ Enable Stereo Rendering:
+ Stereo Eye Separation: 0.05999999865889549
+ Stereo Focal Distance: 1
+ Swap Stereo Eyes: false
+ Value: false
+ Focal Point:
+ X: 0
+ Y: 0
+ Z: 0
+ Focal Shape Fixed Size: true
+ Focal Shape Size: 0.05000000074505806
+ Invert Z Axis: false
+ Name: Current View
+ Near Clip Distance: 0.009999999776482582
+ Pitch: 0.785398006439209
+ Target Frame:
+ Value: Orbit (rviz)
+ Yaw: 0.785398006439209
+ Saved: ~
+Window Geometry:
+ Displays:
+ collapsed: false
+ Height: 1036
+ Hide Left Dock: false
+ Hide Right Dock: false
+ Image:
+ collapsed: false
+ QMainWindow State: 000000ff00000000fd0000000400000000000001560000036efc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000274000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d00610067006501000002b7000000f40000002800ffffff000000010000010f0000036efc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d0000036e000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000006260000003efc0100000002fb0000000800540069006d0065010000000000000626000002fb00fffffffb0000000800540069006d00650100000000000004500000000000000000000003b50000036e00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
+ Selection:
+ collapsed: false
+ Time:
+ collapsed: false
+ Tool Properties:
+ collapsed: false
+ Views:
+ collapsed: false
+ Width: 1574
+ X: 330
+ Y: 833