【自动驾驶入门:从建模到跟随】 2 创建小车基础模型

【自动驾驶入门:从建模到跟随】2 创建小车基础模型

准备工作:具备ROS基础知识(古月:ROS入门21讲)
自动驾驶入门:从建模到跟随
学习笔记

参考: https://github.com/czhherry/self-driving-vehicle-101/tree/master/05_basic_car
.
第一步:在catkin_ws/src中创建package

willing@willing-virtual-machine:~/catkin_ws/src$ catkin_create_pkg car_model

第二步:创建两个文件夹,launch和urdf
第三步:在launch文件夹下面创建.launch文件
spawn_car.launch

<launch>
<include file="$(find car_model)/launch/spawn_xacro.launch">
<arg name="x" value="0.0"/>
<arg name="y" value="0.0"/>
<arg name="z" value="0.0"/>
<arg name="urdf_robot_file" value="$(find car_model)/urdf/smart.xacro"/>
<arg name="robot_name" value="smart"/>
</include>
</launch>

spawn_xacro.launch

<launch>
<arg name="x" default="0.0"/>
<arg name="y" default="0.0"/>
<arg name="z" default="0.0"/>
<arg name="urdf_robot_file" default=""/>
<arg name="robot_name" default=""/>
<!--
 <param name="robot_description" command="$(arg urdf_robot_file)"/> 
-->
<param name="robot_description" command="$(find xacro)/xacro '$(arg urdf_robot_file)' roboname:='smart'"/>
<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) -model $(arg robot_name) -param robot_description"/>
</launch>

第四步:在urdf文件夹下创建描述文件

smart.xacro
<robot name="$(arg roboname)">
<xacro:property name="PI" value="3.1415926835897931"/>
<!-- base -->
<xacro:property name="base_length" value="2.695"/>
<xacro:property name="base_width" value="0.68"/>
<xacro:property name="base_height" value="1.370"/>
<xacro:property name="base_collision_height" value="0.875"/>
<xacro:property name="base_mass" value="956"/>
<xacro:property name="base_mass_ixx" value="343"/>
<xacro:property name="base_mass_iyy" value="728"/>
<xacro:property name="base_mass_izz" value="772"/>
<!-- rear tyre -->
<xacro:property name="rear_tyre_x" value="0.945"/>
<xacro:property name="rear_tyre_y" value="0.642"/>
<xacro:property name="rear_tyre_r" value="0.3"/>
<xacro:property name="rear_tyre_length" value="0.165"/>
<xacro:property name="rear_tyre_mass" value="20"/>
<xacro:property name="rear_tyre_mass_ixx" value="0.5"/>
<xacro:property name="rear_tyre_mass_iyy" value="0.9"/>
<xacro:property name="rear_tyre_mass_izz" value="0.5"/>
<!-- front tyre -->
<xacro:property name="front_tyre_x" value="0.923"/>
<xacro:property name="front_tyre_y" value="0.642"/>
<xacro:property name="front_tyre_r" value="0.3"/>
<xacro:property name="front_tyre_length" value="0.165"/>
<xacro:property name="front_tyre_mass" value="20"/>
<xacro:property name="front_tyre_mass_ixx" value="0.5"/>
<xacro:property name="front_tyre_mass_iyy" value="0.9"/>
<xacro:property name="front_tyre_mass_izz" value="0.5"/>
<!-- steering -->
<xacro:property name="str_angle" value="0.6"/>
<xacro:property name="str_length" value="0.01"/>
<xacro:property name="str_radius" value="0.1"/>
<xacro:property name="str_mass" value="5"/>
<xacro:property name="str_mass_ixx" value="0.012"/>
<xacro:property name="str_mass_iyy" value="0.025"/>
<xacro:property name="str_mass_izz" value="0.012"/>

<!-- car body是模型中间的长方体,提高了一定高度base_collision_height-->
<!--Car Body-->
<link name="base_link">
<collision>
<origin xyz="0 0 ${base_collision_height}" rpy="0 0 0"/>
<geometry>
<box size="${base_length} ${base_width} ${base_height}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 ${base_collision_height}" rpy="0 0 0"/>
<geometry>
<box size="${base_length} ${base_width} ${base_height}"/>
</geometry>
</visual>
</link>
<joint name="inertial_joint" type="fixed">
<parent link="base_link"/>
<child link="main_mass"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
</joint>
<link name="main_mass" type="fixed">
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${base_mass}"/>
<inertia ixx="${base_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${base_mass_iyy}" iyz="0.000000" izz="${base_mass_izz}"/>
</inertial>
</link>


<!--右后轮,碰撞体积,转动惯量,质量等等-->
<!--Rear Right Wheel-->
<!--joint来连接右后轮和车身-->
<joint name="rear_right_wheel_joint" type="continuous"><!--可以朝着一个方向不停滚动-->
<parent link="base_link"/>
<child link="rear_right_wheel_link"/>
<origin xyz="${-rear_tyre_x} ${-rear_tyre_y} ${rear_tyre_r}" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<dynamics damping="0.1"/>
<limit effort="100000" velocity="10000"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="rear_right_wheel_link">
<collision>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${rear_tyre_mass}"/>
<inertia ixx="${rear_tyre_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${rear_tyre_mass_iyy}" iyz="0.000000" izz="${rear_tyre_mass_izz}"/>
</inertial>
</link>


<!--Rear Left Wheel-->
<joint name="rear_left_wheel_joint" type="continuous">
<parent link="base_link"/>
<child link="rear_left_wheel_link"/>
<origin xyz="${-rear_tyre_x} ${rear_tyre_y} ${rear_tyre_r}" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<dynamics damping="0.1"/>
<limit effort="100000" velocity="10000"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="rear_left_wheel_link">
<collision>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${rear_tyre_length}" radius="${rear_tyre_r}"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${rear_tyre_mass}"/>
<inertia ixx="${rear_tyre_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${rear_tyre_mass_iyy}" iyz="0.000000" izz="${rear_tyre_mass_izz}"/>
</inertial>
</link>


<!--Front Right Steering-->
<!--转限定角度-->
<!--点击view->transparent,可以看到轮子上有一个小圆盘就是steering--->
<joint name="front_right_steering_joint" type="revolute">
<parent link="base_link"/>
<!--把轮子附着在小圆盘上,小圆盘转动,轮子也转动-->
<child link="front_right_steering_link"/>
<origin xyz="${front_tyre_x} ${-front_tyre_y} ${front_tyre_r}" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="${-str_angle}" upper="${str_angle}" effort="1000000.0" velocity="10000.0"/>
<dynamics damping="10.0" friction="0.0"/>
</joint>
<link name="front_right_steering_link">
<visual>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${str_length}" radius="${str_radius}"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${str_mass}"/>
<inertia ixx="${str_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${str_mass_iyy}" iyz="0.000000" izz="${str_mass_izz}"/>
</inertial>
</link>


<!--Front Right Wheel-->
<joint name="front_right_wheel_joint" type="continuous">
<parent link="front_right_steering_link"/>
<child link="front_right_wheel_link"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<dynamics damping="0.1"/>
<limit effort="1000000" velocity="10000"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="front_right_wheel_link">
<collision>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${front_tyre_mass}"/>
<inertia ixx="${front_tyre_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${front_tyre_mass_iyy}" iyz="0.000000" izz="${front_tyre_mass_izz}"/>
</inertial>
</link>


<!--Front Left Steering-->
<joint name="front_left_steering_joint" type="revolute">
<parent link="base_link"/>
<child link="front_left_steering_link"/>
<origin xyz="${front_tyre_x} ${front_tyre_y} ${front_tyre_r}" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="${-str_angle}" upper="${str_angle}" effort="1000000.0" velocity="10000.0"/>
<dynamics damping="10.0" friction="0.0"/>
</joint>
<link name="front_left_steering_link">
<visual>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${str_length}" radius="${str_radius}"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${str_mass}"/>
<inertia ixx="${str_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${str_mass_iyy}" iyz="0.000000" izz="${str_mass_izz}"/>
</inertial>
</link>


<!--Front Left Wheel-->
<joint name="front_left_wheel_joint" type="continuous">
<parent link="front_left_steering_link"/>
<child link="front_left_wheel_link"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
<dynamics damping="0.1"/>
<limit effort="1000000" velocity="10000"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="front_left_wheel_link">
<collision>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
</geometry>
</collision>
<visual>
<origin xyz="0 0 0" rpy="${PI/2} 0 0"/>
<geometry>
<cylinder length="${front_tyre_length}" radius="${front_tyre_r}"/>
</geometry>
</visual>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="${front_tyre_mass}"/>
<inertia ixx="${front_tyre_mass_ixx}" ixy="0.000000" ixz="0.000000" iyy="${front_tyre_mass_iyy}" iyz="0.000000" izz="${front_tyre_mass_izz}"/>
</inertial>
</link>
</robot>

知识点:
两种关节:
continuous:一圈一圈可以无限次转下去,甚至可以反向,车轮用这种关节。
revolute:有一定的角度限制,比如限制在0°-90°,用于前轮的转向。

第五步:在catkin_ws中

catkin_make

第六步:打开gazebo

roslaunch gazebo_ros empty_world.launch

第七步:打开一个新的窗口,在catkin_ws中

source devel/setup.bash

第八步:运行spawn_car.launch

roslaunch car_model spawn_car.launch

完成。
在这里插入图片描述

轮子可以做关节的转动和滚动。
点击gazebo中间右边的三个点,向左拖,点击模型
可以看到
在这里插入图片描述

我们可以通过施加力使得小车动起来。比如第一个关节控制的是左前轮的舵,我们施加一个力,改成100,以后可以看到轮子转过来了。
之后会让小车看起来像个真的车,以及通过一些ros的插件来控制关节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值