-
Notifications
You must be signed in to change notification settings - Fork 108
Open
Description
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
问题分析
- 硬编码依赖 :函数直接使用索引 [2] 获取机器人状态,假设目标机器人总是位于Gazebo模型列表的第3个位置
- 加载顺序依赖 :程序依赖Gazebo模型的加载顺序来确保正确的索引位置
- 参数不一致 :当 robot_name=go2retrain 时,需要设置 gazebo_model_name=go2 来确保模型位于预期索引位置
重现步骤
- 运行命令:
./build/rl_sar/rl_sim robot_name:=go2retrain
gazebo_model_name:=go2retrain_gazebo
- 观察程序无法正确获取机器人状态
- 改为:
./build/rl_sar/rl_sim robot_name:=go2retrain
gazebo_model_name:=go2
- 程序正常运行
预期行为
程序应该能够动态查找指定名称的机器人模型,而不是依赖硬编码的索引位置。
建议解决方案 方案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