On this page
Nav2 Stack(odom)
official guide: https://docs.nav2.org/setup_guides/odom/setup_odom.html
TODO: add gazebo portion
ROS2 control
sudo apt install ros-humble-ros2-control ros-humble-ros2-controllers ros-foxy-humble-ros2-control
sudo apt-get install libserialport-dev
Good resource that explains ROS2 control: https://articulaandtedrobotics.xyz/tutorials/mobile-robot/applications/ros2_control-concepts
Nodes we are adding:
control_node | |
---|---|
robot_controller_spawner | |
joint_state_broadcaster |
add to ros2 control to urdf
Add control setting file in config folder
update setup.py and run
import os
from glob import glob
from setuptools import find_packages, setup
package_name = 'mbot_pkg'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name, 'urdf'), glob('urdf/*.urdf')),
(os.path.join('share', package_name, 'rviz'), glob('rviz/*.rviz*')),
(os.path.join('share', package_name), glob('launch/*launch.[pxy][yma]*')),
(os.path.join('share', package_name, 'config'), glob('config/*.yaml*')),
],
update display.launch.py file
TODO:
import launch
from launch.substitutions import Command, LaunchConfiguration
import launch_ros
import os
def generate_launch_description():
pkg_share = launch_ros.substitutions.FindPackageShare(package='mbot_pkg').find('mbot_pkg')
default_model_path = os.path.join(pkg_share, 'urdf/mbot_description.urdf')
default_rviz_config_path = os.path.join(pkg_share, 'rviz/urdf_config.rviz')
robot_controllers = os.path.join(pkg_share, "config/my_controllers.yaml")
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',
arguments=[default_model_path], #Add this line
#parameters=[{'robot_description': Command(['xacro ', default_model_path])}], #Remove this line
#condition=launch.conditions.UnlessCondition(LaunchConfiguration('gui')) #Remove this line
)
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')],
)
control_node = launch_ros.actions.Node(
package="controller_manager",
executable="ros2_control_node",
parameters=[
{'robot_description': Command(['xacro ', default_model_path])}, #FIXME: this should not be here
robot_controllers],
output="both",
remappings=[
("/diffbot_base_controller/cmd_vel", "/cmd_vel"),
]
)
robot_controller_spawner = launch_ros.actions.Node(
package="controller_manager",
executable="spawner",
arguments=["diffbot_base_controller", "--param-file", robot_controllers],
)
# Delay start of joint_state_broadcaster after `robot_controller`
# TODO(anyone): This is a workaround for flaky tests. Remove when fixed.
delay_joint_state_broadcaster_after_robot_controller_spawner = RegisterEventHandler(
event_handler=OnProcessExit(
target_action=robot_controller_spawner,
on_exit=[joint_state_broadcaster_spawner],
)
)
# Delay rviz start after `joint_state_broadcaster`
delay_rviz_after_joint_state_broadcaster_spawner = RegisterEventHandler(
event_handler=OnProcessExit(
target_action=joint_state_broadcaster_spawner,
on_exit=[rviz_node],
)
)
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,
control_node,
robot_controller_spawner,
delay_joint_state_broadcaster_after_robot_controller_spawner,
delay_rviz_after_joint_state_broadcaster_spawner,
#rviz_node
])
if you have a pi pico and RPLidar then this part applies to you
pi pico pkg
run:
colcon build --symlink-install
ros2 launch mbot_pkg display.launch.py
Note: if your robot does not connect to your WSL go back to:
lidar
update the urdf
<link name="lidar_link">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0" />
<mass value="0.125" />
<inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" />
</inertial>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="0.0508" length="0.055" />
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="0.0508" length="0.055" />
</geometry>
</visual>
</link>
<joint name="lidar_joint" type="fixed">
<parent link="base_link" />
<child link="lidar_link" />
<origin xyz="0.0416 0 0.12" rpy="0 0 ${pi}" />
</joint>
update launch file
lidar_node = launch_ros.actions.Node(
package='sllidar_ros2',
executable='sllidar_node',
name='sllidar_node',
parameters=[{'channel_type': 'serial',
'serial_port': '/dev/ttyUSB0',
'serial_baudrate': 115200,
'frame_id': 'lidar_link',#'laser',
'inverted': False,
'angle_compensate': True,
'scan_mode': 'Boost'}],
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'),
joint_state_publisher_node,
# joint_state_publisher_gui_node,
robot_state_publisher_node,
control_node,
robot_controller_spawner,
lidar_node,
delay_joint_state_broadcaster_after_robot_controller_spawner,
delay_rviz_after_joint_state_broadcaster_spawner,
# rviz_node
])
package link: https://github.com/Slamtec/sllidar_ros2
run guide: https://github.com/robopeak/rplidar_ros/wiki
sudo chmod 777 /dev/ttyUSB0
to debug run:
ros2 launch sllidar_ros2 view_sllidar_a1_launch.py