linux ROS使用两个相同的控制器(驱动器)用于单独的电机

rwqw0loc  于 2023-03-22  发布在  Linux
关注(0)|答案(1)|浏览(147)

我使用ROS Noetic,用于AGV项目。我想使用相同类型的两个控制器/驱动程序。特别是,我想使用Roboteqs控制器。在github中有用于控制roboteq驱动程序的包(git clone https://github.com/Roboteq-Inc/ROS-Driver.git),我可以使用这些主题来监控一些参数,比如速度,并且还使用teleop_twist_keyboard包我可以正常旋转电机,直到这里一切正常。在我想连接第二个驱动程序的情况下,哪种方法是最好的?我尝试为每个控制器创建两个不同的节点,但它们的主题是相同的,我也尝试为两个不同的控制器创建两个不同的包,但由于相同的命名文件,我遇到了一些问题。所以我的一般问题是:
如果我使用两个不同的节点,我如何选择唯一的一个节点来发布/订阅特定的节点,因为这两个节点具有相同的主题,例如,我想选择使用cmd_vel主题移动第一个电机。
我如何使用两个相同的器件和相同的驱动程序//封装(这里是电机/驱动程序)?
先谢谢你
我尝试创建两个不同的节点,但没有任何成功。我也创建了两个不同的包,但我也面临一些问题。
先谢谢你

4nkexdtk

4nkexdtk1#

在ROS中,解决方案是使用命名空间和重新Map,如下所述:http://wiki.ros.org/roslaunch/XML/remap。关键点是,当您有多个电机控制器节点示例,每个示例都需要一个/cmd_vel主题时,您可以重新Map“从主题“A”到主题“B”,然后每当节点认为它正在订阅主题“A”时,它实际上正在订阅主题“B”,这允许您为具有相同接口的多个设备重用节点代码。
重新Map第二个电机控制器的启动文件的示例如下所示

<node name   = "roboteq_motor_controller_driver_1"
      pkg    = "roboteq_motor_controller_driver"
      type   = "roboteq_motor_controller_driver_node" 
      output = "screen">
</node>

<node name   = "roboteq_motor_controller_driver_2"
      pkg    = "roboteq_motor_controller_driver"
      type   = "roboteq_motor_controller_driver_node" 
      output = "screen">
    <remap from="/cmd_vel" to="/motor_2/cmd_vel" />
</node>

这样,只有第一个电机控制器从teleop_twist_keyboard节点阅读/cmd_vel主题。
如果您希望使用键盘包混合控制两个电机(例如两轮机器人),则应创建一个中间节点,该节点读取/cmd_vel并分别计算每个电机命令,然后将单独的命令发布到/motor_1/cmd_vel/motor_2/cmd_vel

相关问题