├── .gitignore ├── description ├── rhea.blend ├── rhea.urdf.xacro ├── urdf │ └── rhea.urdf └── rhea.ros2_control.xacro ├── images └── rhea_render.jpg ├── README.md ├── package.xml ├── CMakeLists.txt ├── LICENSE └── launch └── view_robot.launch.py /.gitignore: -------------------------------------------------------------------------------- 1 | **/.DS_Store 2 | build 3 | description/rhea.blend1 4 | -------------------------------------------------------------------------------- /description/rhea.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/G-Levine/rhea_description/HEAD/description/rhea.blend -------------------------------------------------------------------------------- /images/rhea_render.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/G-Levine/rhea_description/HEAD/images/rhea_render.jpg -------------------------------------------------------------------------------- /description/rhea.urdf.xacro: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rhea wheeled biped robot 2 | 3 | 4 | 5 | URDF model for the Rhea wheeled biped. 6 | 7 | If this is used with ROS2 Control on the physical robot, [pi3hat_hardware_interface](https://github.com/G-Levine/pi3hat_hardware_interface) is required. 8 | 9 | The source for the meshes/URDF is contained in `urdf/rhea.blend`. This can be edited and re-exported using the [Phobos Blender plugin](https://github.com/dfki-ric/phobos). -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | rhea_description 5 | 0.0.0 6 | Description package for the Rhea wheeled biped robot 7 | Gabrael Levine 8 | TODO: License declaration 9 | 10 | ament_cmake 11 | 12 | ament_lint_auto 13 | ament_lint_common 14 | 15 | 16 | ament_cmake 17 | 18 | 19 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.8) 2 | project(rhea_description) 3 | 4 | if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") 5 | add_compile_options(-Wall -Wextra -Wpedantic) 6 | endif() 7 | 8 | # find dependencies 9 | find_package(ament_cmake REQUIRED) 10 | # uncomment the following section in order to fill in 11 | # further dependencies manually. 12 | # find_package( REQUIRED) 13 | 14 | install( 15 | DIRECTORY description launch 16 | DESTINATION share/${PROJECT_NAME} 17 | ) 18 | 19 | if(BUILD_TESTING) 20 | find_package(ament_lint_auto REQUIRED) 21 | # the following line skips the linter which checks for copyrights 22 | # comment the line when a copyright and license is added to all source files 23 | set(ament_cmake_copyright_FOUND TRUE) 24 | # the following line skips cpplint (only works in a git repo) 25 | # comment the line when this package is in a git repo and when 26 | # a copyright and license is added to all source files 27 | set(ament_cmake_cpplint_FOUND TRUE) 28 | ament_lint_auto_find_test_dependencies() 29 | endif() 30 | 31 | ament_package() 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Gabrael Levine 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /launch/view_robot.launch.py: -------------------------------------------------------------------------------- 1 | import os 2 | from launch import LaunchDescription 3 | from launch.actions import DeclareLaunchArgument 4 | from launch.conditions import IfCondition, UnlessCondition 5 | from launch.substitutions import Command, LaunchConfiguration 6 | from launch_ros.actions import Node 7 | from launch_ros.substitutions import FindPackageShare 8 | 9 | def generate_launch_description(): 10 | 11 | # Set the path to this package. 12 | pkg_share = FindPackageShare(package='rhea_description').find('rhea_description') 13 | 14 | # Set the path to the RViz configuration settings 15 | default_rviz_config_path = os.path.join(pkg_share, 'rviz/rviz_basic_settings.rviz') 16 | 17 | # Set the path to the URDF file 18 | default_urdf_model_path = os.path.join(pkg_share, 'description/rhea.urdf.xacro') 19 | 20 | ########### YOU DO NOT NEED TO CHANGE ANYTHING BELOW THIS LINE ############## 21 | # Launch configuration variables specific to simulation 22 | gui = LaunchConfiguration('gui') 23 | urdf_model = LaunchConfiguration('urdf_model') 24 | rviz_config_file = LaunchConfiguration('rviz_config_file') 25 | use_robot_state_pub = LaunchConfiguration('use_robot_state_pub') 26 | use_rviz = LaunchConfiguration('use_rviz') 27 | use_sim_time = LaunchConfiguration('use_sim_time') 28 | 29 | # Declare the launch arguments 30 | declare_urdf_model_path_cmd = DeclareLaunchArgument( 31 | name='urdf_model', 32 | default_value=default_urdf_model_path, 33 | description='Absolute path to robot urdf file') 34 | 35 | declare_rviz_config_file_cmd = DeclareLaunchArgument( 36 | name='rviz_config_file', 37 | default_value=default_rviz_config_path, 38 | description='Full path to the RVIZ config file to use') 39 | 40 | declare_use_joint_state_publisher_cmd = DeclareLaunchArgument( 41 | name='gui', 42 | default_value='True', 43 | description='Flag to enable joint_state_publisher_gui') 44 | 45 | declare_use_robot_state_pub_cmd = DeclareLaunchArgument( 46 | name='use_robot_state_pub', 47 | default_value='True', 48 | description='Whether to start the robot state publisher') 49 | 50 | declare_use_rviz_cmd = DeclareLaunchArgument( 51 | name='use_rviz', 52 | default_value='True', 53 | description='Whether to start RVIZ') 54 | 55 | declare_use_sim_time_cmd = DeclareLaunchArgument( 56 | name='use_sim_time', 57 | default_value='True', 58 | description='Use simulation (Gazebo) clock if true') 59 | 60 | # Specify the actions 61 | 62 | # # Publish the joint state values for the non-fixed joints in the URDF file. 63 | start_joint_state_publisher_cmd = Node( 64 | condition=UnlessCondition(gui), 65 | package='joint_state_publisher', 66 | executable='joint_state_publisher', 67 | name='joint_state_publisher') 68 | 69 | # # A GUI to manipulate the joint state values 70 | start_joint_state_publisher_gui_node = Node( 71 | condition=IfCondition(gui), 72 | package='joint_state_publisher_gui', 73 | executable='joint_state_publisher_gui', 74 | name='joint_state_publisher_gui') 75 | 76 | # Subscribe to the joint states of the robot, and publish the 3D pose of each link. 77 | start_robot_state_publisher_cmd = Node( 78 | condition=IfCondition(use_robot_state_pub), 79 | package='robot_state_publisher', 80 | executable='robot_state_publisher', 81 | parameters=[{'use_sim_time': use_sim_time, 82 | 'robot_description': Command(['xacro ', urdf_model])}], 83 | arguments=[default_urdf_model_path]) 84 | 85 | # Launch RViz 86 | start_rviz_cmd = Node( 87 | condition=IfCondition(use_rviz), 88 | package='rviz2', 89 | executable='rviz2', 90 | name='rviz2', 91 | output='screen', 92 | arguments=['-d', rviz_config_file]) 93 | 94 | 95 | # Create the launch description and populate 96 | ld = LaunchDescription() 97 | 98 | # Declare the launch options 99 | ld.add_action(declare_urdf_model_path_cmd) 100 | ld.add_action(declare_rviz_config_file_cmd) 101 | ld.add_action(declare_use_joint_state_publisher_cmd) 102 | ld.add_action(declare_use_robot_state_pub_cmd) 103 | ld.add_action(declare_use_rviz_cmd) 104 | ld.add_action(declare_use_sim_time_cmd) 105 | 106 | # Add any actions 107 | ld.add_action(start_joint_state_publisher_cmd) 108 | ld.add_action(start_joint_state_publisher_gui_node) 109 | ld.add_action(start_robot_state_publisher_cmd) 110 | ld.add_action(start_rviz_cmd) 111 | 112 | return ld 113 | -------------------------------------------------------------------------------- /description/urdf/rhea.urdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /description/rhea.ros2_control.xacro: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | pi3hat_hardware_interface/Pi3HatHardwareInterface 8 | -90.0 9 | 0.0 10 | 90.0 11 | 12 | 13 | 14 | 3 15 | 1 16 | cheetah 17 | 18 | 95.5 19 | 30.0 20 | 18.0 21 | 500.0 22 | 5.0 23 | -1 24 | -2.46091 25 | 26 | -2.46091 27 | 0.68068 28 | 10.0 29 | 10.0 30 | 100.0 31 | 10.0 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 1 46 | 2 47 | cheetah 48 | 49 | 95.5 50 | 30.0 51 | 18.0 52 | 500.0 53 | 5.0 54 | -1 55 | 2.75762 56 | 57 | 0.66323 58 | 2.75762 59 | 10.0 60 | 10.0 61 | 100.0 62 | 10.0 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 1 77 | 3 78 | cheetah 79 | 80 | 12.5 81 | 200.0 82 | 18.0 83 | 500.0 84 | 5.0 85 | 1 86 | 0.0 87 | 88 | -1.0 89 | 1.0 90 | 30.0 91 | 10.0 92 | 100.0 93 | 2.0 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 3 108 | 4 109 | cheetah 110 | 111 | 95.5 112 | 30.0 113 | 18.0 114 | 500.0 115 | 5.0 116 | -1 117 | 2.46091 118 | 119 | -0.68068 120 | 2.46091 121 | 10.0 122 | 10.0 123 | 100.0 124 | 10.0 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 2 139 | 5 140 | cheetah 141 | 142 | 95.5 143 | 30.0 144 | 18.0 145 | 500.0 146 | 5.0 147 | -1 148 | -2.75762 149 | 150 | -2.75762 151 | -0.66323 152 | 10.0 153 | 10.0 154 | 100.0 155 | 10.0 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 2 170 | 6 171 | cheetah 172 | 173 | 12.5 174 | 200.0 175 | 18.0 176 | 500.0 177 | 5.0 178 | 1 179 | 0.0 180 | 181 | -1.0 182 | 1.0 183 | 30.0 184 | 2.0 185 | 100.0 186 | 10.0 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | --------------------------------------------------------------------------------