Skip to content

机器人如果命名为go2retrain,则会遇到硬编码问题 #122

@renoLei021

Description

@renoLei021

Description

问题描述

在使用 go2retrain 机器人时,必须指定 gazebo_model_name:=go2 参数才能正常运行,否则程序无法正确获取机器人状态。经过分析发现,这是由于 rl_sim.cpp 中的 ModelStatesCallback 函数存在硬编码索引问题。

问题代码

#if defined(USE_ROS1)
void RL_Sim::ModelStatesCallback(const 
gazebo_msgs::ModelStates::ConstPtr &msg)
{
    this->vel = msg->twist[2];  // 硬编码索引[2]
    this->pose = msg->pose[2];  // 硬编码索引[2]
}
#endif

问题分析

  1. 硬编码依赖 :函数直接使用索引 [2] 获取机器人状态,假设目标机器人总是位于Gazebo模型列表的第3个位置
  2. 加载顺序依赖 :程序依赖Gazebo模型的加载顺序来确保正确的索引位置
  3. 参数不一致 :当 robot_name=go2retrain 时,需要设置 gazebo_model_name=go2 来确保模型位于预期索引位置

重现步骤

  1. 运行命令:
./build/rl_sar/rl_sim robot_name:=go2retrain 
gazebo_model_name:=go2retrain_gazebo
  1. 观察程序无法正确获取机器人状态
  2. 改为:
./build/rl_sar/rl_sim robot_name:=go2retrain 
gazebo_model_name:=go2
  1. 程序正常运行

预期行为

程序应该能够动态查找指定名称的机器人模型,而不是依赖硬编码的索引位置。

建议解决方案 方案1:动态查找模型(推荐)

void RL_Sim::ModelStatesCallback(const 
gazebo_msgs::ModelStates::ConstPtr &msg)
{
    // 动态查找目标机器人模型
    for (size_t i = 0; i < msg->name.size(); ++i)
    {
        if (msg->name[i] == this->gazebo_model_name)
        {
            this->vel = msg->twist[i];
            this->pose = msg->pose[i];
            return;
        }
    }
    // 如果未找到,输出警告
    std::cout << LOGGER::WARNING << "Model '" << 
    this->gazebo_model_name << "' not found in Gazebo 
    model states" << std::endl;
}

影响范围

  • 所有使用非标准模型加载顺序的机器人配置
  • 特别影响 go2retrain 等需要特殊参数配置的机器人
  • 可能影响其他依赖模型索引的功能

环境信息

  • ROS版本:
  • 操作系统:Linux

附加信息

这个问题的根本原因是代码设计时假设了固定的模型加载顺序,但实际使用中不同的机器人配置可能导致不同的加载顺序。建议采用动态查找的方式来提高代码的健壮性和可维护性。

Commit

98ad09db0b0e1a9e3d979c18222c69003b9f08ee main

Operating System (OS)

ubunt 20.04

ROS Version

ROS2 Foxy

Python Version

python 3.8.20

Additional information

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions