这是我在将宇树四足机器人go2的ros1开源代码移植到ros2时遇到的问题。
造成这个问题的原因是,在ros2的launch启动文件中,写入了加载控制器节点,但是ros2的controller_manager在搜索控制器时却搜索不到。所以解决本问题的思路是如何让controller_manager知道在哪搜索控制器。
1)新建xacro文件,添加ros2_control标签,并在标签中定义控制器,并加入你的yaml文件路径。注:如果你也是ros1移植ros2,要注意ros1定义控制器的标签是transmission,在ros2中已经替换成了ros2_control标签,你需要将transmission标签换成ros2_control标签,包括里面的内容也可能需要修改
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- 声明宏 -->
<xacro:macro name="your_controller" params="name">
<!-- 需要替换成你的名字,可随便起 -->
<ros2_control name="your_hardware_interface" type="system">
<!-- 需要替换成你的名字,可随便起 -->
<hardware>
<plugin>gazebo_ros2_control/GazeboSystem</plugin>
</hardware>
<joint name= "your_joint">
<!-- 需要替换成你的名字,需与模型文件里的关节名一致 -->
<!-- 命令接口:力矩控制 -->
<command_interface name="effort">
<param name="min">-10.0</param> <!-- 实际值需根据电机调整 -->
<param name="max">10.0</param> <!-- 单位:牛顿米(N·m) -->
</command_interface>
<!-- 状态反馈接口 -->
<state_interface name="position"/> <!-- 关节位置 -->
<state_interface name="velocity"/> <!-- 关节速度 -->
<state_interface name="effort"/> <!-- 关节力矩 -->
</joint>
</ros2_control>
</xacro:macro>
<gazebo>
<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
<parameters>$(find your_pkg)/config/your_config.yaml</parameters>
<!-- 需要替换成你的包名和路径 -->
</plugin>
</gazebo>
</robot>
2)修改yaml文件格式,确保格式正确
controller_manager:
ros__parameters:
update_rate: 100 # Hz
use_sim_time: true
# 控制器列表及类型
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
your_controller:
type: unitree_legged_control/UnitreeJointController
# 各个控制器的具体配置
joint_state_broadcaster:
ros__parameters:
# No specific parameters needed for the broadcaster usually
update_rate: 1000
# FL Controllers Parameters
your_controller:
ros__parameters:
joint: your_joint
command_interfaces:
- effort
state_interfaces:
- effort
- position
- velocity
#!!!your_controller名字需一致
3)如果你也是ros1迁移ros2,需要注意在xacro文件里的很多插件,如gazebo_ros_control,是ros1提供的插件,但是在ros2中是不能使用的,所以需要对其注释掉或者修改