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_07.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')], ) spawn_entity = launch_ros.actions.Node( package='gazebo_ros', executable='spawn_entity.py', arguments=['-entity', 'my_robot', '-topic', 'robot_description'], output='screen' ) 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'), launch.actions.ExecuteProcess(cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_init.so', '-s', 'libgazebo_ros_factory.so'], output='screen'), joint_state_publisher_node, # joint_state_publisher_gui_node, robot_state_publisher_node, spawn_entity, rviz_node ]) |
my_robot_07.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"/> <!-- Define some commonly used intertial properties --> <xacro:macro name="box_inertia" params="m w h d"> <inertial> <origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/> <mass value="${m}"/> <inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/> </inertial> </xacro:macro> <xacro:macro name="cylinder_inertia" params="m r h"> <inertial> <origin xyz="0 0 0" rpy="${pi/2} 0 0" /> <mass value="${m}"/> <inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy = "0" ixz = "0" iyy="${(m/12) * (3*r*r + h*h)}" iyz = "0" izz="${(m/2) * (r*r)}"/> </inertial> </xacro:macro> <xacro:macro name="sphere_inertia" params="m r"> <inertial> <mass value="${m}"/> <inertia ixx="${(2/5) * m * (r*r)}" ixy="0.0" ixz="0.0" iyy="${(2/5) * m * (r*r)}" iyz="0.0" izz="${(2/5) * m * (r*r)}"/> </inertial> </xacro:macro> <!-- 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> <collision> <geometry> <box size="${base_length} ${base_width} ${base_height}"/> </geometry> </collision> <xacro:box_inertia m="15" w="${base_width}" d="${base_length}" h="${base_height}"/> </link> <!-- Robot Footprint --> <link name="base_footprint"> <xacro:box_inertia m="0" w="0" d="0" h="0"/> </link> <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> <collision> <origin xyz="0 0 0" rpy="${pi/2} 0 0"/> <geometry> <cylinder radius="${wheel_radius}" length="${wheel_width}"/> </geometry> </collision> <xacro:cylinder_inertia m="0.5" r="${wheel_radius}" h="${wheel_width}"/> </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" /> <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> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <sphere radius="${(wheel_radius+wheel_zoff-(base_height/2))}"/> </geometry> </collision> <xacro:sphere_inertia m="0.5" r="${(wheel_radius+wheel_zoff-(base_height/2))}"/> </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> <link name="imu_link"> <visual> <geometry> <box size="0.1 0.1 0.1"/> </geometry> </visual> <collision> <geometry> <box size="0.1 0.1 0.1"/> </geometry> </collision> <xacro:box_inertia m="0.1" w="0.1" d="0.1" h="0.1"/> </link> <joint name="imu_joint" type="fixed"> <parent link="base_link"/> <child link="imu_link"/> <origin xyz="0 0 0.01"/> </joint> <gazebo reference="imu_link"> <sensor name="imu_sensor" type="imu"> <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"> <ros> <namespace>/demo</namespace> <remapping>~/out:=imu</remapping> </ros> <initial_orientation_as_reference>false</initial_orientation_as_reference> </plugin> <always_on>true</always_on> <update_rate>100</update_rate> <visualize>true</visualize> <imu> <angular_velocity> <x> <noise type="gaussian"> <mean>0.0</mean> <stddev>2e-4</stddev> <bias_mean>0.0000075</bias_mean> <bias_stddev>0.0000008</bias_stddev> </noise> </x> <y> <noise type="gaussian"> <mean>0.0</mean> <stddev>2e-4</stddev> <bias_mean>0.0000075</bias_mean> <bias_stddev>0.0000008</bias_stddev> </noise> </y> <z> <noise type="gaussian"> <mean>0.0</mean> <stddev>2e-4</stddev> <bias_mean>0.0000075</bias_mean> <bias_stddev>0.0000008</bias_stddev> </noise> </z> </angular_velocity> <linear_acceleration> <x> <noise type="gaussian"> <mean>0.0</mean> <stddev>1.7e-2</stddev> <bias_mean>0.1</bias_mean> <bias_stddev>0.001</bias_stddev> </noise> </x> <y> <noise type="gaussian"> <mean>0.0</mean> <stddev>1.7e-2</stddev> <bias_mean>0.1</bias_mean> <bias_stddev>0.001</bias_stddev> </noise> </y> <z> <noise type="gaussian"> <mean>0.0</mean> <stddev>1.7e-2</stddev> <bias_mean>0.1</bias_mean> <bias_stddev>0.001</bias_stddev> </noise> </z> </linear_acceleration> </imu> </sensor> </gazebo> <gazebo> <plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'> <ros> <namespace>/demo</namespace> </ros> <!-- wheels --> <left_joint>drivewhl_l_joint</left_joint> <right_joint>drivewhl_r_joint</right_joint> <!-- kinematics --> <wheel_separation>0.4</wheel_separation> <wheel_diameter>0.2</wheel_diameter> <!-- limits --> <max_wheel_torque>20</max_wheel_torque> <max_wheel_acceleration>1.0</max_wheel_acceleration> <!-- output --> <publish_odom>true</publish_odom> <publish_odom_tf>false</publish_odom_tf> <publish_wheel_tf>true</publish_wheel_tf> <odometry_frame>odom</odometry_frame> <robot_base_frame>base_link</robot_base_frame> </plugin> </gazebo> </robot> |
package.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> |
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() |
Reference
[1] https://navigation.ros.org/setup_guides/odom/setup_odom.html
Setting Up Odometry — Navigation 2 1.0.0 documentation
Setting Up Odometry In this guide, we will be looking at how to integrate our robot’s odometry system with Nav2. First we will provide a brief introduction on odometry, plus the necessary messages and transforms that need to be published for Nav2 to func
navigation.ros.org
'ROS > ROS2Foxy' 카테고리의 다른 글
Xacro to reduce the code of URDF (0) | 2022.06.29 |
---|---|
ROS2 Multi-Machines for RPi4B and WSL2 (0) | 2022.06.23 |
URDF using xacro (0) | 2022.06.17 |
Static Transform Publisher using TF2 (0) | 2022.06.17 |
URDF using rviz2 (0) | 2022.06.09 |