前言:本人新学小白,实践做个记录笔记,如有侵权,请联系删除。
1.建立工作空间
mkdir z1_ws
cd z1_ws
mkdir src
cd src
ros2 pkg create z1_description --build-type ament_python
2. 建立urdf文件夹,并导入urdf文件
cd z1_description
mkdir urdf
cd urdf
touch z1_base.urdf
将模型urdf文件复制到z1_base.urdf文件中
3.建立meshes文件夹,并将meshes文件复制放入
cd ..
mkdir meshes
4.建立并编写launch文件
将命令退回到z1_description内
mkdir launch
cd launch
touch z1_rviz2.launch.py
编写z1_rviz2.launch.py文件
import os
from launch import LaunchDescription
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
def generate_launch_description():
package_name = 'z1_description'
urdf_name = "z1_base.urdf"
ld = LaunchDescription()
#用于描述一组要同时启动的ROS 2组件(节点、服务等)及其配置。
pkg_share = FindPackageShare(package=package_name).find(package_name)
#FindPackageShare是ament_index_python库提供的一个工具,用于定位ROS 2包的共享资源目录。
#这通常包括包的share目录,其中可能包含URDF文件、配置文件、启动文件等。
urdf_model_path = os.path.join(pkg_share, f'urdf/{urdf_name}')
#这行代码使用os.path.join函数来构建URDF文件的完整路径。
#pkg_share: 是从FindPackageShare获取的包的share目录路径。
#f'urdf/{urdf_name}': 是一个格式化字符串,其中urdf_name应该是一个变量,存储了URDF文件的名称(不包括扩展名,通常是.urdf或.urdf.xacro)。
#这个字符串指定了相对于share目录的URDF文件的位置。
#joint_state_publisher_gui 负责发布机器人关节数据信息,通过joint_states话题发布
#robot_state_publisher_node负责发布机器人模型信息robot_description,并将joint_states数据转换tf信息发布
#rviz2_node负责显示机器人的信息。
robot_state_publisher_node = Node(
package='robot_state_publisher', # 指定节点的 ROS 包名
executable='robot_state_publisher', # 指定节点的可执行文件名
arguments=[urdf_model_path] # 传递给节点的命令行参数,这里是 URDF 文件的路径
)
joint_state_publisher_node = Node(
package='joint_state_publisher_gui',
executable='joint_state_publisher_gui',
name='joint_state_publisher_gui',
arguments=[urdf_model_path]
)
rviz2_node = Node(
package='rviz2',
executable='rviz2',
name='rviz2',
output='screen',
)
# 将节点添加到 LaunchDescription 对象中
ld.add_action(robot_state_publisher_node)
ld.add_action(joint_state_publisher_node)
ld.add_action(rviz2_node)
# 返回 LaunchDescription 对象
return ld
安装joint_state_publisher_gui
和robot_state_publisher
两个包
sudo apt install ros-$ROS_DISTRO-joint-state-publisher-gui ros-$ROS_DISTRO-robot-state-publisherCopy to clipboardErrorCopied
5. 修改setup.py
from glob import glob
import os
from setuptools import find_packages, setup
package_name = 'z1_description'
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, 'launch'), glob('launch/*.launch.py')),
(os.path.join('share', package_name, 'urdf'), glob('urdf/**')),
('share/' + package_name + '/meshes/visual', [
'meshes/visual/z1_Link00.dae',
'meshes/visual/z1_Link01.dae',
'meshes/visual/z1_Link02.dae',
'meshes/visual/z1_Link03.dae',
'meshes/visual/z1_Link04.dae',
'meshes/visual/z1_Link05.dae',
'meshes/visual/z1_Link06.dae',
]),
('share/' + package_name + '/meshes/collision', [
'meshes/collision/z1_Link00.STL',
'meshes/collision/z1_Link01.STL',
'meshes/collision/z1_Link02.STL',
'meshes/collision/z1_Link03.STL',
'meshes/collision/z1_Link04.STL',
'meshes/collision/z1_Link05.STL',
'meshes/collision/z1_Link06.STL',
]),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='song',
maintainer_email='song@todo.todo',
description='TODO: Package description',
license='TODO: License declaration',
tests_require=['pytest'],
entry_points={
'console_scripts': [
],
},
)
6.编译并运行
退回到工作空间再编译运行
colcon build
source install/setup.bash
ros2 launch z1_description display_rviz2.launch.py
运行结果
修改一
修改二
修改三:点击左下角的Add,增加RobotModel.
修改四:修改左边新加入的RobotModel中的Description.
模型已经显现出来了。