ros2 pkg create --build-type ament_cmake my_pkg_cpp_urdf
my_robot_05.urdf
<?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://ros.org/wiki/xacro"> <!-- Define robot constants --> <xacro:property name="base_width" value="0.31"/> <xacro:property name="base_length" value="0.42"/> <xacro:property name="base_height" value="0.18"/> <xacro:property name="wheel_radius" value="0.10"/> <xacro:property name="wheel_width" value="0.04"/> <xacro:property name="wheel_ygap" value="0.025"/> <xacro:property name="wheel_zoff" value="0.05"/> <xacro:property name="wheel_xoff" value="0.12"/> <xacro:property name="caster_xoff" value="0.14"/> <!-- Robot Base --> <link name="base_link"> <visual> <geometry> <box size="${base_length} ${base_width} ${base_height}"/> </geometry> <material name="Cyan"> <color rgba="0 1.0 1.0 1.0"/> </material> </visual> </link> <!-- Robot Footprint --> <link name="base_footprint"/> <joint name="base_joint" type="fixed"> <parent link="base_link"/> <child link="base_footprint"/> <origin xyz="0.0 0.0 ${-(wheel_radius+wheel_zoff)}" rpy="0 0 0"/> </joint> <!-- Wheels --> <xacro:macro name="wheel" params="prefix x_reflect y_reflect"> <link name="${prefix}_link"> <visual> <origin xyz="0 0 0" rpy="${pi/2} 0 0"/> <geometry> <cylinder radius="${wheel_radius}" length="${wheel_width}"/> </geometry> <material name="Gray"> <color rgba="0.5 0.5 0.5 1.0"/> </material> </visual> </link> <joint name="${prefix}_joint" type="continuous"> <parent link="base_link"/> <child link="${prefix}_link"/> <origin xyz="${x_reflect*wheel_xoff} ${y_reflect*(base_width/2+wheel_ygap)} ${-wheel_zoff}" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> </xacro:macro> <xacro:wheel prefix="drivewhl_l" x_reflect="-1" y_reflect="1" /> <xacro:wheel prefix="drivewhl_r" x_reflect="-1" y_reflect="-1" /> <!-- Caster Wheel --> <link name="front_caster"> <visual> <geometry> <sphere radius="${(wheel_radius+wheel_zoff-(base_height/2))}"/> </geometry> <material name="Cyan"> <color rgba="0 1.0 1.0 1.0"/> </material> </visual> </link> <joint name="caster_joint" type="fixed"> <parent link="base_link"/> <child link="front_caster"/> <origin xyz="${caster_xoff} 0.0 ${-(base_height/2)}" rpy="0 0 0"/> </joint> </robot> |
my_display.launch.py
import launch from launch.substitutions import Command, LaunchConfiguration import launch_ros import os def generate_launch_description(): pkg_share = launch_ros.substitutions.FindPackageShare(package='my_pkg_cpp_urdf').find('my_pkg_cpp_urdf') default_model_path = os.path.join(pkg_share, 'urdf/my_robot_05.urdf') default_rviz_config_path = os.path.join(pkg_share, 'rviz/urdf_config.rviz') robot_state_publisher_node = launch_ros.actions.Node( package='robot_state_publisher', executable='robot_state_publisher', parameters=[{'robot_description': Command(['xacro ', LaunchConfiguration('model')])}] ) joint_state_publisher_node = launch_ros.actions.Node( package='joint_state_publisher', executable='joint_state_publisher', name='joint_state_publisher', condition=launch.conditions.UnlessCondition(LaunchConfiguration('gui')) ) joint_state_publisher_gui_node = launch_ros.actions.Node( package='joint_state_publisher_gui', executable='joint_state_publisher_gui', name='joint_state_publisher_gui', condition=launch.conditions.IfCondition(LaunchConfiguration('gui')) ) rviz_node = launch_ros.actions.Node( package='rviz2', executable='rviz2', name='rviz2', output='screen', arguments=['-d', LaunchConfiguration('rvizconfig')], ) return launch.LaunchDescription([ launch.actions.DeclareLaunchArgument(name='gui', default_value='True', description='Flag to enable joint_state_publisher_gui'), launch.actions.DeclareLaunchArgument(name='model', default_value=default_model_path, description='Absolute path to robot urdf file'), launch.actions.DeclareLaunchArgument(name='rvizconfig', default_value=default_rviz_config_path, description='Absolute path to rviz config file'), joint_state_publisher_node, joint_state_publisher_gui_node, robot_state_publisher_node, rviz_node ]) |
urdf_config.rviz
Panels: - Class: rviz_common/Displays Help Height: 78 Name: Displays Property Tree Widget: Expanded: - /Global Options1 - /Status1 - /RobotModel1/Links1 - /TF1 Splitter Ratio: 0.5 Tree Height: 557 Visualization Manager: Class: "" Displays: - Alpha: 0.5 Cell Size: 1 Class: rviz_default_plugins/Grid Color: 160; 160; 164 Enabled: true Name: Grid - Alpha: 0.6 Class: rviz_default_plugins/RobotModel Description Topic: Depth: 5 Durability Policy: Volatile History Policy: Keep Last Reliability Policy: Reliable Value: /robot_description Enabled: true Name: RobotModel Visual Enabled: true - Class: rviz_default_plugins/TF Enabled: true Name: TF Marker Scale: 0.3 Show Arrows: true Show Axes: true Show Names: 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 Transformation: Current: Class: rviz_default_plugins/TF Value: true Views: Current: Class: rviz_default_plugins/Orbit Name: Current View Target Frame: <Fixed Frame> Value: Orbit (rviz) Saved: ~ |
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) project(my_pkg_cpp_urdf) # Default to C99 if(NOT CMAKE_C_STANDARD) set(CMAKE_C_STANDARD 99) endif() # Default to C++14 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) # uncomment the following section in order to fill in # further dependencies manually. # find_package(<dependency> REQUIRED) install( DIRECTORY urdf launch rviz DESTINATION share/${PROJECT_NAME} ) if(BUILD_TESTING) find_package(ament_lint_auto REQUIRED) # the following line skips the linter which checks for copyrights # uncomment the line when a copyright and license is not present in all source files #set(ament_cmake_copyright_FOUND TRUE) # the following line skips cpplint (only works in a git repo) # uncomment the line when this package is not in a git repo #set(ament_cmake_cpplint_FOUND TRUE) ament_lint_auto_find_test_dependencies() endif() ament_package() |
pakage.xml
<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="3"> <name>my_pkg_cpp_urdf</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="ubuntu@todo.todo">ubuntu</maintainer> <license>TODO: License declaration</license> <buildtool_depend>ament_cmake</buildtool_depend> <exec_depend>joint_state_publisher</exec_depend> <exec_depend>joint_state_publisher_gui</exec_depend> <exec_depend>robot_state_publisher</exec_depend> <exec_depend>rviz</exec_depend> <exec_depend>xacro</exec_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_cmake</build_type> </export> </package> |
Reference
[1] https://navigation.ros.org/setup_guides/urdf/setup_urdf.html
Setting Up The URDF — Navigation 2 1.0.0 documentation
Setting Up The URDF For this guide, we will be creating the Unified Robot Description Format (URDF) file for a simple differential drive robot to give you hands-on experience on working with URDF. We will also setup the robot state publisher and visualize
navigation.ros.org
[2] https://github.com/ros/urdf_tutorial.git
GitHub - ros/urdf_tutorial
Contribute to ros/urdf_tutorial development by creating an account on GitHub.
github.com
[3] https://github.com/ros-planning/navigation2_tutorials
GitHub - ros-planning/navigation2_tutorials: Tutorial code referenced in https://navigation.ros.org/
Tutorial code referenced in https://navigation.ros.org/ - GitHub - ros-planning/navigation2_tutorials: Tutorial code referenced in https://navigation.ros.org/
github.com
urdf - ROS Wiki
melodic noetic Show EOL distros: EOL distros: electric fuerte groovy hydro indigo jade kinetic lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in
wiki.ros.org
[5] http://wiki.ros.org/robot_state_publisher
robot_state_publisher - ROS Wiki
melodic noetic Show EOL distros: EOL distros: electric fuerte groovy hydro indigo jade kinetic lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in
wiki.ros.org
'ROS > ROS2Foxy' 카테고리의 다른 글
ROS2 Multi-Machines for RPi4B and WSL2 (0) | 2022.06.23 |
---|---|
URDF using gazebo (0) | 2022.06.17 |
Static Transform Publisher using TF2 (0) | 2022.06.17 |
URDF using rviz2 (0) | 2022.06.09 |
ros2 launch pkg ~.launch.py (0) | 2022.06.06 |