建模实践1 —— 手写装有kinova机械臂的husky地面无人车的xacro模型

1.在catkin_ws/src下,创建功能包

catkin_create_pkg my_description urdf xacro

在功能包中建立urdf、meshes、launch、config这四个文件夹,分别用于存放特定的文件
接下来编写my.urdf文件

2.添加底盘

<?xml version="1.0"?>

<robot name="my_robot" xmlns:xacro="http://ros.org/wiki/xacro">

<!--///Base_link///-->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://my_description/meshes/base_link.dae" />
      </geometry>
    </visual>
  </link>

</robot>

编写display_my_urdf.launch文件

<launch>
	<!-- 设置机器人模型路径参数 -->
	<param name="robot_description" textfile="$(find my_description)/urdf/my.urdf" />
	
	<!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
	
	<!-- 运行robot_state_publisher节点,发布tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
	
	<!-- 运行rviz可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find marm_description)/config/marm_urdf.rviz" required="true" />
</launch>

编译工作空间后在rviz中查看

roslaunch marm_description display_marm_urdf.launch

在这里插入图片描述

3.添加base_footprint

这个link就是上一篇博客中述及的“机器人映射到地面投影的一个坐标系,一般坐标系的原点都位于地面,方便后续做一些导航、建模相关工作”

  <!--// Base footprint is on the ground under the robot ///-->
  <link name="base_footprint"/>

  <joint name="base_footprint_joint" type="fixed">
    <origin xyz="0 0 ${wheel_vertical_offset - wheel_radius}" rpy="0 0 0" />
    <parent link="base_link" />
    <child link="base_footprint" />
  </joint>

在此之前,还需要定义一些husky的属性,包括底盘尺寸、车轮安装位置、车轮参数:

  <!--// Base Size //-->
  <xacro:property name="base_x_size" value="0.98740000" />
  <xacro:property name="base_y_size" value="0.57090000" />
  <xacro:property name="base_z_size" value="0.24750000" />

  <!--// Wheel Mounting Positions -->
  <xacro:property name="wheelbase" value="0.5120" />
  <xacro:property name="track" value="0.5708" />
  <xacro:property name="wheel_vertical_offset" value="0.03282" />

  <!-- Wheel Properties //-->
  <xacro:property name="wheel_length" value="0.1143" />
  <xacro:property name="wheel_radius" value="0.1651" />

【启动rviz运行时报错】

[ERROR] [1601879476.512976966]: Unable to parse component [${wheel_vertical_offset] to a double (while parsing a vector value)
[ERROR] [1601879476.513133986]: Malformed parent origin element for joint [base_footprint_joint]
[ERROR] [1601879476.513180875]: joint xml is not initialized correctly
[robot_state_publisher-3] process has died [pid 17781, exit code 255, cmd /opt/ros/kinetic/lib/robot_state_publisher/robot_state_publisher __name:=robot_state_publisher __log:=/home/hjs/.ros/log/5d1643cc-06d4-11eb-b10d-3cf862e0843b/robot_state_publisher-3.log].
log file: /home/hjs/.ros/log/5d1643cc-06d4-11eb-b10d-3cf862e0843b/robot_state_publisher-3*.log

无法将分量[$ {wheel_vertical_offset]解析为双精度(解析向量值时)
关节[base_footprint_joint]的父代原始元素格式错误

就是解析不了这句含有数学表达式的代码:

${wheel_vertical_offset - wheel_radius}

然而xacro是支持“使用属性”的啊,暂时还没有找到解决办法,只好计算器计算一下了,有待后续发现是哪里设置错误了;

将${wheel_vertical_offset - wheel_radius}替换为 -0.13228 ,在rviz中查看:

在这里插入图片描述

4.添加前左轮

<!-- front_left_wheel_link //-->
	<link name="front_left_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<mesh filename="package://my_description/meshes/wheel.dae" />
			</geometry>
		</visual>
	</link>

	<joint name="${wheel_prefix}_wheel" type="continuous">
    <origin xyz="0.256 0.2854 0.03282" rpy="0 0 0" />
		<parent link="base_link"/>
		<child link="front_left_wheel_link"/>
		<xacro:insert_block name="joint_pose"/>
		<axis xyz="0 1 0" rpy="0 0 0" />
	</joint>

在rviz中查看:
在这里插入图片描述

5.添加前右轮

<!-- front_right_wheel_link //-->
	<link name="front_right_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<mesh filename="package://my_description/meshes/wheel.dae" />
			</geometry>
		</visual>
	</link>

	<joint name="front_right_wheel" type="continuous">
    <origin xyz="0.256 -0.2854 0.03282" rpy="0 0 0" />
		<parent link="base_link"/>
		<child link="front_right_wheel_link"/>
		<xacro:insert_block name="joint_pose"/>
		<axis xyz="0 1 0" rpy="0 0 0" />
	</joint>

在这里插入图片描述

6.添加后左轮

<!-- rear_left_wheel_link //-->
	<link name="rear_left_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<mesh filename="package://my_description/meshes/wheel.dae" />
			</geometry>
		</visual>
	</link>

	<joint name="rear_left_wheel" type="continuous">
    <origin xyz="-0.256 0.2854 0.03282" rpy="0 0 0" />
		<parent link="base_link"/>
		<child link="rear_left_wheel_link"/>
		<xacro:insert_block name="joint_pose"/>
		<axis xyz="0 1 0" rpy="0 0 0" />
	</joint>

在这里插入图片描述

7.添加后右轮

<!-- rear_right_wheel_link //-->
	<link name="rear_right_wheel_link">
		<visual>
			<origin xyz="0 0 0" rpy="0 0 0" />
			<geometry>
				<mesh filename="package://my_description/meshes/wheel.dae" />
			</geometry>
		</visual>
	</link>

	<joint name="rear_right_wheel" type="continuous">
    <origin xyz="-0.256 -0.2854 0.03282" rpy="0 0 0" />
		<parent link="base_link"/>
		<child link="rear_right_wheel_link"/>
		<xacro:insert_block name="joint_pose"/>
		<axis xyz="0 1 0" rpy="0 0 0" />
	</joint>

在这里插入图片描述在这里插入图片描述

8.添加上底盘

<!--/ top_chassis_link /-->
  <link name="top_chassis_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://my_description/meshes/top_chassis.dae" />
      </geometry>
    </visual>
  </link>

  <joint name="top_chassis_joint" type="fixed">
    <parent link="base_link" />
    <child link="top_chassis_link" />
  </joint>

在这里插入图片描述
在这里插入图片描述
可见top_chassis_link和base_link的坐标系相同

9.添加user_rail_link

<!--/// user_rail_link -->
  <link name="user_rail_link">
    <visual>
      <geometry>
        <mesh filename="package://my_description/meshes/user_rail.dae" />
      </geometry>
    </visual>
  </link>

  <joint name="user_rail" type="fixed">
    <origin xyz="0.272 0 0.245" rpy="0 0 0" />
    <parent link="base_link" />
    <child link="user_rail_link" />
  </joint>

在这里插入图片描述

10.添加前保险杠

<!-- front_bumper_link -->
    <link name="front_bumper_link">
      <visual>
        <geometry>
          <mesh filename="package://my_description/meshes/bumper.dae" />
        </geometry>
      </visual>
    </link>

    <!-- Attach front bumper -->
    <joint name="front_bumper" type="fixed">
      <origin xyz="0.48 0 0.091" rpy="0 0 0" />
      <parent link="base_link" />
      <child link="front_bumper_link" />
    </joint>

在这里插入图片描述

11.添加前保险杠加长

<!--/ front_bumper_extension_link -->
  <link name="front_bumper_extension_link">
      <visual>
          <geometry>
              <mesh filename="package://my_description/meshes/bumper_extension.dae" />
          </geometry>
      </visual>
  </link>

  <joint name="front_bumper_extension" type="fixed">
    <origin xyz="0.48 0 0.091" rpy="0 0 0" />
    <parent link="base_link" />
    <child link="front_bumper_extension_link" />
  </joint>

在这里插入图片描述

12.添加后保险杠

<!--/ rear_bumper_link ///-->
  <link name="rear_bumper_link">
    <visual>
      <geometry>
        <mesh filename="package://my_description/meshes/bumper.dae" />
      </geometry>
    </visual>
  </link>

  <joint name="rear_bumper" type="fixed">
    <origin xyz="-0.48 0 0.091" rpy="0 0 3.14159" />
    <parent link="base_link" />
    <child link="rear_bumper_link" />
  </joint>

在这里插入图片描述

13.添加后保险杠加长

<!-- // rear_bumper_extension_link /-->
  <link name="rear_bumper_extension_link">
      <visual>
          <geometry>
              <mesh filename="package://my_description/meshes/bumper_extension.dae" />
          </geometry>
      </visual>
  </link>

  <joint name="rear_bumper_extension" type="fixed">
    <origin xyz="-0.48 0 0.091" rpy="0 0 3.14159" />
    <parent link="base_link" />
    <child link="rear_bumper_extension_link" />
  </joint>

在这里插入图片描述

14.添加顶板

<!--/ top_plate_link ///-->
  <link name="top_plate_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <mesh filename="package://my_description/meshes/top_plate.dae" />
      </geometry>
    </visual>
  </link>

  <joint name="top_plate_joint" type="fixed">
    <parent link="base_link" />
    <child link="top_plate_link"/>
    <origin xyz="0.0812 0 0.245" rpy="0 0 0"/>
  </joint>

在这里插入图片描述

15.在顶板前后分别添加坐标系

<!--/    ///-->
  <link name="top_plate_front_link"/>
  <link name="top_plate_rear_link"/>
<!-- Top plate front link -->
  <joint name="top_plate_front_joint" type="fixed">
    <parent link="top_plate_link" />
    <child link="top_plate_front_link"/>
    <origin xyz="0.36367 0 0.00639" rpy="0 0 0"/>
  </joint>
<!-- Top plate rear link-->
  <joint name="top_plate_rear_joint" type="fixed">
    <parent link="top_plate_link" />
    <child link="top_plate_rear_link"/>
    <origin xyz="-0.36633 0 0.00639" rpy="0 0 0"/>
  </joint>

在这里插入图片描述看一下现在的TF树吧!
在这里插入图片描述

16.检查xacro模型整体结构

进入xacro文件夹下

urdf_to_graphiz my.urdf.xacro

在这里插入图片描述
至此,husky地面无人车终于整理完毕了!通过自己从头到尾建立模型,可以说现在对husky的任何一个joint或者link都了如指掌,将官方的转化为自己的。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值