【自动驾驶入门:从建模到跟随】 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="$(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"/>

<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"/>

<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"/>

<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"/>

<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"/>



<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>





<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>



<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>





<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>



<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>



<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>



<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

完成。
【自动驾驶入门:从建模到跟随】 2 创建小车基础模型_第1张图片

轮子可以做关节的转动和滚动。
点击gazebo中间右边的三个点,向左拖,点击模型
可以看到
【自动驾驶入门:从建模到跟随】 2 创建小车基础模型_第2张图片

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

你可能感兴趣的:(自动驾驶入门:从建模到跟随,ubuntu,c++,自动驾驶)