创建自己xacro功能包

在工作空间中创建xacro的功能包

进入工作空间的src文件夹运行roscreate-pkg myrobot urdf xacro

roscreate-pkg myrobot urdf xacro

pass:myrobot是你功能包的名字,你可以自己进行修改

环境和依赖配置

检查自己的ros版本并按照相关包

echo $ROS_DISTRO

根据得到的结果可以看到我的ros版本是noetic,我们运行相关版本安装joint-state-publisher-gui

sudo apt-get install ros-<ros版本例如:noetic>-joint-state-publisher-gui

那我执行的就是

sudo apt-get install ros-noetic-joint-state-publisher-gui

ros功能包地址变量设置

1.打开~(也就是/home/xxx/)下的“.bashrc”文件添加上我们功能包的地址

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/workspace/src/myrobot

~/workspace/myrobot的内容需要自己根据自己工作文件夹的位置进行修改

例如:我的功能包的位置是/home/xy/xy/myrobot下

那我就打开/home/xy(即~)下的.bashrc文件添加

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/xy/src/myrobot

我们运行下面指令重启一下终端刷新一下加载这个修改的文件或者重新打开一个新终端

source ~/.bashrc

建立launch文件和urdf文件夹及其中内容

新建文件夹launch

使用指令

mkdir launch

或者在操作系统中右键新建文件夹

新建文件夹urdf

使用指令

mkdir urdf

或者在操作系统中右键新建文件夹

新建urdf的xacro文件

进入urdf文件夹,打开终端创建xacro文件

touch robot1_base.xacro

robot1_base.xacro的代码为下面所示
<?xml version="1.0"?>

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" 
    xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
        xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
        xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
    name="robot0">


    <xacro:property name="length_wheel" value="0.05" />
    <xacro:property name="radius_wheel" value="0.05" />
    <xacro:macro name="default_inertial" params="mass">
           
    </xacro:macro>

    <link name="base_footprint">
        <visual>
            <geometry>
                    <box size="0.001 0.001 0.001"/>
                </geometry>
            <origin rpy="0 0 0" xyz="0 0 0"/>
        </visual>
        <xacro:default_inertial mass="0.0001"/>
    </link>

    <gazebo reference="base_footprint">
        <material>Gazebo/Green</material>
        <turnGravityOff>false</turnGravityOff>
    </gazebo>

    <joint name="base_footprint_joint" type="fixed">
        <origin xyz="0 0 0" />
        <parent link="base_footprint" />
        <child link="base_link" />
    </joint>


    <link name="base_link">
        <visual>
            <geometry>
                    <box size="0.2 .3 .1"/>
                </geometry>
            <origin rpy="0 0 1.54" xyz="0 0 0.05"/>
            <material name="white">
                <color rgba="1 1 1 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                    <box size="0.2 .3 0.1"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="10"/>
    </link>

    <link name="wheel_1">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <!-- <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/> -->
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <material name="black">
                <color rgba="0 0 0 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>
    </link>

    <link name="wheel_2">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <!-- <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/> -->
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <material name="black"/>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>

    </link>

    <link name="wheel_3">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
            <!-- <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/> -->

            <origin rpy="0 0 0" xyz="0 0 0"/>
            <material name="black"/>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>
    </link>

    <link name="wheel_4">
        <visual>
                <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
                </geometry>
        <!--    <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/> -->
            <origin rpy="0 0 0" xyz="0 0 0" />
            <material name="black"/>
        </visual>
        <collision>
            <geometry>
                    <cylinder length="${length_wheel}" radius="${radius_wheel}"/>
            </geometry>
        </collision>
        <xacro:default_inertial mass="1"/>

    </link>



<joint name="base_l_wheel_joint" type="continuous">
   <parent link="base_link"/>
   <child link="wheel_1"/>
   <origin rpy="1.5707 0 0" xyz="0.1 0.15 0"/>
   <axis xyz="0 0 1" />
</joint>

<joint name="base_r_wheel_joint" type="continuous">
   <parent link="base_link"/>
   <child link="wheel_2"/>
   <origin rpy="1.5707 0 0" xyz="-0.1 0.15 0"/>
   <axis xyz="0 0 1" />
   <limit effort="100" velocity="100" />
</joint>


 <joint name="base_to_wheel3" type="continuous">
   <parent link="base_link"/>
   <axis xyz="0 0 1" />
   <child link="wheel_3"/>
   <origin rpy="1.5707 0 0" xyz="0.1 -0.15 0"/>
 </joint>

 <joint name="base_to_wheel4" type="continuous">
   <parent link="base_link"/>
   <axis xyz="0 0 1" />
   <child link="wheel_4"/>
   <origin rpy="1.5707 0 0" xyz="-0.1 -0.15 0"/>
 </joint>
<!-- GAZEBO Plugin -->
    <gazebo>
           <plugin name="arbotix_driver" filename="libarbotix_driver.so">
            <rosparam file="$(find myrobot)/config/fake_mrobot_arbotix.yaml" command="load" />
            <param name="sim" value="true"/>
        </plugin>
    </gazebo>
</robot>

新建launch文件夹下的launch文件

进入myrobot/launch文件夹下

touch myrobot.launch

myrobot.launch代码
<launch>
        <arg name="model" />
        <arg name="gui" default="False" />
        <param name="robot_description" command="$(find xacro)/xacro $(find myrobot)/urdf/robot1_base.xacro" />
        <param name="use_gui" value="$(arg gui)"/>
        
        <node name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
        <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
        <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" />
</launch>

对功能包进行编译

进入到我们的工作空间的根目录进行编译

catkin_make

编译完成

运行指令使得模型在rviz中显示

roslaunch myrobot myrobot.launch

!!!如果发现使用指令Tab键没有办法补全!!!

!!!请检查ros功能包地址变量是否设置成功!!!

这个问题大家很容易就会碰到

我们检查无误后正确运行的结果为

roslaunch myrobot myrobot.launch

发现启动了rviz!但是似乎这个global status似乎有问题!但是不要慌这个是坐标系转换问题我们一会只要设置一下就能解决!

我们调整加入Robotmodel!

!!!!!现在机器人的模型就显示在上面啦!!!!!!

至于后面如何在rviz控制机器人运动!以及在机器人上面加入各种传感器我们下次再继续!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐