这是我在将宇树四足机器人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中是不能使用的,所以需要对其注释掉或者修改