赞
踩
前期参考链接:
https://blog.csdn.net/qq_43279579/article/details/115012425
cd ~/catkin_ws/src/mbot_description/urdf/xacro
mkdir gazebo
cd gazebo
sudo gedit mbot_base_gazebo.xacro
声明xml文件
<?xml version="1.0"?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!--存放下面相关定义内容-->
</robot>
各link的质量(mass)属性声明及其他常量声明
<!-- PROPERTY LIST -->
<xacro:property name="M_PI" value="3.1415926"/>
<xacro:property name="base_mass" value="20" />
<xacro:property name="base_radius" value="0.20"/>
<xacro:property name="base_length" value="0.16"/>
<xacro:property name="wheel_mass" value="2" />
<xacro:property name="wheel_radius" value="0.06"/>
<xacro:property name="wheel_length" value="0.025"/>
<xacro:property name="wheel_joint_y" value="0.19"/>
<xacro:property name="wheel_joint_z" value="0.05"/>
<xacro:property name="caster_mass" value="0.5" />
<xacro:property name="caster_radius" value="0.015"/> <!-- wheel_radius - ( base_length/2 - wheel_joint_z) -->
<xacro:property name="caster_joint_x" value="0.18"/>
颜色属性声明
<!-- Defining the colors used in this robot -->
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
<material name="gray">
<color rgba="0.75 0.75 0.75 1"/>
</material>
宏定义 球体惯性矩阵计算
<!-- Macro for inertia matrix -->
<xacro:macro name="sphere_inertial_matrix" params="m r">
<inertial>
<mass value="${m}" />
<inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
iyy="${2*m*r*r/5}" iyz="0"
izz="${2*m*r*r/5}" />
</inertial>
</xacro:macro>
宏定义 圆柱体惯性矩阵计算
<xacro:macro name="cylinder_inertial_matrix" params="m r h">
<inertial>
<mass value="${m}" />
<inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
izz="${m*r*r/2}" />
</inertial>
</xacro:macro>
定义驱动轮的宏定义
与参考链接的主要区别在于
link增加惯性属性和碰撞属性
link添加gazebo标签
joint添加传动装置
<!-- Macro for robot wheel --> <xacro:macro name="wheel" params="prefix reflect"> <joint name="${prefix}_wheel_joint" type="continuous"> <origin xyz="0 ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0"/> <parent link="base_link"/> <child link="${prefix}_wheel_link"/> <axis xyz="0 1 0"/> </joint> <link name="${prefix}_wheel_link"> <visual> <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" /> <geometry> <cylinder radius="${wheel_radius}" length = "${wheel_length}"/> </geometry> <material name="gray" /> </visual> <!-- collision --> <!-- the same with visual --> <!--增加惯性属性和碰撞属性--> <collision> <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" /> <geometry> <cylinder radius="${wheel_radius}" length = "${wheel_length}"/> </geometry> </collision> <!-- inertial --> <cylinder_inertial_matrix m="${wheel_mass}" r="${wheel_radius}" h="${wheel_length}" /> </link> <!--添加gazebo标签为各link配颜色 ,gazebo与rivz颜色设置不兼容--> <!-- Add gazebo tag to link --> <gazebo reference="${prefix}_wheel_link"> <material>Gazebo/Gray</material> </gazebo> <!--joint添加传动装置,用得 transmission 标签,小车轮子用速度控制接口--> <!-- Transmission is important to link the joints and the controller --> <transmission name="${prefix}_wheel_joint_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="${prefix}_wheel_joint" > <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface> </joint> <actuator name="${prefix}_wheel_joint_motor"> <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface> <mechanicalReduction>1</mechanicalReduction> </actuator> </transmission> </xacro:macro>
定义前后轮的宏定义
与参考链接的主要区别在于
link增加惯性属性和碰撞属性
link添加gazebo标签
<!-- Macro for robot caster --> <xacro:macro name="caster" params="prefix reflect"> <joint name="${prefix}_caster_joint" type="continuous"> <origin xyz="${reflect*caster_joint_x} 0 ${-(base_length/2 + caster_radius)}" rpy="0 0 0"/> <parent link="base_link"/> <child link="${prefix}_caster_link"/> <axis xyz="0 1 0"/> </joint> <link name="${prefix}_caster_link"> <visual> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <sphere radius="${caster_radius}" /> </geometry> <material name="black" /> </visual> <!-- 碰撞属性 --> <collision> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <sphere radius="${caster_radius}" /> </geometry> </collision> <!-- 惯性属性 --> <sphere_inertial_matrix m="${caster_mass}" r="${caster_radius}" /> </link> <!--添加gazebo标签,为各link配颜色--> <gazebo reference="${prefix}_caster_link"> <material>Gazebo/Black</material> </gazebo> </xacro:macro>
定义主体base并添加内容
<xacro:macro name="mbot_base_gazebo"> <link name="base_footprint"> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <box size="0.001 0.001 0.001" /> </geometry> </visual> </link> <!-- 给 base_footprint 添加标签 --> <gazebo reference="base_footprint"> <turnGravityOff>false</turnGravityOff> </gazebo> <joint name="base_footprint_joint" type="fixed"> <origin xyz="0 0 ${base_length/2 + caster_radius*2}" rpy="0 0 0" /> <parent link="base_footprint"/> <child link="base_link" /> </joint> <!--base_link添加碰撞属性和惯性属性--> <link name="base_link"> <visual> <origin xyz=" 0 0 0" rpy="0 0 0" /> <geometry> <cylinder length="${base_length}" radius="${base_radius}"/> </geometry> <material name="yellow" /> </visual> <collision> <origin xyz=" 0 0 0" rpy="0 0 0" /> <geometry> <cylinder length="${base_length}" radius="${base_radius}"/> </geometry> </collision> <cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_length}" /> </link> <!--base_link添加gazebo标签--> <gazebo reference="base_link"> <material>Gazebo/Blue</material> </gazebo> <wheel prefix="left" reflect="-1"/> <!-- 调用驱动轮子宏定义 --> <wheel prefix="right" reflect="1"/> <!-- 调用驱动轮子宏定义 --> <caster prefix="front" reflect="-1"/> <!--调用支撑轮子宏定义--> <caster prefix="back" reflect="1"/> <!-- 调用支撑轮子宏定义 --> </xacro:macro>
小车需要差速控制器,gazebo里差速控制器的插件是现成的libgazebo_ros_diff_drive.so文件
<!-- controller --> <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <!-- gazebo提供得差速控制器插件 --> <!-- 控制器所需参数 --> <rosDebugLevel>Debug</rosDebugLevel> <publishWheelTF>true</publishWheelTF> <robotNamespace>/</robotNamespace><!-- 机器人命名空间 订阅和发布得话题 前面 会加上命名空间 /说明没有添加--> <publishTf>1</publishTf> <publishWheelJointState>true</publishWheelJointState> <alwaysOn>true</alwaysOn> <updateRate>100.0</updateRate> <legacyMode>true</legacyMode> <leftJoint>left_wheel_joint</leftJoint> <!-- 控制得joint在哪里,必须和上面得joint名称一致 --> <rightJoint>right_wheel_joint</rightJoint><!-- 控制得joint在哪里,必须和上面得joint名称一致 --> <wheelSeparation>${wheel_joint_y*2}</wheelSeparation><!-- 两个轮子得间距 --> <wheelDiameter>${2*wheel_radius}</wheelDiameter> <broadcastTF>1</broadcastTF> <wheelTorque>30</wheelTorque> <wheelAcceleration>1.8</wheelAcceleration> <commandTopic>cmd_vel</commandTopic> <!-- 订阅得话题:速度控制指令 --> <odometryFrame>odom</odometryFrame> <odometryTopic>odom</odometryTopic> <!-- 发布里程计信息 --> <robotBaseFrame>base_footprint</robotBaseFrame><!-- 设置controler所控制的机器人的坐标系是哪个坐标系 --> </plugin> </gazebo>
sudo gedit mbot_gazebo.xacro
mbot_gazebo.xacro文件内容
<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:include filename="$(find mbot_description)/urdf/xacro/gazebo/mbot_base_gazebo.xacro" /> <!-- 包含文件 -->
<mbot_base_gazebo/> <!-- 调用宏定义 -->
</robot>
cd ~/catkin_ws/src/mbot_description/launch/xacro
mkdir gazebo
cd gazebo
sudo gedit mbot_base_gazebo.launch
mbot_base_gazebo.launch文件内容
<launch> <!-- 设置launch文件的参数 --> <arg name="paused" default="false"/> <arg name="use_sim_time" default="true"/> <arg name="gui" default="true"/> <arg name="headless" default="false"/> <arg name="debug" default="false"/> <!-- 运行gazebo仿真环境 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="debug" value="$(arg debug)" /> <arg name="gui" value="$(arg gui)" /> <arg name="paused" value="$(arg paused)"/> <arg name="use_sim_time" value="$(arg use_sim_time)"/> <arg name="headless" value="$(arg headless)"/> </include> <!-- 加载机器人模型描述参数 --> <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_gazebo.xacro'" /> <!-- 运行joint_state_publisher节点,发布机器人的关节状态 --> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> <!-- 运行robot_state_publisher节点,发布tf --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" > <param name="publish_frequency" type="double" value="50.0" /> </node> <!-- 在gazebo中加载机器人模型--> <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model mrobot -param robot_description"/> </launch>
运行launch文件
roslaunch mbot_description mbot_base_gazebo.launch
①插入模型
模型放置到~/.gazebo/models 文件夹下——在gazebo的左侧列表点击“insert”(可以看到里面有很多的模型,我们只需要从列表中拖出我们需要的模型放置到仿真环境中就可以)
最终添加的环境内容
②保存仿真环境
File——Save World As——放置在功能包~/catkin_ws/src/mbot_description/worlds下面(路径自己选择,主要是在 ~/catkin_ws/src/)
③关闭gazebo界面
①创建模型
Editor——Building Editor,上面界面用于图形编辑,下面是仿真环境;
绘制好的环境模型
File——Save保存我们的模型文件(自己设置模型文件名字)——Exit Building Editor(退出编辑界面),可以看到我们的仿真环境已经在gazebo中显示;
②保存仿真环境
File——Save World As——放置在功能包~/catkin_ws/src/mbot_description/worlds下面(路径自己选择,主要是在 ~/catkin_ws/src/)
方式同上面一样!!!
③关闭gazebo界面
在launch文件中
设置launch文件的参数处加如.world文件的路径即可这样就可以选择相要使用的仿真环境
<!-- 设置launch文件的参数 -->
<arg name="world_name" value="$(find mbot_gazebo)/worlds/playground.world"/><!-- 要加入的部分 -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
cd ~/catkin_ws/src/mbot_description/urdf/xacro
mkdir sensors
cd sensors
sudo gedit camera_gazebo.xacro
<?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="camera"> <xacro:macro name="usb_camera" params="prefix:=camera"> <link name="${prefix}_link"> <inertial> <mass value="0.1" /> <origin xyz="0 0 0" /> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01" /> </inertial> <visual> <origin xyz=" 0 0 0 " rpy="0 0 0" /> <geometry> <box size="0.01 0.04 0.04" /> </geometry> <material name="black"/> </visual> <collision> <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> <geometry> <box size="0.01 0.04 0.04" /> </geometry> </collision> </link> <gazebo reference="${prefix}_link"> <material>Gazebo/Black</material> </gazebo> <gazebo reference="${prefix}_link"> <!-- 这个sensor代表的link --> <sensor type="camera" name="camera_node"> <update_rate>30.0</update_rate><!-- 摄像头发布频率 --> <camera name="head"> <horizontal_fov>1.3962634</horizontal_fov><!-- 摄像头可视范围 --> <image> <width>1280</width><!-- 摄像头分辨率 --> <height>720</height><!-- 摄像头分辨率 --> <format>R8G8B8</format><!-- 摄像头数据格式 --> </image> <clip> <near>0.02</near><!-- 最近距离 --> <far>300</far><!-- 最远距离 --> </clip> <noise> <type>gaussian</type><!-- 摄像头高斯噪声 --> <mean>0.0</mean> <stddev>0.007</stddev> </noise> </camera> <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so"><!-- 加载插件,实现摄像头功能 --> <alwaysOn>true</alwaysOn> <updateRate>0.0</updateRate> <cameraName>/camera</cameraName><!-- 命名空间 --> <imageTopicName>image_raw</imageTopicName><!-- 发布图片信息话题名称 --> <cameraInfoTopicName>camera_info</cameraInfoTopicName><!-- 发布摄像头信息话题名称 --> <frameName>camera_link</frameName><!-- 数据的坐标系统 --> <hackBaseline>0.07</hackBaseline> <distortionK1>0.0</distortionK1> <distortionK2>0.0</distortionK2> <distortionK3>0.0</distortionK3> <distortionT1>0.0</distortionT1> <distortionT2>0.0</distortionT2> </plugin> </sensor> </gazebo> </xacro:macro> </robot>
sudo gedit mbot_with_camera_gazebo.xacro
mbot_with_camera_gazebo.xacro文件内容
<?xml version="1.0"?> <robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find mbot_description)/urdf/xacro/gazebo/mbot_base_gazebo.xacro" /><!-- include机器人底盘mbot_base_gazebo.xacro --> <xacro:include filename="$(find mbot_description)/urdf/xacro/gazebo/camera_gazebo.xacro" /><!-- include机器人传感器摄像头camera_gazebo.xacro --> <!-- 声明参数 --> <xacro:property name="camera_offset_x" value="0.17" /> <xacro:property name="camera_offset_y" value="0" /> <xacro:property name="camera_offset_z" value="0.10" /> <!-- Camera --> <joint name="camera_joint" type="fixed"><!-- 摄像头joint连接方式 --> <origin xyz="${camera_offset_x} ${camera_offset_y} ${camera_offset_z}" rpy="0 0 0" /> <parent link="base_link"/> <child link="camera_link"/> </joint> <xacro:usb_camera prefix="camera"/><!-- 调用摄像头宏 --> <mbot_base_gazebo/><!-- 调用机器人底盘宏 --> </robot>
带摄像头的机器人launch文件
cd ~/catkin_ws/src/mbot_description/launch/xacro/gazebo
sudo gedit view_mbot_with_camera_gazebo.launch
view_mbot_with_camera_gazebo.launch文件内容
<launch> <arg name="world_name" value="$(find mbot_description)/worlds/playground.world"/> <arg name="paused" default="false"/> <arg name="use_sim_time" default="true"/> <arg name="gui" default="true"/> <arg name="headless" default="false"/> <arg name="debug" default="false"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(arg world_name)" /> <arg name="debug" value="$(arg debug)" /> <arg name="gui" value="$(arg gui)" /> <arg name="paused" value="$(arg paused)"/> <arg name="use_sim_time" value="$(arg use_sim_time)"/> <arg name="headless" value="$(arg headless)"/> </include> <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_camera_gazebo.xacro'" /> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" > <param name="publish_frequency" type="double" value="50.0" /> </node> <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model mrobot -param robot_description"/> </launch>
运行
roslaunch mbot_gazebo view_mbot_with_camera_gazebo.launch
用qt工具查看摄像头当前画面
rqt_image_view
选择/camera/image_raw
启动键盘控制
roslaunch mbot_teleop mbot_teleop.launch
通过按按键j,u,i,o控制摄像头视角
摄像头仿真就完成了。
启动rviz
rosrun rviz rviz
添加 add
1.选择机器人模型 RobotModel ,画面出现机器人
2.摄像头信息 image,选择image topic为/camera/image_raw 出现画面信息
cd ~/catkin_ws/src/mbot_description/urdf/xacro/sensors
sudo gedit lidar_gazebo.xacro
<?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser"> <xacro:macro name="rplidar" params="prefix"> <!-- Create laser reference frame --> <link name="${prefix}_link"> <inertial> <mass value="0.1" /> <origin xyz="0 0 0" /> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01" /> </inertial> <visual> <origin xyz=" 0 0 0 " rpy="0 0 0" /> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> <material name="black"/> </visual> <collision> <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> <geometry> <cylinder length="0.06" radius="0.05"/> </geometry> </collision> </link> <gazebo reference="${prefix}_link"> <material>Gazebo/Black</material> </gazebo> <gazebo reference="${prefix}_link"> <sensor type="ray" name="rplidar"> <pose>0 0 0 0 0 0</pose> <visualize>false</visualize> <update_rate>5.5</update_rate> <ray> <scan> <horizontal> <samples>360</samples> <resolution>1</resolution> <min_angle>-3</min_angle> <max_angle>3</max_angle> </horizontal> </scan> <range> <min>0.10</min> <max>6.0</max> <resolution>0.01</resolution> </range> <noise> <type>gaussian</type> <mean>0.0</mean> <stddev>0.01</stddev> </noise> </ray> <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so"> <topicName>/scan</topicName> <frameName>laser_link</frameName> </plugin> </sensor> </gazebo> </xacro:macro> </robot>
sudo gedit mbot_with_laser_gazebo.xacro
mbot_with_laser_gazebo.xacro文件内容
<?xml version="1.0"?> <robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find mbot_description)/urdf/xacro/gazebo/mbot_base_gazebo.xacro" /> <xacro:include filename="$(find mbot_description)/urdf/xacro/sensors/lidar_gazebo.xacro" /> <xacro:property name="lidar_offset_x" value="0" /> <xacro:property name="lidar_offset_y" value="0" /> <xacro:property name="lidar_offset_z" value="0.105" /> <!-- lidar --> <joint name="lidar_joint" type="fixed"> <origin xyz="${lidar_offset_x} ${lidar_offset_y} ${lidar_offset_z}" rpy="0 0 0" /> <parent link="base_link"/> <child link="laser_link"/> </joint> <rplidar prefix="laser"/> <mbot_base_gazebo/> </robot>
带激光雷达的机器人launch文件
cd ~/catkin_ws/src/mbot_description/launch/xacro/gazebo
sudo gedit view_mbot_with_laser_gazebo.launch
view_mbot_with_laser_gazebo.launch文件内容
<launch> <!-- 设置launch文件的参数 --> <arg name="world_name" value="$(find mbot_description)/worlds/playground.world"/><!-- 设置仿真环境文件路径 --> <arg name="paused" default="false"/> <arg name="use_sim_time" default="true"/> <arg name="gui" default="true"/> <arg name="headless" default="false"/> <arg name="debug" default="false"/> <!-- 运行gazebo仿真环境 --> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(arg world_name)" /> <arg name="debug" value="$(arg debug)" /> <arg name="gui" value="$(arg gui)" /> <arg name="paused" value="$(arg paused)"/> <arg name="use_sim_time" value="$(arg use_sim_time)"/> <arg name="headless" value="$(arg headless)"/> </include> <!-- 加载机器人模型描述参数 --> <param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/gazebo/mbot_with_laser_gazebo.xacro'" /> <!-- 设置机器人模型文件路径 --> <!-- 运行joint_state_publisher节点,发布机器人的关节状态 --> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> <!-- 运行robot_state_publisher节点,发布tf --> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" output="screen" > <param name="publish_frequency" type="double" value="50.0" /> </node> <!-- 在gazebo中加载机器人模型--> <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -model mrobot -param robot_description"/> </launch>
运行
roslaunch mbot_gazebo view_mbot_with_laser_gazebo.launch
激光雷达仿真就完成了。
启动键盘控制
roslaunch mbot_teleop mbot_teleop.launch
通过按按键j,u,i,o控制机器人
启动rviz
rosrun rviz rviz
添加 add
1.选择机器人模型 RobotModel ,画面出现机器人
2. 选择LaserScan 选择topic /scan出现雷达信息
方法跟上面摄像头和激光雷达实现的方法类似,这里就不多加说明了,直接给出结果显示了。
gazebo显示
rviz查看kinect的信息
整个过程实在是有点复杂,要花费较多的时间去看,特别是在有时候整个运行过程不存在问题,但是就是不显示希望的效果,而且还不知道问题出在什么地方。文章代码可能在某些地方存在一些拼写问题,所以在文章末尾给出整个功能包下载链接。但是,要想理解这个过程,还需要看一下文章的一些内容。
Gazebo物理仿真环境搭建 实例
ROS进阶—Gazebo物理仿真环境搭建
ROS中阶笔记(四):机器人仿真—Gazebo物理仿真环境搭建(重点)
ROS笔记之Gazebo机器人仿真(五)——Gazebo仿真环境搭建
功能包的下载链接:
https://gitee.com/harrietlh/mbot_description/tree/master
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。