版本:
ros:Kinetic
solidworks:2016
一 使用solidworks2016导出URDF模型
使用sw2urdfSetup插件将机器人模型导出为URDF文件,插件下载地址:https://github.com/ros/solidworks_urdf_exporter/releases
导出教程:https://www.bilibili.com/video/av56651666?from=search&seid=2948765959330396238
导出的是轮椅模型可以参考经典的差速模型,前面两个驱动轮,后面两个随动轮,以及一个激光雷达,需要手动设置坐标系和参考轴,joint模式选择continues.
导出之后生成的再rviz中显示的display.launch和gazebo.launch文件.
display.launch
<launch> <arg name="model" /> <arg name="gui" default="False" /> <!--若要打开gui插件需要把Flase修改为True--> <param name="robot_description" textfile="$(find smartwheelchair_model)/urdf/smartwheelchair_model.urdf" /> <param name="use_gui" value="$(arg gui)" /> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /> <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" /> <node name="rviz" pkg="rviz" type="rviz" args="-d $(find smartwheelchair_model)/urdf.rviz" /> </launch>
gazebo.launch
<launch> <include file="$(find gazebo_ros)/launch/empty_world.launch" /> <node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" /> <node name="spawn_model" pkg="gazebo_ros" type="spawn_model" args="-file $(find smartwheelchair_model)/urdf/smartwheelchair_model.urdf -urdf -model smartwheelchair_model" output="screen" /> <node name="fake_joint_calibration" pkg="rostopic" type="rostopic" args="pub /calibrated std_msgs/Bool true" /> </launch>
运行gazebo.launch会出现轮椅从空中掉下来的现象,原因有两种可能: 1 base_footprint(base_link在地面的投影)并没有设置,不知道为什么这里的gazebo.launch直接使用了; 2 没有添加controller;
个人感觉第二种可能性比较大.
urdf文件
<?xml version="1.0" encoding="utf-8"?> <!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com) Commit Version: 1.5.1-0-g916b5db Build Version: 1.5.7152.31018 For more information, please see http://wiki.ros.org/sw_urdf_exporter --> <robot name="smartwheelchair_model"> <link name="base_link"> <inertial> <origin xyz="0.071793651840574 -0.0111022819034436 -0.165475510614961" rpy="0 0 0" /> <mass value="26.2736382176516" /> <inertia ixx="2.53902638074258" ixy="0.105926700574816" ixz="0.672576086778549" iyy="2.61400293250425" iyz="0.117880225409204" izz="2.26655952469972" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/base_link.STL" /> </geometry> <material name=""> <color rgba="0.666666666666667 0.698039215686274 0.768627450980392 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/base_link.STL" /> </geometry> </collision> </link> <link name="front_left_link"> <inertial> <origin xyz="-5.98826543907194E-14 -0.0294979270265525 -1.73416836446449E-13" rpy="0 0 0" /> <mass value="2.73380732959739" /> <inertia ixx="0.0540175535224848" ixy="-9.37490464830404E-14" ixz="5.70463674728184E-14" iyy="0.105827632352094" iyz="-2.91387363698334E-14" izz="0.0540175535219555" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_left_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_left_link.STL" /> </geometry> </collision> </link> <joint name="front_left_joint" type="continuous"> <origin xyz="0.125 0.32744 -0.32024" rpy="0 0 0" /> <parent link="base_link" /> <child link="front_left_link" /> <axis xyz="0 1 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="rear_left_link"> <inertial> <origin xyz="0.00443883274698265 -0.159000141701653 -0.0610820964989148" rpy="0 0 0" /> <mass value="0.218543419099177" /> <inertia ixx="0.00138257528279561" ixy="4.94760179596061E-05" ixz="3.77546054156748E-05" iyy="0.000561948581245053" iyz="-0.000582727419998246" izz="0.00107345266613901" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_left_link.STL" /> </geometry> <material name=""> <color rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_left_link.STL" /> </geometry> </collision> </link> <joint name="rear_left_joint" type="continuous"> <origin xyz="-0.40155 0.26744 -0.20624" rpy="1.5708 0 1.7371" /> <parent link="base_link" /> <child link="rear_left_link" /> <axis xyz="0 1 0" /> </joint> <link name="wheel_rear_left_link"> <inertial> <origin xyz="0.00653640490648077 -0.0389351446936917 6.97854693476607E-09" rpy="0 0 0" /> <mass value="2.05874206334677" /> <inertia ixx="0.0145592695258203" ixy="-0.00225630762393329" ixz="-2.72157388421748E-09" iyy="0.0276205421886138" iyz="-4.71240874480446E-10" izz="0.014180480200489" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" /> </geometry> </collision> </link> <joint name="wheel_rear_left_joint" type="continuous"> <origin xyz="0.03948 -0.21 -0.1" rpy="1.5708 -1.4045 3.1416" /> <parent link="rear_left_link" /> <child link="wheel_rear_left_link" /> <axis xyz="-0.16556 0.9862 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="front_right_link"> <inertial> <origin xyz="1.32630018079283E-13 0.0294979270265526 -1.26731958260962E-13" rpy="0 0 0" /> <mass value="2.73380732959733" /> <inertia ixx="0.0540175535224209" ixy="-9.67321655236162E-14" ixz="1.8160422674322E-13" iyy="0.105827632352093" iyz="-1.67393860339268E-14" izz="0.0540175535220183" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_right_link.STL" /> </geometry> <material name=""> <color rgba="0.866666666666667 0.909803921568627 1 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_right_link.STL" /> </geometry> </collision> </link> <joint name="front_right_joint" type="continuous"> <origin xyz="0.125 -0.32154 -0.32024" rpy="0 0 0" /> <parent link="base_link" /> <child link="front_right_link" /> <axis xyz="0 -1 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="rear_right_link"> <inertial> <origin xyz="-0.00443895322170662 -0.159000141931278 -0.0610820981859959" rpy="0 0 0" /> <mass value="0.218543419196504" /> <inertia ixx="0.00138257531626846" ixy="-4.94729909470212E-05" ixz="-3.77531936561614E-05" iyy="0.000561950359239888" iyz="-0.000582722657630795" izz="0.00107345045383076" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_right_link.STL" /> </geometry> <material name=""> <color rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_right_link.STL" /> </geometry> </collision> </link> <joint name="rear_right_joint" type="continuous"> <origin xyz="-0.40155 -0.26154 -0.20624" rpy="1.5708 0 1.7371" /> <parent link="base_link" /> <child link="rear_right_link" /> <axis xyz="0 -1 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="wheel_rear_right_link"> <inertial> <origin xyz="-0.00653640348729612 0.0389351469670967 9.15520717570395E-09" rpy="0 0 0" /> <mass value="2.05874178462337" /> <inertia ixx="0.0145592650917787" ixy="-0.00225630804394482" ixz="-9.8275687204457E-10" iyy="0.02762054030789" iyz="-9.60855468748932E-11" izz="0.0141804828642344" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" /> </geometry> </collision> </link> <joint name="wheel_rear_right_joint" type="revolute"> <origin xyz="-0.03948 -0.21 -0.1" rpy="1.5708 -1.4045 3.1416" /> <parent link="rear_right_link" /> <child link="wheel_rear_right_link" /> <axis xyz="0.16556 -0.9862 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="laser_Link"> <inertial> <origin xyz="0.065791191331278 -9.1747807187873E-10 -0.0926765202077648" rpy="0 0 0" /> <mass value="6.86176515805913" /> <inertia ixx="0.0631299703695162" ixy="-2.88721826247212E-10" ixz="-0.000562191972859836" iyy="0.03676014992034" iyz="-4.08726766416169E-10" izz="0.046630206646977" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/laser_Link.STL" /> </geometry> <material name=""> <color rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/laser_Link.STL" /> </geometry> </collision> </link> <joint name="laser_joint" type="fixed"> <origin xyz="-0.42295 0.0029489 -0.030238" rpy="0 0 0" /> <parent link="base_link" /> <child link="laser_Link" /> <axis xyz="0 0 0" /> </joint> </robot>
二 修改为xacro文件
修改思路: 添加 base_footprint 作为base_link的parent link, 在gazebo运行的xacro文件中加入gazebo_ros_controller,将轮椅本体和激光雷达进行宏定义.
修改后的轮椅结构:
1. 在rviz 中试用的xacro文件
轮椅主体:smartwheelchair_base.xacro,跟之前没有太大变化,加入了base_footprint和宏定义.
<?xml version="1.0" encoding="utf-8"?> <robot name="smartwheelchair_model" xmlns:xacro="http://www.ros.org/wiki/xacro" > <!-- PROPERTY LIST --> <xacro:property name="M_PI" value="3.1415926"/> <xacro:property name="wheel_radius" value="0.2838162"/> <xacro:property name="wheel_distance" value="0.64899"/> <xacro:macro name="mbot_base"> <!-- smartwheelchair‘s link and joint --> <link name="base_link"> <inertial> <origin xyz="0 0 0.53122" rpy="0 0 0" /> <mass value="26.2736382176516" /> <inertia ixx="2.53902638074258" ixy="0.105926700574816" ixz="0.672576086778549" iyy="2.61400293250425" iyz="0.117880225409204" izz="2.26655952469972" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/base_link.STL" /> </geometry> <material name=""> <color rgba="0.666666666666667 0.698039215686274 0.768627450980392 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/base_link.STL" /> </geometry> </collision> </link> <link name="front_left_link"> <inertial> <origin xyz="-5.98826543907194E-14 -0.0294979270265525 -1.73416836446449E-13" rpy="0 0 0" /> <mass value="2.73380732959739" /> <inertia ixx="0.0540175535224848" ixy="-9.37490464830404E-14" ixz="5.70463674728184E-14" iyy="0.105827632352094" iyz="-2.91387363698334E-14" izz="0.0540175535219555" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_left_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_left_link.STL" /> </geometry> </collision> </link> <joint name="front_left_joint" type="continuous"> <origin xyz="0.125 0.32744 -0.32024" rpy="0 0 0" /> <parent link="base_link" /> <child link="front_left_link" /> <axis xyz="0 1 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="rear_left_link"> <inertial> <origin xyz="0.00443883274698265 -0.159000141701653 -0.0610820964989148" rpy="0 0 0" /> <mass value="0.218543419099177" /> <inertia ixx="0.00138257528279561" ixy="4.94760179596061E-05" ixz="3.77546054156748E-05" iyy="0.000561948581245053" iyz="-0.000582727419998246" izz="0.00107345266613901" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_left_link.STL" /> </geometry> <material name=""> <color rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_left_link.STL" /> </geometry> </collision> </link> <joint name="rear_left_joint" type="continuous"> <origin xyz="-0.40155 0.26744 -0.20624" rpy="1.5708 0 1.7371" /> <parent link="base_link" /> <child link="rear_left_link" /> <axis xyz="0 1 0" /> </joint> <link name="wheel_rear_left_link"> <inertial> <origin xyz="0.00653640490648077 -0.0389351446936917 6.97854693476607E-09" rpy="0 0 0" /> <mass value="2.05874206334677" /> <inertia ixx="0.0145592695258203" ixy="-0.00225630762393329" ixz="-2.72157388421748E-09" iyy="0.0276205421886138" iyz="-4.71240874480446E-10" izz="0.014180480200489" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_left_link.STL" /> </geometry> </collision> </link> <joint name="wheel_rear_left_joint" type="continuous"> <origin xyz="0.03948 -0.21 -0.1" rpy="1.5708 -1.4045 3.1416" /> <parent link="rear_left_link" /> <child link="wheel_rear_left_link" /> <axis xyz="-0.16556 0.9862 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="front_right_link"> <inertial> <origin xyz="1.32630018079283E-13 0.0294979270265526 -1.26731958260962E-13" rpy="0 0 0" /> <mass value="2.73380732959733" /> <inertia ixx="0.0540175535224209" ixy="-9.67321655236162E-14" ixz="1.8160422674322E-13" iyy="0.105827632352093" iyz="-1.67393860339268E-14" izz="0.0540175535220183" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_right_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/front_right_link.STL" /> </geometry> </collision> </link> <joint name="front_right_joint" type="continuous"> <origin xyz="0.125 -0.32154 -0.32024" rpy="0 0 0" /> <parent link="base_link" /> <child link="front_right_link" /> <axis xyz="0 -1 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="rear_right_link"> <inertial> <origin xyz="-0.00443895322170662 -0.159000141931278 -0.0610820981859959" rpy="0 0 0" /> <mass value="0.218543419196504" /> <inertia ixx="0.00138257531626846" ixy="-4.94729909470212E-05" ixz="-3.77531936561614E-05" iyy="0.000561950359239888" iyz="-0.000582722657630795" izz="0.00107345045383076" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_right_link.STL" /> </geometry> <material name=""> <color rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/rear_right_link.STL" /> </geometry> </collision> </link> <joint name="rear_right_joint" type="continuous"> <origin xyz="-0.40155 -0.26154 -0.20624" rpy="1.5708 0 1.7371" /> <parent link="base_link" /> <child link="rear_right_link" /> <axis xyz="0 -1 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <link name="wheel_rear_right_link"> <inertial> <origin xyz="-0.00653640348729612 0.0389351469670967 9.15520717570395E-09" rpy="0 0 0" /> <mass value="2.05874178462337" /> <inertia ixx="0.0145592650917787" ixy="-0.00225630804394482" ixz="-9.8275687204457E-10" iyy="0.02762054030789" iyz="-9.60855468748932E-11" izz="0.0141804828642344" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" /> </geometry> <material name=""> <color rgba="0.294117647058824 0.294117647058824 0.294117647058824 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/wheel_rear_right_link.STL" /> </geometry> </collision> </link> <joint name="wheel_rear_right_joint" type="revolute"> <origin xyz="-0.03948 -0.21 -0.1" rpy="1.5708 -1.4045 3.1416" /> <parent link="rear_right_link" /> <child link="wheel_rear_right_link" /> <axis xyz="0.16556 -0.9862 0" /> <limit lower="-180" upper="180" effort="0" velocity="0" /> </joint> <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> <joint name="base_footprint_joint" type="fixed"> <origin xyz="0 0 0.53122" rpy="0 0 0" /> <parent link="base_footprint"/> <child link="base_link" /> </joint> </xacro:macro> </robot>
雷达 lidar.xacro
<?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="laser"> <xacro:macro name="rplidar" params="prefix:=laser"> <!-- Create laser reference frame --> <link name="${prefix}_Link"> <inertial> <origin xyz="0.065791191331278 -9.1747807187873E-10 -0.0926765202077648" rpy="0 0 0" /> <mass value="0.686176515805913" /> <inertia ixx="0.0631299703695162" ixy="-2.88721826247212E-10" ixz="-0.000562191972859836" iyy="0.03676014992034" iyz="-4.08726766416169E-10" izz="0.046630206646977" /> </inertial> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/laser_Link.STL" /> </geometry> <material name=""> <color rgba="0.250980392156863 0.250980392156863 0.250980392156863 1" /> </material> </visual> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <mesh filename="package://smartwheelchair_model/meshes/laser_Link.STL" /> </geometry> </collision> </link> </xacro:macro> </robot>
轮椅总体:smartwheelchair_base_with_laser.xacro
<?xml version="1.0"?> <robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/smartwheelchair_base.xacro" /> <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/sensors/lidar.xacro" /> <!-- lidar --> <joint name="laser_joint" type="fixed"> <origin xyz="-0.42295 0.0029489 -0.030238" rpy="0 0 0" /> <parent link="base_link" /> <child link="laser_Link" /> <axis xyz="0 0 0" /> </joint> <xacro:rplidar prefix="laser"/> <mbot_base/> </robot>
2. 在gazebo中使用的xacro文件
在轮椅主体的smartwheelchair_base.xacro的基础上添加,形成smartwheelchair_base_gazebo.xacro
<!-- link_color --> <gazebo reference="base_link"> <material>Gazebo/Gray</material> </gazebo> <gazebo reference="front_left_link"> <material>Gazebo/Black</material> </gazebo> <gazebo reference="front_right_link"> <material>Gazebo/Black</material> </gazebo> <gazebo reference="rear_left_link"> <material>Gazebo/Gray</material> </gazebo> <gazebo reference="wheel_rear_left_link"> <material>Gazebo/Black</material> </gazebo> <gazebo reference="wheel_rear_right_link"> <material>Gazebo/Black</material> </gazebo> <gazebo reference="base_footprint"> <turnGravityOff>false</turnGravityOff> </gazebo> <!-- transmission --> <transmission name="front_left_joint_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="front_left_joint" > <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface> </joint> <actuator name="front_left_joint_motor"> <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface> <mechanicalReduction>1</mechanicalReduction> </actuator> </transmission> <transmission name="front_right_joint_trans"> <type>transmission_interface/SimpleTransmission</type> <joint name="front_right_joint" > <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface> </joint> <actuator name="front_right_joint_motor"> <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface> <mechanicalReduction>1</mechanicalReduction> </actuator> </transmission> <!-- controller --> <gazebo> <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so"> <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>front_left_joint</leftJoint> <rightJoint>front_right_joint</rightJoint> <wheelSeparation>${wheel_distance*1}</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> </plugin> </gazebo>
在lidar.xacro的基础上添加,形成lidar_gazebo.xacro
<gazebo reference="${prefix}_Link"> <material>Gazebo/Blue</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>
在gazebo中使用的轮椅文件:smartwheelchair_model_with_laser_gazebo.xacro
<?xml version="1.0"?> <robot name="arm" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/gazebo/smartwheelchair_base_gazebo.xacro" /> <xacro:include filename="$(find smartwheelchair_model)/urdf/xacro/sensors/lidar_gazebo.xacro" /> <!-- lidar --> <joint name="laser_joint" type="fixed"> <origin xyz="-0.42295 0.0029489 -0.030238" rpy="0 0 0" /> <parent link="base_link" /> <child link="laser_Link" /> <axis xyz="0 0 0" /> </joint> <xacro:rplidar prefix="laser"/> <mbot_base_gazebo/> </robot>
三 修改launch文件
在rviz中显示并控制 (arbotix 需要下载放在工作空间下)
<launch> <arg name="model" default="$(find xacro)/xacro --inorder ‘$(find smartwheelchair_model)/urdf/xacro/smartwheelchair_model_with_laser.xacro‘" /> <arg name="gui" default="true" /> <param name="robot_description" command="$(arg model)" /> <param name="use_gui" value="$(arg gui)" /> <node name="arbotix" pkg="arbotix_python" type="arbotix_driver" output="screen"> <rosparam file="$(find smartwheelchair_model)/config/fake_mbot_arbotix.yaml" command="load" /> <param name="sim" value="true"/> </node> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /> <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" /> <node name="rviz" pkg="rviz" type="rviz" args="-d $(find smartwheelchair_model)/config/display_arbotix.rviz" required="true" /> </launch>
在gazebo中显示并控制
<launch> <!-- 设置launch文件的参数 home_2,world是另外创建的功能包里面的.world文件--> <arg name="world_name" value="$(find smartwheelchair_gazebo)/worlds/home_2.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 smartwheelchair_model)/urdf/xacro/gazebo/smartwheelchair_model_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 arm -param robot_description"/> </launch>
分别运行以上launch文件在加上cmd_vel控制节点就可以显示并控制其运动了.
四 问题和解决办法
1 运行gazebo.launch文件,机器人从天而降并歪倒在地上
<node name="tf_footprint_base" pkg="tf" type="static_transform_publisher" args="0 0 0 0 0 0 base_link base_footprint 40" />
这句话好像是用于tf坐标变换的,我后面手动添加了base_footprint ,所以就把这句话删掉了,并在新的xacro文件中加入了gazebo_ros_controller ,之后轮椅机器人导入在gazebo中显示就正常了.
2 使用键盘控制节点在gazebo控制轮椅运动时发现轮椅前进和左转错乱,问题在于solidworks导出的时候
左边的轮子是
<axis xyz="0 1 0" />
这句话右边轮椅是
<axis xyz="0 -1 0" />
这就导致发出向前的指令左边正转右边倒转,解决办法将-1改为1.
3 world创建的时候一定不要带上机器人保存,要不然引用的时候会出现两个机器人.
使用solidworks导出URDF模型,转换成xacro模型,并在rviz 和 gazebo中显示并控制
原文:https://www.cnblogs.com/vtas-Yao/p/12521612.html