weleder 2024-02-12 03:45 采纳率: 0%
浏览 7
已结题

Webots NAO,没有消息发回terminal

基于Webots_ros2软件包构建一个外部控制器来控制软件Webots中的NAO机器人。我想通过''self.__node.get_logger().info(“HERE IS THE STEP”)''将MSG发送到终端。但它不起作用。但是,当我用它来控制名为“my_robot”的tutorial机器人时,它可以做到。
External Controller:

import rclpy
from geometry_msgs.msg import Twist
from controller import Robot
class NAO:
    def init(self, webots_node, properties):
        self.__robot = webots_node.robot

        self.__target_twist = Twist()#initializing the command

        rclpy.init(args=None)
        self.__node = rclpy.create_node('RED0_driver')
        self.__node.create_subscription(Twist, 'cmd_vel', self.__cmd_vel_callback, 1)

    def __cmd_vel_callback(self, twist):
        self.__target_twist = twist
        #self.__node.get_logger().info("HERE IS THE INFOMATION")

    def step(self):
        rclpy.spin_once(self.__node, timeout_sec=0)
        self.__node.get_logger().info("HERE IS THE STEP")

至于控制不同的机器人(my_robot,RED0是Webots中两个机器人的名称), 我只在launch文件中更改了机器人的名称.
有人可以帮我把消息发送到终端吗?please

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-12 03:45
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在Webots中使用ROS2和webots_ros2软件包开发外部控制器时,确保消息能够正确发送到终端,需要确认以下几个关键点:

    1. 节点初始化:确保你在init方法中正确创建并初始化了ROS2节点,并且在控制循环开始前调用了rclpy.init()

    2. 日志记录级别设置:默认情况下,ROS的日志记录级别可能不包括info级别的消息。要查看info级别的消息,请确保已将日志级别设置为info或更低。可以在启动Webots之前通过环境变量设置,例如:

      export ROS_LOG_LEVEL=info
      
    3. 运行时检查:确保你的Webots模拟正在运行,并且与ROS2节点之间建立了正确的连接。同时,对应的机器人(在这个例子中是NAO)应该处于活动状态并在模拟中可见。

    4. 代码完整性:基于您给出的代码片段,似乎缺少了一些必要的上下文,如启动回调函数、主循环等。以下是补充完整后的示例代码:

    import rclpy
    from geometry_msgs.msg import Twist
    from controller import Robot
    
    class NAO:
        def __init__(self, webots_node, properties):
            self.__robot = webots_node.robot
            self.__target_twist = Twist()  # initializing the command
    
            rclpy.init(args=None)
            self.__node = rclpy.create_node('nao_driver')
            self.__node.create_subscription(Twist, 'cmd_vel', self.__cmd_vel_callback, 1)
    
        def __cmd_vel_callback(self, twist):
            self.__target_twist = twist
            self.__node.get_logger().info("Received velocity command")
    
        def step(self):
            rclpy.spin_once(self.__node, timeout_sec=0.1)  # Spin once per Webots step
            self.__node.get_logger().info("HERE IS THE STEP")
    
    def main():
        wb_robot = Robot()
        nao = NAO(wb_robot, None)
    
        while wb_robot.step(time_step=32) != -1:  # Default time step for NAO
            nao.step()
    
        rclpy.shutdown()
    
    if __name__ == '__main__':
        main()
    
    1. 发布/订阅问题:确认你是在正确的话题上订阅命令 ('cmd_vel') 并且该话题有发布者向其发送消息。对于“HERE IS THE STEP”这条信息,它会在每个Webots时间步长内发送一次。

    如果以上步骤都已检查无误,理论上你应该能在终端看到“HERE IS THE STEP”的输出信息。如果还是无法看到输出,请检查ROS日志以排查可能的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 修改了问题 2月12日
  • 修改了问题 2月12日
  • 创建了问题 2月12日

悬赏问题

  • ¥15 Stata链式中介效应代码修改
  • ¥15 latex投稿显示click download
  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错