1.前言

本人目前初学ros2,最近在实践ros2中的gazebo仿真,入门跟着鱼香ros老师和古月居老师来学习相关的知识,在gazebo仿真环节,发现教程里基本都是采用自写urdf来生成几何图像(圆柱、立方体)来组成简单的机器人,因此在后期仿真的真实性带来了一定的局限性,因此我最近在研究如何在ros2中成功的将Solidworks生成的urdf模型导入到gazebo中打开。

 在本文主要介绍在实践过程中遇到的问题,解决办法,以及整个流程,希望对大家有所帮助!

2.从Solidworks生成urdf模型

本节不过多讲解如何在Solidworks生成urdf模型,详细的可以参考以下我搜索到的文章生成urdf

这是生成的模型的完整的文件夹:

主要检查你的meshes文件夹是否包含了你所有的零件。

3.准备工作:urdf进入ros2中

拿到从SolidWork导出的urdf、meshes文件夹后,建立一个软件包,首先新建一个空白文件夹

我这里的文件夹名字为robot,随后新建一个src的文件夹,在此文件夹下新建一个Python的功能包

ros2 pkg create mybot_description --build-type ament_python

随后将你的生成的模型文件导入进该功能包之中,并且切记一定要更新以下urdf文件里的路径。

这里我们直接编译

colcon build

3.1 开始检验一下urdf模型(这一节是在学习过程中新学的,或许可能是关键)

检验urdf模型最后是否能够在gazebo里顺利的打开,我在别的博客里发现了这样一个工具Moveit,这个主要是用在机械臂的规划可能比较多,因为我这次仿真的主要是车,可能比较通用,所以有些配置可以暂时按照默认的配置去完成。

首先需要下载好MoveIt2,

sudo apt install ros-humble-moveit
sudo apt install ros-humble-moveit-setup-assistant

下载好后回到自己新建的工作空间,source一下,运行MoveIt2来配置一下。

$ source install/setup.sh 
$  ros2 run moveit_setup_assistant moveit_setup_assistant

详细配置可以参考教程鱼香ROS到这一步,如果右侧显示出没有正常的显示出来你所要的模型,那你需要检查一下你的setup.py文件是否把你新增的文件编译到install,还有开头的头文件。

直接跳转到生成功能包,我们学习其他博主,新建一个新的文件夹,mybot1

生成的包如下:

我第一次生成的时候缺少了这个玩意,然后我重新生成了一边就有了。

这里说一下注意细节,因为我最开始配置urdf习惯性的把所有的joint里都配置成fixed,造成了我在这一步生成的功能包无法正常的运行,还有不知道是不是邮箱写的不规范,,后来我把几个轮子改成了转动,就能正常的运行demo.py。

这里生成完毕后编译,运行demo.launch.py文件。

1.$ source install/setup.sh 
2.$ ros2 run moveit_setup_assistant moveit_setup_assistant

如果操作的没问题,应该能看到你的模型了,到此检查工作完毕,你的模型具备在gazebo打开的潜能!

3.2 开始编写gazebo的launch文件

参考古月居老师的代码,他的是打开xarco文件,我们这里只需要把urdf路径哪里更改成我的形式就行了.

mbot.launch.py

import os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch.actions import DeclareLaunchArgument
from launch_ros.actions import Node

import xacro


def generate_launch_description():

    # Check if we're told to use sim time
    use_sim_time = LaunchConfiguration('use_sim_time')

    # Process the URDF file
    pkg_path = os.path.join(get_package_share_directory('mybot_description'))
    urdf_file = os.path.join(pkg_path, 'urdf', 'mbot_description.urdf')
    robot_description_config = xacro.process_file(urdf_file)
    
    # Create a robot_state_publisher node
    params = {'robot_description': robot_description_config.toxml(), 'use_sim_time': use_sim_time}
    node_robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        parameters=[params]
    )


    # Launch!
    return LaunchDescription([
        DeclareLaunchArgument(
            'use_sim_time',
            default_value='false',
            description='Use sim time if true'),

        node_robot_state_publisher
    ])

gazebo.launch.py(该文件里有环境路径,可自己删掉,或者自己新建一个world文件,导入自己的环境)   

package_name='mybot_description' #<--- CHANGE ME

 world_file_path = 'world/neighborhood.world'

import os

from ament_index_python.packages import get_package_share_directory


from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource

from launch_ros.actions import Node


def generate_launch_description():


    # Include the robot_state_publisher launch file, provided by our own package. Force sim time to be enabled
    # !!! MAKE SURE YOU SET THE PACKAGE NAME CORRECTLY !!!

    package_name='mybot_description' #<--- CHANGE ME
    world_file_path = 'world/neighborhood.world'
    
    pkg_path = os.path.join(get_package_share_directory(package_name))
    world_path = os.path.join(pkg_path, world_file_path)  
    
    # Pose where we want to spawn the robot
    spawn_x_val = '0.0'
    spawn_y_val = '0.0'
    spawn_z_val = '0.0'
    spawn_yaw_val = '0.0'
  
    mbot = IncludeLaunchDescription(
                PythonLaunchDescriptionSource([os.path.join(
                    get_package_share_directory(package_name),'launch','mbot.launch.py'
                )]), launch_arguments={'use_sim_time': 'true', 'world':world_path}.items()
    )

    # Include the Gazebo launch file, provided by the gazebo_ros package
    gazebo = IncludeLaunchDescription(
                PythonLaunchDescriptionSource([os.path.join(
                    get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py')]),
             )

    # Run the spawner node from the gazebo_ros package. The entity name doesn't really matter if you only have a single robot.
    spawn_entity = Node(package='gazebo_ros', executable='spawn_entity.py',
                        arguments=['-topic', 'robot_description',
                                   '-entity', 'mbot',
                                   '-x', spawn_x_val,
                                   '-y', spawn_y_val,
                                   '-z', spawn_z_val,
                                   '-Y', spawn_yaw_val],
                        output='screen')



    # Launch them all!
    return LaunchDescription([
        mbot,
        gazebo,
        spawn_entity,
    ])

随后编译,运行

colcon build
source install/setup.sh 
ros2 launch mybot_description gazebo.launch.py

然后你突然发现:啥也没有

这时候我就看到别的韭菜钟博主的相关文章,解决了这最后的问题,在你的urdf文件里把原先的

   <mesh filename="package://mybot_description/meshes/base_link.STL" />

 替换成

        <mesh filename="file://$(find mybot_description)/meshes/link1.STL" />

再来运行

 4.总结

目前在参加比赛,后续继续需要研究ros2的导航包使用,最终完成我们参赛作品的导航功能,期间会不定时的更新学习的内容。最后感谢黎同学大半夜推送给我相关文章

Logo

更多推荐