You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS机器人控制器已上传但无法正常工作,请求故障排查

问题描述

我使用ROS URDF设计了一款机器人,已上传控制器但无法按预期运行,相关文件如下,希望能定位错误所在。

相关文件

URDF文件(mrm.urdf)

<robot name="mrm">
    <link name="world"/>
    <link name="base_link">
        <visual>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0"/>
        </visual>
        <collision>
            <geometry>
                <box size="1 1 1"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0"/>
        </collision>
        <inertial>
            <origin rpy="0 0 0" xyz="0 0 0"/>
            <mass value=" 1024.0"/>
            <inertia ixx="170.667" ixy="0" ixz="0"
                iyy="170.667" iyz="0"
                izz="170.667"/>
        </inertial>
    </link>
    <joint name="fixed" type="fixed">
        <parent link="world"/>
        <child link="base_link"/>
    </joint>
    <joint name="joint_1" type="revolute">
        <axis xyz="0 0 1"/>
        <parent link="base_link"/>
        <child link="link_1"/>
        <origin rpy="0 0 0" xyz="0.0 0.0 0.5"/>
        <limit effort="1000" lower="-3.14" upper="3.14" velocity="0.5" />
    </joint>
    <link name="link_1">
        <visual>
            <geometry>
                <cylinder radius="0.4" length="0.35"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.2"/>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="0.4" length="0.35"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.2"/>
        </collision>
        <inertial>
            <origin rpy="0 0 0" xyz="0 0 0.2"/>
            <mass value="157.633"/>
            <inertia ixx="13.235" ixy="0" ixz="0"
                iyy="13.235" iyz="0"
                izz="9.655"/>
        </inertial>
    </link>
    <joint name="joint_2" type="revolute">
        <axis xyz="0 1 0"/>
        <parent link="link_1"/>
        <child link="link_2"/>
        <origin rpy="0 0 0" xyz="0.0 0.0 0.4"/>
        <limit effort="1000" lower="0" upper="0.5" velocity="0.5" />
    </joint>

    <link name="link_2">
        <inertial>
            <origin rpy="0 0 0" xyz="0 0 0.4"/>
            <mass value="57.906"/>
            <inertia ixx="12.679" ixy="0" ixz="0"
                iyy="12.679" iyz="0"
                izz="0.651"/>
        </inertial>
        <visual>
            <geometry>
            <cylinder radius="0.15" length="0.8" />
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.4"/>
        </visual>

        <collision>
            <geometry>
                    <cylinder radius="0.15" length="0.8" />
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.4"/>
        </collision>
    </link>

<transmission name ="trans_1">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="joint_1">
        <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor_1">
        <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
        <mechanicalReduction>1</mechanicalReduction>
    </actuator>
</transmission>

<transmission name ="trans_2">
    <type>transmission_interface/SimpleTransmission</type>
    <joint name="joint_2">
        <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
    </joint>
    <actuator name="motor_2">
        <hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>
        <mechanicalReduction>1</mechanicalReduction>
    </actuator>
</transmission>

<gazebo>
    <plugin name="control" filename="libgazebo_ros_control.so"/>
</gazebo>

</robot>

配置文件(effort.yaml)

joint_1_controller:
type: "effort_controllers/JointPositionController"
joint: joint_1
pid: {p: 700.0, i: 50.0, d: 70.0}
joint_2_controller:
type: "effort_controllers/JointPositionController"
joint: joint_2
pid: {p: 700.0, i: 50.0, d: 70.0}

启动文件(effort.launch)

<param name="robot_description" textfile="$(find mrm_desp)src/urdf/mrm.urdf"/>

<include file="$(find gazebo_ros)/launch/empty_world.launch" />

<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model mrm_desp"    />


<rosparam  file="$(find mrm_desp)src/config/effort.yaml"/>

<node name="Controller_Spawner" pkg="controller_manager" type="spawner" args="joint_1_controller joint_2_controller" />

排查建议

  • 路径合法性检查:确认launch文件中URDF和yaml的路径是否正确。ROS包的资源文件通常直接放在包根目录的urdf/、config/文件夹下,而非src/子目录(src/一般存放源码),可尝试将路径改为$(find mrm_desp)/urdf/mrm.urdf和$(find mrm_desp)/config/effort.yaml。
  • 控制器启动时机:模型在Gazebo中加载需要时间,若控制器先于模型完成加载会失败。可给Controller_Spawner节点添加延迟启动,比如launch-prefix="sleep 5 && ",或者设置respawn="true"让节点自动重试。
  • PID参数调试:当前PID参数(P=700)可能过大,导致关节震荡或无法稳定跟踪目标。先调低P值(如200)测试,根据关节运动情况逐步调整。
  • URDF惯性参数验证:检查各link的惯性参数是否与模型质量分布匹配,尤其是link_2的惯性张量是否符合圆柱体的惯性计算逻辑。
  • 关节限位检查:joint_2的运动范围是0~0.5弧度,发送目标位置时不要超出该范围,避免控制器触发限位保护。
  • 日志分析:用roslaunch mrm_desp effort.launch --screen启动,查看终端输出的错误日志,重点关注控制器加载失败、URDF解析错误、硬件接口不匹配的提示信息。

内容的提问来源于stack exchange,提问作者Aishwarya Palit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:45:56