ROS-GAZEBO教程学习(ERB车辆建模)

写在前面

ERB可以定义宏变量,将代码模块化。有许多相似的link时就可以使用这种嵌入式的语言
ROS官方支持的机器人文件格式是URDF,GAZEBO官方支持的机器人文件格式是SDF
GAZEBO可以支持URDF也可以支持SDF,但是想在ROS的RVIZ工具中显示模型就只能用URDF
URDF有一个更高级嵌入式方式,叫xacro,和ERB相似。区别是SDF功能性比URDF更强

如果涉及更复杂的模型建模,可以使用Solidworks建模,使用插件导出URDF(一般机器人、工业机械臂用的这个软件);用Blender建模,使用插件可以导出sdf。更普遍的方法是直接到处stl或者别的格式文件,然后在sdf中使用uri引用即可。
URDFsdf两种文件格式也能相互转换,见参考链接

第三个案例:使用ERB构建车辆模型

实际使用下来,对于小模型便捷性并不强,各种参数也得先算好再替换。仅作参考

车辆建模

步骤一:
~/XX/PX4_Firmware/Tools/sitl_gazebo/models/my_car文件夹下创建my_car.rsdf文件

步骤二:
首先定义地盘、车轮参数,<% %>

<%
    # Geometry
    chassis_length = 2.0
    chassis_width  = 1.0
    chassis_height = 0.5
    wheel_radius   = 0.4
    wheel_length   = 0.2

    left_wheel_location_x0 = -0.5
    left_wheel_location_y0 = chassis_width / 2 + wheel_length / 2

    # Inertial
    chassis_mass = 1.14395
    chassis_ixx  = chassis_mass/12.0 * (chassis_width**2 + chassis_height**2)
    chassis_iyy  = chassis_mass/12.0 * (chassis_height**2 + chassis_length**2)
    chassis_izz  = chassis_mass/12.0 * (chassis_length**2 + chassis_width**2)
    wheel_mass   = 1
    wheel_ixx    = wheel_mass * (wheel_radius**2 / 4.0 + wheel_length**2 / 12.0)
    wheel_iyy    = wheel_mass * (wheel_radius**2 / 4.0 + wheel_length**2 / 12.0)
    wheel_izz    = wheel_mass/2.0 * wheel_radius**2
%>

步骤三:
在模型中取值,<%= %>

<sdf version="1.7">
    <model name="my_car" canonical_link="chassis">
        <static>true</static>
        <pose relative_to="world">0 0 0 0 0 0</pose>
        <link name="chassis">
            <pose relative_to="__model__">0.5 0 <%= wheel_radius %> 0 0 0</pose>
            <inertial>
                <mass><%= chassis_mass %></mass>
                <inertia>
                    <ixx><%= chassis_ixx %></ixx>
                    <iyy><%= chassis_iyy %></iyy>
                    <izz><%= chassis_izz %></izz>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyz>0</iyz>
                </inertia>
            </inertial>
            <visual name="chassis_visual">
                <geometry>
                    <box>
                        <size><%= chassis_length%> <%= chassis_width%> <%= chassis_height%> 0 0 0</size>
                    </box>
                </geometry>
                <material>
                    <ambient>0.0 0.0 1.0 1</ambient>
                    <diffuse>0.0 0.0 1.0 1</diffuse>
                    <specular>0.0 0.0 1.0 1</specular>
                </material>
            <collision name="chassis_collision">
                <geometry>
                    <box>
                        <size><%= chassis_length%> <%= chassis_width%> <%= chassis_height%> 0 0 0</size>
                    </box>
                </geometry>
            </collision>
            </visual>
        </link>

        <%
            wheel_locations = {
                "left_wheel" => {:x0 => left_wheel_location_x0, :y0 => left_wheel_location_y0},
                "right_wheel" => {:x0 => left_wheel_location_x0, :y0 => -left_wheel_location_y0},
            }
        %>
        <!-- 这是一个循环,注意要有end结尾 -->
        <%
            wheel_locations.keys.each do |wheel|
                x0 = wheel_locations[wheel][:x0]
                y0 = wheel_locations[wheel][:y0]
        %>
        <%= '<link name="' + wheel + '">' %>
            <pose relative_to="chassis"><%= x0 %> <%= y0 %> 0 <%= -Math::PI/2%> 0 0</pose>
            <inertial>
                <mass>1</mass>
                <inertia>
                    <ixx><%= wheel_ixx %></ixx>
                    <iyy><%= wheel_iyy %></iyy>
                    <izz><%= wheel_izz %></izz>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyz>0</iyz>
                </inertia>
            </inertial>
            <%= '<visual name="' + wheel + '_visual">' %>
                <geometry>
                    <cylinder>
                        <radius><%= wheel_radius %></radius>
                        <length><%= wheel_length %></length>
                    </cylinder>
                </geometry>
                <material>
                    <ambient>1.0 0.0 0.0 1</ambient>
                    <diffuse>1.0 0.0 0.0 1</diffuse>
                    <specular>1.0 0.0 0.0 1</specular>
                </material>
            </visual>
            <%= '<collision name="' + wheel + '_collision">' %>
                <geometry>
                    <cylinder><%= wheel_radius %></cylinder>
                    <length><%= wheel_length %></length>
                </geometry>
            </collision>
        </link>
        <% end %>
        <%
            caster_location_x = 0.8
            caster_location_z = -wheel_radius/2

            caster_radius = 0.2
        %>
        <link name="caster">
            <pose relative_to="chassis"><%= caster_location_x %> 0 <%= caster_location_z %> 0 0 0</pose>
            <inertial>
                <mass>1</mass>
                <inertia>
                    <ixx>0.016</ixx>
                    <ixy>0</ixy>
                    <ixz>0</ixz>
                    <iyy>0.016</iyy>
                    <iyz>0</iyz>
                    <izz>0.016</izz>
                </inertia>
            </inertial>
            <visual name="caster_visual">
                <geometry>
                    <sphere>
                        <radius><%= caster_radius %></radius>
                    </sphere>
                </geometry>
                <material>
                    <ambient>0.0 1 0.0 1</ambient>
                    <diffuse>0.0 1 0.0 1</diffuse>
                    <specular>0.0 1 0.0 1</specular>
                </material>
            </visual>
            <collision name="caster_collision">
                <geometry>
                    <sphere>
                        <radius><%= caster_radius %></radius>
                    </sphere>
                </geometry>
            </collision>
        </link>
    </model>
</sdf>

步骤四:
rsdf转化为sdf文件
执行下面的命令之前,记得把之前的文件备份:mv my_car.sdf.copy my_car.sdf.copy

erb my_car.rsdf > my_car.sdf

步骤五:
启动,roslaunch px4 gazebo_test.launch。注意,由于<static>true</static>,所以物体是静态的。joint的连接方式和最开始的车辆建模教程一样,就不过多介绍了
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值