这一部分目的是将真实的机器人映射到gazebo中,使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。
真实机器人的型号的wheeltec旗下的mini_mec。
一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip
找到对应的包
拷贝到工作空间下
在原有文件基础上新建如下文件
mini_mec_robot_run.urdf.xacro文件内容
<?xml version="1.0"?>
<robot name="mini_mec_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="prefix" value="$(arg prefix)" />
<xacro:if value="${prefix == '/' or prefix == '' or prefix == ' '}">
<xacro:property name="tf_prefix" value="" />
</xacro:if>
<xacro:unless value="${prefix == '/' or prefix == '' or prefix == ' '}">
<xacro:property name="tf_prefix" value="${prefix}/" />
</xacro:unless>
<xacro:include filename="$(find mini_mec_robot)/urdf/mini_mec_robot.urdf.xacro" />
<xacro:include filename="$(find mini_mec_robot)/urdf/lidar_gazebo.xacro" />
<mini_mec_robot/>
</robot>
mini_mec_robot.urdf.xacro
这个文件是基于mini_mec_robot.urdf制作的,主要是copy mini_mec_robot.urdf文件中的关节和link关系,再配置gazebo中关键link的颜色材质,以及odom的计算,并发布odom到baselink之间的tf变换。
<?xml version="1.0" encoding="utf-8"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
这里插入urdf中robot内部的内容(link和joint前面都加上${tf_prefix})
<gazebo reference="${tf_prefix}base_link">
<material>Gazebo/Grey</material>
</gazebo>
<gazebo reference="${tf_prefix}lb_wheel_link">
<mu1>0.1</mu1>
<mu2>0.1</mu2>
<kp>500000.0</kp>
<kd>10.0</kd>
<material>Gazebo/DarkGrey</material>
<maxVel>0.1</maxVel>
<minDepth>0.001</minDepth>
<fdir1>1 0 0</fdir1>
</gazebo>
<gazebo reference="${tf_prefix}lf_wheel_link">
<mu1>0.1</mu1>
<mu2>0.1</mu2>
<kp>500000.0</kp>
<kd>10.0</kd>
<material>Gazebo/DarkGrey </material>
<maxVel>0.1</maxVel>
<minDepth>0.001</minDepth>
<fdir1>1 0 0</fdir1>
</gazebo>
<gazebo reference="${tf_prefix}rf_wheel_link">
<mu1>0.1</mu1>
<mu2>0.1</mu2>
<kp>500000.0</kp>
<kd>10.0</kd>
<material>Gazebo/DarkGrey </material>
<maxVel>0.1</maxVel>
<minDepth>0.001</minDepth>
<fdir1>1 0 0</fdir1>
</gazebo>
<gazebo reference="${tf_prefix}rb_wheel_link">
<mu1>0.1</mu1>
<mu2>0.1</mu2>
<kp>500000.0</kp>
<kd>10.0</kd>
<material>Gazebo/DarkGrey </material>
<maxVel>0.1</maxVel>
<minDepth>0.001</minDepth>
<fdir1>1 0 0</fdir1>
</gazebo>
<!-- <gazebo reference="${tf_prefix}caster_wheel_link">
<material>Gazebo/DarkGrey </material>
<maxVel>0.0</maxVel>
<minDepth>0.001</minDepth>
</gazebo> -->
<!-- controller 这是2轮为odom到bselink的tf-->
<!-- <gazebo>
<plugin name="differential_drive_controller"
filename="libgazebo_ros_diff_drive.so">
<rosDebugLevel>Error</rosDebugLevel>
<publishWheelTF>false</publishWheelTF>
<robotNamespace>/</robotNamespace>
<publishTf>true</publishTf>
<publishOdomTF>true</publishOdomTF>
<publishWheelJointState>false</publishWheelJointState>
<updateRate>50</updateRate>
<legacyMode>false</legacyMode> -->
<!-- 前轮 -->
<!-- <leftJoint>${tf_prefix}lf_wheel_joint</leftJoint>
<rightJoint>${tf_prefix}rf_wheel_joint</rightJoint> -->
<!-- 轮子的相关参数 -->
<!-- <wheelSeparation>0.1</wheelSeparation>
<wheelDiameter>0.043</wheelDiameter>
<broadcastTF>1</broadcastTF>
<wheelTorque>20</wheelTorque>
<wheelAcceleration>1.0</wheelAcceleration> -->
<!-- 控制命令与里程计话题 -->
<!-- <commandTopic>${tf_prefix}cmd_vel</commandTopic>
<odometryFrame>${tf_prefix}odom</odometryFrame>
<odometryTopic>${tf_prefix}odom</odometryTopic>
<odometrySource>world</odometrySource>
<robotBaseFrame>${tf_prefix}base_link</robotBaseFrame>
</plugin>
这是4全向轮计算odom并发布odom和baselinkTF的
</gazebo> -->
<gazebo>
<plugin name="mecanum_controller"
filename="libgazebo_ros_planar_move.so">
<!-- 这两个似乎会自带${tf_prefix} -->
<commandTopic>cmd_vel</commandTopic>
<odometryTopic>odom</odometryTopic>
<odometryFrame>${tf_prefix}odom</odometryFrame>
<leftFrontJoint>lf_wheel_joint</leftFrontJoint>
<rightFrontJoint>rf_wheel_joint</rightFrontJoint>
<leftRearJoint>lb_wheel_joint</leftRearJoint>
<rightRearJoint>rb_wheel_joint</rightRearJoint>
<odometryRate>20.0</odometryRate>
<odometrySource>world</odometrySource>
<robotBaseFrame>${tf_prefix}base_link</robotBaseFrame>
</plugin>
</gazebo>
</robot>
lidar_gazebo.xacro这是虚拟雷达文件
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="lidar">
<!-- Create laser reference frame -->
<gazebo reference="${tf_prefix}laser">
<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">
<robotNamespace>/</robotNamespace>
<topicName>${tf_prefix}scan</topicName>
<frameName>${tf_prefix}laser</frameName>
</plugin>
</sensor>
</gazebo>
</robot>
新建一个功能包wheeltec 新建launch/includes/model_wheeltec.launch.xml
<launch>
<!-- 迷你机器人,基础参数 -->
<arg name="robot_name" />
<arg name="model" />
<arg name="gui" default="False" />
<!-- 加载机器人模型描述参数 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find mini_mec_robot)/urdf/mini_mec_robot_run.urdf.xacro' prefix:=$(arg robot_name)" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >
<param name="rate" value="50"/>
</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>
</launch>
在我的wxfpublish功能包的launch文件夹新建 spawn_wheeltec.launch
<launch>
<!-- 迷你机器人,基础参数 -->
<arg name="robot_name" default="wheeltec_01" />
<!-- 仿真环境机器人初始位置 -->
<arg name="initial_pose_x" default="-1.0"/>
<arg name="initial_pose_y" default="0.0"/>
<!-- <arg name="initial_pose_Y" default="0.0581694505"/> -->
<!-- 偏航角,wxf手动调教的参数,还有一些误差在 -->
<arg name="initial_pose_Y" default="0"/><!-- 偏航角,wxf手动调教的参数,还有一些误差在 -->
<arg name="init_pose" value="-x $(arg initial_pose_x) -y $(arg initial_pose_y) -Y $(arg initial_pose_Y)" />
<!-- 迷你机器人模型 -->
<include ns="$(arg robot_name)" file="$(find wheeltec)/launch/includes/model_wheeltec.launch.xml">
<arg name="robot_name" value="$(arg robot_name)" />
</include>
<!-- 在gazebo中加载机器人模型-->
<node ns="$(arg robot_name)" name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="$(arg init_pose) -urdf -model $(arg robot_name) -param robot_description"/>
</launch>
之后就能正常调用了。