目录
1 urdf
1.1 创建urdf文件
1.2 配置setup.py文件
2 urdf模型发布
2.1 手动状态发布
2.1.1 安装 joint_state_publisher
2.1.2 状态发布
编辑
2.2 基于手动命令封装launch文件启动
2.2.1 创建文件
2.2.2 添加到setup.py
2.2.3 编辑launch文件
3 Rviz2
3.1 rviz2 的坐标系
3.2 robotModel组件
4 rqt展示
4.1 流程
4.2 话题格式
1 urdf
urdf采用xml的格式进行编写,可使用ai辅助创建一个urdf的demo,看着学。
1.1 创建urdf文件
1)在包目录下创建urdf文件夹,用于管理urdf文件
2)在urdf文件夹下创建urdf文件,以.urdf后缀名结尾
3)编写urdf文件
我这里是python的包
urdf demo:用大模型生成的一个具有一个万向轮,两个动力轮的小车
<?xml version="1.0"?> <robot name="my_first_robot"> <!-- ================= 材质定义 ================= --> <material name="blue"> <color rgba="0 0 0.8 1"/> </material> <material name="white"> <color rgba="1 1 1 1"/> </material> <material name="black"> <color rgba="0 0 0 1"/> </material> <!-- ================= 链接 (Links) ================= --> <!-- 1. 底盘 (Base Link) --> <link name="base_link"> <visual> <geometry> <box size="0.6 0.4 0.2"/> <!-- 长0.6m, 宽0.4m, 高0.2m --> </geometry> <origin xyz="0 0 0.1" rpy="0 0 0"/> <!-- 几何中心向上偏移,使坐标原点在底部中心 --> <material name="blue"/> </visual> <collision> <geometry> <box size="0.6 0.4 0.2"/> </geometry> <origin xyz="0 0 0.1"/> </collision> <!-- <inertial> <mass value="5.0"/> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> --> </link> <!-- 2. 左轮 (Left Wheel) --> <link name="left_wheel"> <visual> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> <!-- 旋转90度使圆柱体变为轮子形状 --> <material name="black"/> </visual> <collision> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> </collision> <inertial> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/> </inertial> </link> <!-- 3. 右轮 (Right Wheel) --> <link name="right_wheel"> <visual> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> <material name="black"/> </visual> <collision> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> </collision> <inertial> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/> </inertial> </link> <!-- 4. 万向轮 (Caster Wheel) --> <link name="caster_wheel"> <visual> <geometry> <sphere radius="0.05"/> </geometry> <material name="white"/> </visual> <collision> <geometry> <sphere radius="0.05"/> </geometry> </collision> <inertial> <mass value="0.5"/> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/> </inertial> </link> <!-- ================= 关节 (Joints) ================= --> <!-- 连接左轮 --> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel"/> <origin xyz="-0.2 0.225 0.05" rpy="0 0 0"/> <!-- 位置:后方左侧 --> <axis xyz="0 1 0"/> <!-- 绕Y轴旋转 --> </joint> <!-- 连接右轮 --> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel"/> <origin xyz="-0.2 -0.225 0.05" rpy="0 0 0"/> <!-- 位置:后方右侧 --> <axis xyz="0 1 0"/> </joint> <!-- 连接万向轮 --> <joint name="caster_joint" type="fixed"> <parent link="base_link"/> <child link="caster_wheel"/> <origin xyz="0.25 0 0.0" rpy="0 0 0"/> <!-- 位置:前方中心 --> </joint> </robot>1.2 配置setup.py文件
python的包和cpp的包不同,python的包设置setup.py,cpp的包设置cmake文件
python版本:新增一条拷贝命令
data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # 将 urdf 文件夹安装到 share 目录下 ('share/' + package_name + '/urdf', glob('urdf/*')), ],编译完成后,在install目录下具有urdf文件
2 urdf模型发布
2.1 手动状态发布
使用robot_state_publisher和joint_state_publisher_gui/joint_state_publisher进行状态发布
默认robot_state_publisher已经安装,joint_state_publisher没有安装。
2.1.1 安装 joint_state_publisher
安装joint_state_publisher,安装gui版本时,robot_state_publish会一起被安装。
joint_state_publisher_gui:具有图形化,可进行手动调整关节角度
joint_state_publisher:不具有图形化
#ubuntu apt install ros-<distro>-joint-state-publisher-gui # apt install ros-humble-joint-state-publisher-gui #conda环境 conda install ros-humble-joint-state-publisher-gui2.1.2 状态发布
# 发布机器人模型,通过-p设置cat读取的urdf robot_description参数 ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat ./install/pkg_image/share/pkg_image/urdf/demo_urdf.urdf)" # 发布关节运动状态,不发布的话,机器人的运动状态无法监听 ros2 run joint_state_publisher_gui joint_state_publisher_gui2.2 基于手动命令封装launch文件启动
2.2.1 创建文件
2.2.2 添加到setup.py
data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # 将 urdf 文件夹安装到 share 目录下 ('share/' + package_name + '/urdf', glob('urdf/*')), ('share/' + package_name + '/launch', glob('launch/*')), ('share/' + package_name + '/rviz2', glob('rviz2/*')), ],2.2.3 编辑launch文件
from launch import LaunchDescription from launch_ros.actions import Node as LaunchNode #命令替换 from launch.substitutions import Command #python索引,获取包的share目录 from ament_index_python.packages import get_package_share_directory def generate_launch_description(): # 1 robot_state_publisher ## 读取urdf文件 robot_description = Command("cat " + get_package_share_directory("pkg_image") + "/urdf/demo_urdf.urdf") robot_state_publisher = LaunchNode( package='robot_state_publisher', executable='robot_state_publisher', name='robot_state_publisher', parameters=[{ 'robot_description': robot_description, }], ) # 2 joint_state_publisher_gui joint_state_publisher = LaunchNode( package='joint_state_publisher_gui', executable='joint_state_publisher_gui', name='joint_state_publisher_gui', ) # 3 rviz2 文件通过rviz2另存 rviz2_config = get_package_share_directory("pkg_image") + "/rviz2/demo.rviz" rviz2 = LaunchNode( package='rviz2', executable='rviz2', name='rviz2', arguments=['-d', rviz2_config], ) return LaunchDescription([robot_state_publisher,joint_state_publisher,rviz2])3 Rviz2
3.1 rviz2 的坐标系
采用右手坐标系
x:正向指向前 红:前后
y:正向指向左 绿:左右
z:正向指向上 蓝:上下
3.2 robotModel组件
只有robot_state_publisher和joint_state_publisher/joint_state_publisher_gui进行了发布才可以。
如果joint_state_publisher不进行发布,无法获取动态数据,左右轮由于在urdf中设置格式为可持续旋转,因此这个两个关节会解析报错。
4 rqt展示
4.1 流程
1 robot_state_publisher 发布/robot_description话题
2 joint_state_publisher订阅/robot_description,并获取关节信息。可通过驱动或gui设置关节状态
3 joint_state_publisher 发布joint_states信息
4 robot_state_publisher 计算实时/tf信息
5 robot_state_publisher 发布实时/tf信息
6 rviz2 robotModel:订阅/robot_description显示静态模型信息,订阅/tf显示动态运动信息。