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文件里的路径。
(CMakeLists.txt文件有些可能会出问题,在编译的时候有时候会出现问题,需要你自己去网上找一个相关的包来更改下配置内容),这里我们直接编译
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的导航包使用,最终完成我们参赛作品的导航功能,期间会不定时的更新学习的内容。最后感谢黎同学大半夜推送给我相关文章
标签:Solidworks,description,launch,urdf,robot,import,gazebo,ros2 From: https://blog.csdn.net/Sixfourjie/article/details/137407041