diff --git a/dolly/dolly/__init__.py b/dolly/dolly/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/dolly/dolly/my_node.py b/dolly/dolly/my_node.py
new file mode 100644
index 0000000..7a4eb73
--- /dev/null
+++ b/dolly/dolly/my_node.py
@@ -0,0 +1,6 @@
+def main():
+ print('Hi from dolly.')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/dolly/launch/1_rviz.launch.py b/dolly/launch/1_rviz.launch.py
new file mode 100644
index 0000000..bb49f20
--- /dev/null
+++ b/dolly/launch/1_rviz.launch.py
@@ -0,0 +1,29 @@
+from launch import LaunchDescription
+from launch_ros.actions import Node
+
+def generate_launch_description():
+ urdf = '/home/luqman/beginners_ws/src/dolly/urdf/dolly.urdf'
+ # rviz_config_file=os.path.join(package_dir,'config.rviz')
+
+ return LaunchDescription([
+ Node(
+ package='robot_state_publisher',
+ executable='robot_state_publisher',
+ name='robot_state_publisher',
+ output='screen',
+ arguments=[urdf]),
+ Node(
+ package='joint_state_publisher_gui',
+ executable='joint_state_publisher_gui',
+ name='joint_state_publisher_gui',
+ arguments=[urdf]),
+
+ Node(
+ package='rviz2',
+ executable='rviz2',
+ name='rviz2',
+ # arguments=['-d',rviz_config_file],
+ output='screen'),
+
+
+ ])
\ No newline at end of file
diff --git a/dolly/launch/2_gazebo.launch.py b/dolly/launch/2_gazebo.launch.py
new file mode 100644
index 0000000..b88ca3f
--- /dev/null
+++ b/dolly/launch/2_gazebo.launch.py
@@ -0,0 +1,30 @@
+from launch import LaunchDescription
+from launch_ros.actions import Node
+from launch.actions import ExecuteProcess
+def generate_launch_description():
+ urdf = '/home/luqman/beginners_ws/src/dolly/urdf/dolly.urdf'
+
+ return LaunchDescription([
+
+ Node(
+ package='robot_state_publisher',
+ executable='robot_state_publisher',
+ name='robot_state_publisher',
+ output='screen',
+ arguments=[urdf]),
+ Node(
+ package='joint_state_publisher',
+ executable='joint_state_publisher',
+ name='joint_state_publisher',
+ arguments=[urdf]),
+# Gazebo related stuff required to launch the robot in simulation
+ ExecuteProcess(
+ cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_factory.so'],
+ output='screen'),
+ Node(
+ package='gazebo_ros',
+ executable='spawn_entity.py',
+ name='urdf_spawner',
+ output='screen',
+ arguments=["-topic", "/robot_description", "-entity", "dolly"])
+ ])
\ No newline at end of file
diff --git a/dolly/package.xml b/dolly/package.xml
new file mode 100644
index 0000000..bf71af0
--- /dev/null
+++ b/dolly/package.xml
@@ -0,0 +1,18 @@
+
+
+
+ dolly
+ 0.0.0
+ TODO: Package description
+ luqman
+ TODO: License declaration
+ rclpy
+ ament_copyright
+ ament_flake8
+ ament_pep257
+ python3-pytest
+
+
+ ament_python
+
+
diff --git a/dolly/resource/dolly b/dolly/resource/dolly
new file mode 100644
index 0000000..e69de29
diff --git a/dolly/setup.cfg b/dolly/setup.cfg
new file mode 100644
index 0000000..d449428
--- /dev/null
+++ b/dolly/setup.cfg
@@ -0,0 +1,4 @@
+[develop]
+script-dir=$base/lib/dolly
+[install]
+install-scripts=$base/lib/dolly
diff --git a/dolly/setup.py b/dolly/setup.py
new file mode 100644
index 0000000..266cdc8
--- /dev/null
+++ b/dolly/setup.py
@@ -0,0 +1,29 @@
+from setuptools import setup
+import os
+from glob import glob
+package_name = 'dolly'
+
+setup(
+ name=package_name,
+ version='0.0.0',
+ packages=[package_name],
+ data_files=[
+ ('share/ament_index/resource_index/packages',
+ ['resource/' + package_name]),
+ ('share/' + package_name, ['package.xml']),
+ (os.path.join('share', package_name), glob('urdf/*')),
+ (os.path.join('share', package_name), glob('launch/*')),
+ ],
+ install_requires=['setuptools'],
+ zip_safe=True,
+ maintainer='luqman',
+ maintainer_email='noshluk2@gmail.com',
+ description='TODO: Package description',
+ license='TODO: License declaration',
+ tests_require=['pytest'],
+ entry_points={
+ 'console_scripts': [
+ 'my_node = dolly.my_node:main'
+ ],
+ },
+)
diff --git a/dolly/test/test_copyright.py b/dolly/test/test_copyright.py
new file mode 100644
index 0000000..cc8ff03
--- /dev/null
+++ b/dolly/test/test_copyright.py
@@ -0,0 +1,23 @@
+# Copyright 2015 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from ament_copyright.main import main
+import pytest
+
+
+@pytest.mark.copyright
+@pytest.mark.linter
+def test_copyright():
+ rc = main(argv=['.', 'test'])
+ assert rc == 0, 'Found errors'
diff --git a/dolly/test/test_flake8.py b/dolly/test/test_flake8.py
new file mode 100644
index 0000000..27ee107
--- /dev/null
+++ b/dolly/test/test_flake8.py
@@ -0,0 +1,25 @@
+# Copyright 2017 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from ament_flake8.main import main_with_errors
+import pytest
+
+
+@pytest.mark.flake8
+@pytest.mark.linter
+def test_flake8():
+ rc, errors = main_with_errors(argv=[])
+ assert rc == 0, \
+ 'Found %d code style errors / warnings:\n' % len(errors) + \
+ '\n'.join(errors)
diff --git a/dolly/test/test_pep257.py b/dolly/test/test_pep257.py
new file mode 100644
index 0000000..b234a38
--- /dev/null
+++ b/dolly/test/test_pep257.py
@@ -0,0 +1,23 @@
+# Copyright 2015 Open Source Robotics Foundation, Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from ament_pep257.main import main
+import pytest
+
+
+@pytest.mark.linter
+@pytest.mark.pep257
+def test_pep257():
+ rc = main(argv=['.', 'test'])
+ assert rc == 0, 'Found code style errors / warnings'
diff --git a/dolly/urdf/dolly.urdf b/dolly/urdf/dolly.urdf
new file mode 100644
index 0000000..591a884
--- /dev/null
+++ b/dolly/urdf/dolly.urdf
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gazebo/Black
+
+
+ Gazebo/Blue
+
+
+ Gazebo/Blue
+
+
+ Gazebo/Grey
+
+
+ Gazebo/Orange
+
+
+ Gazebo/Red
+
+
+
+
+
+
+
+
+ odom
+ cmd_vel
+ true
+ true
+ 15.0
+
+ wheel_left_joint
+ wheel_right_joint
+
+ 0.5
+ 0.3
+ 0.7
+ 8
+ base
+
+
+
+
+
+
+ true
+ 30.0
+
+ 1.3962634
+
+ 800
+ 800
+ R8G8B8
+
+
+ 0.02
+ 300
+
+
+
+ true
+ 60.0
+ /camera
+ image_raw
+ info_camera
+ camera
+ 0.07
+
+
+
+
+
+
+
+
+
+
+
+ true
+ 12.0
+
+ sensor_msgs/LaserScan
+ lidar
+
+
+
+
+ 360
+ 1
+ 0.00
+ 3.14
+
+
+
+ 0.120
+ 3.5
+ 0.015
+
+
+
+
+
+
+
+
\ No newline at end of file