系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
跟着上一节博主的教程,可以把ROS内的机器人仿真大概走一遍。不过大家最好还是在一个性能比较好的机器上运行,后来我把虚拟机拷贝到了台式机,运行起来顺畅多了。
下面就准备根据自己的模型在走一遍。
我自己的模型是一个四轮小车的模型,四个驱动轮。原来的模式是双驱动轮圆形的差速底盘。所以第一步就是来制作描述机器人模型的XACRO文件。
提示:以下是本篇文章正文内容,下面案例可供参考
一、构建新的XACRO文件
XACRO文件是URDF文件的一个优化版本,可以根据URDF文件修改而来,而URDF文件也可以从SOLIDWORKS来导入,那么感觉起来这样的通路很顺畅,但是还是低估了过程。
一个是主要是solidworks本身上手操作需要学习一段时间,而且从solidworks导成URDF有很多细节。后续过程也会相对麻烦。
一个是solidworks的工程实体,不是简单的方块和轮子,存在很多不规则结构,连接件等。这些在导出URDF文件的时候需要进行处理,通常将固定的结构和运动的结构体分开,单独合并。再导出。
第二个在Gazebo的仿真环境中,每个节点都要配置惯性矩阵,如果太复杂那么配置起来就太复杂了。
目前是这么理解的,因此还是简单一点,用矩形和圆形来简单的实现吧。
在原来的工程上修改吧:
1.变圆形底盘为方形底盘
<xacro:property name="base_width" value="0.46"/>
<xacro:property name="base_length" value="0.66"/>
<xacro:property name="base_height" value="0.2"/>
<link name="base_link">
<visual>
<geometry>
<box size="${base_length} ${base_width} ${base_height}"/>
</geometry>
<origin xyz="0 0 ${base_height/2 + earth_space}" rpy="0 0 0" />
<material name="yellow">
<color rgba="0.5 0.3 0.0 0.5" />
</material>
</visual>
</link>
定义BOX类型的长宽高三个变量,然后复制模板过来就可以了。主要的是origin的z坐标,如果是0的话,RVIZ里面就会看到机器人在地平线以下了。
2.设置左右4个轮子
<!-- 驱动轮 -->
<!-- 驱动轮属性 -->
<xacro:property name="wheel_radius" value="0.084" /><!-- 半径 -->
<xacro:property name="wheel_length" value="0.05" /><!-- 宽度 -->
<xacro:property name="wheel_x" value="0.18"/>
<xacro:property name="wheel_y" value="0.18"/>
<!-- 驱动轮宏实现 -->
<xacro:macro name="add_wheels" params="name flag flag1" >
<link name="${name}_wheel">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}" />
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
<material name="black" />
</visual>
</link>
<joint name="${name}_wheel2base_link" type="continuous">
<parent link="base_link" />
<child link="${name}_wheel" />
<origin xyz="${flag1 * wheel_x} ${flag * wheel_y} ${-(earth_space + base_link_length / 2 - wheel_radius) }" />
<axis xyz="0 1 0" />
</joint>
</xacro:macro>
<xacro:add_wheels name="fleft" flag="1" flag1="1"/>
<xacro:add_wheels name="fright" flag="-1" flag1="1"/>
<xacro:add_wheels name="rleft" flag="1" flag1="-1"/>
<xacro:add_wheels name="rright" flag="-1" flag1="-1"/>
原来的轮子宏定义只有1个flag参数来设置左右,这里增加了一个来设置前后。wheel_x wheel_y 是指轮子与中心点的距离,这里四个轮子是居中对称的。
3.设置激光雷达
<!-- 雷达属性 -->
<xacro:property name="laser_length" value="0.05" /> <!-- 雷达长度 -->
<xacro:property name="laser_radius" value="0.03" /> <!-- 雷达半径 -->
<xacro:property name="laser_x" value="0.2" /> <!-- 雷达安装的x坐标 -->
<xacro:property name="laser_y" value="0.0" /> <!-- 雷达安装的y坐标 -->
<xacro:property name="laser_z" value="0.24" /> <!-- 雷达安装的z坐标:支架高度 / 2 + 雷达高度 / 2 -->
<!-- 雷达关节以及link -->
<link name="laser">
<visual>
<geometry>
<cylinder radius="${laser_radius}" length="${laser_length}" />
</geometry>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
<material name="black" />
</visual>
</link>
<joint name="laser2support" type="fixed">
<parent link="base_link" />
<child link="laser" />
<origin xyz="${laser_x} ${laser_y} ${laser_z}" />
</joint>
激光雷达这里删除了原来的支撑杆,直接固定到了底盘的上方,这里parent link要记得改为 base_link。不然找不到参考平面了。
二、惯性矩阵设置
1.head.xacro
<xacro:macro name="box_inertia" params="m w h d">
<inertial>
<origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/>
<mass value="${m}"/>
<inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/>
</inertial>
</xacro:macro>
<xacro:macro name="cylinder_inertia" params="m r h">
<inertial>
<origin xyz="0 0 0" rpy="${pi/2} 0 0" />
<mass value="${m}"/>
<inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy = "0" ixz = "0" iyy="${(m/12) * (3*r*r + h*h)}" iyz = "0" izz="${(m/2) * (r*r)}"/>
</inertial>
</xacro:macro>
这里在head.xacro增加了两种惯性矩阵宏定义,其实跟上面的一样,也是从别的参考那里复制过来的。分别是计算长方体和圆环的惯性矩阵。
2.修改car_base.xacro
<collision>
<geometry>
<box size="${base_length} ${base_width} ${base_height}"/>
</geometry>
</collision>
<xacro:box_inertia m="15" w="${base_width}" d="${base_length}" h="${base_height}"/>
这里跟着操作步骤,在里面增加相应代码就行。
<collision>
<origin xyz="0 0 0" rpy="${pi/2} 0 0"/>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}"/>
</geometry>
</collision>
<xacro:cylinder_inertia m="0.5" r="${wheel_radius}" h="${wheel_length}"/>
做完这些以后,在Gazebo里看到对应的模型了。
三、运动控制设置
运动控制是在示例的move.xacro问价里面描述。
由于我们的模型是4个轮子,所以首先在原来的基础上增加两个运动轮,并修改名称。
<xacro:joint_trans joint_name="fleft_wheel2base_link" />
<xacro:joint_trans joint_name="fright_wheel2base_link" />
<xacro:joint_trans joint_name="rleft_wheel2base_link" />
<xacro:joint_trans joint_name="rright_wheel2base_link" />
1.修改运动模型
原来的文件引用的运动模式插件是
libgazebo_ros_diff_drive.so
这个插件适合于双轮差速底盘。这里应该改为:
libgazebo_ros_planar_move.so
四轮差速的模型。
这些插件应该还有很多,这里还没有深入去研究,至少还要包含像是四轮差速带转向的模型。
只有模型匹配了,后面再做导航之类的,效果才最好。
然后按照给的参考修改即可。
<gazebo>
<plugin name="object_controller" filename="libgazebo_ros_planar_move.so">
<updateRate>100.0</updateRate>
<robotNamespace>/</robotNamespace>
<leftFrontJoint>fleft_wheel2base_link</leftFrontJoint>
<rightFrontJoint>fright_wheel2base_link</rightFrontJoint>
<leftRearJoint>rleft_wheel2base_link</leftRearJoint>
<rightRearJoint>rright_wheel2base_link</rightRearJoint>
<wheelSeparation>4</wheelSeparation>
<wheelDiameter>0.1</wheelDiameter>
<robotBaseFrame>base_link</robotBaseFrame>
<torque>1</torque>
<topicName>cmd_vel</topicName>
<broadcastTF>0</broadcastTF>
<odometryTopic>odom</odometryTopic>
<odometryFrame>odom</odometryFrame>
</plugin>
</gazebo>
这样我们的底盘就可以在Gazebo 通过运动指令控制起来了。
总结
提示:这里对文章进行总结:
文章来源:https://www.toymoban.com/news/detail-468250.html
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。文章来源地址https://www.toymoban.com/news/detail-468250.html
到了这里,关于ROS仿真机器人学习笔记二:创建4轮小车模型及相关xraco文件修改的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!