鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    结合ros2和pyqt5编写小乌龟控制界面

    已定时 已固定 已锁定 已移动 未解决
    综合问题
    ros2 python
    2
    4
    670
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 2752534682
      风之殇
      最后由 编辑

      class MainWindowTurtle(QWidget, Ui_turtel, SubAndPub):
          def __init__(self):
              super(MainWindowTurtle, self).__init__()
              Ui_turtel.__init__(self)
              SubAndPub.__init__(self)
              self.setupUi(self)
      
              self.timer = QTimer(self)
              self.timer.timeout.connect(self.sensor_data_update)
              self.timer.start(10)
      
              self.pushButton_5.clicked.connect(self.color_set)
      
          def sensor_data_update(self):
              self.label_7.setText(str(self.pose_msg_x))
              self.label_8.setText(str(self.pose_msg_y))
              self.label_10.setText(str(self.pose_msg_th))
              self.label_13.setText(str(self.cmd_msg_x))
              self.label_14.setText(str(self.cmd_msg_z))
              rclpy.spin_once(self)
      
          def color_set(self):
              # self.color_msg.r = int(self.lineEdit.text())
              # self.color_msg.g = int(self.lineEdit_2.text())
              # self.color_msg.b = int(self.lineEdit_3.text())
              # r = rclpy.parameter.Parameter('/turtlesim background_r', rclpy.Parameter.Type.INTEGER, self.color_msg.r)
              # g = rclpy.parameter.Parameter('/turtlesim background_g', rclpy.Parameter.Type.INTEGER, self.color_msg.g)
              # b = rclpy.parameter.Parameter('/turtlesim background_b', rclpy.Parameter.Type.INTEGER, self.color_msg.b)
              self.declare_parameters('turtlesim', [('turtlesim background_r', 0), ('turtlesim background_g', 0),
                                                    ('turtlesim background_b', 0)])
              print(self.get_parameter('/turtlesim background_r').get_parameter_value().integer_value)
              self.lineEdit.setText(str(self.get_parameter('/turtlesim background_r').get_parameter_value().string_value))
              self.lineEdit_2.setText(str(self.get_parameter('/turtlesim background_g').get_parameter_value().string_value))
              self.lineEdit_3.setText(str(self.get_parameter('/turtlesim background_b').get_parameter_value().string_value))
              # all_new_parameters = [r,g,b]
              # print(all_new_parameters)
              # self.set_parameters(all_new_parameters)
      class SubAndPub(Node):
      
          def __init__(self):
              self.cmd_msg_z = None
              self.cmd_msg_x = None
              self.pose_msg_th = None
              self.pose_msg_y = None
              self.pose_msg_x = None
              rclpy.init(args=None)
              super().__init__('sub_and_pub')
              self.color_pub = None
              self.cmd_pub = None
              self.pose_msg = None
              self.sub_pose = None
              self.cmd_msg = None
              self.sub_cmd_vel = None
      
              self.cmd_pub = self.create_publisher(Twist, '/turtle1/cmd_vel', 10)
              self.color_pub = self.create_publisher(Color, '/turtle1/color_sensor', 10)
              self.sub_cmd_vel = self.create_subscription(Twist, '/turtle1/cmd_vel', self.CmdVelCallBack, 10)
              self.sub_pose = self.create_subscription(Pose, '/turtle1/pose', self.PoseCallBack, 10)
              self.color_msg = Color()
              self.cmd_vel_msg = Twist()
      
          def CmdVelCallBack(self, msg):
              self.cmd_msg_x = msg.linear.x
              self.cmd_msg_z = msg.angular.z
      
          def PoseCallBack(self, msg):
              self.pose_msg_x = msg.x
              self.pose_msg_y = msg.y
              self.pose_msg_th = msg.theta
      

      微信截图_20221121194706.png
      报错:
      Traceback (most recent call last):
      File "control_main.py", line 45, in color_set
      print(self.get_parameter('/turtlesim background_r').get_parameter_value().integer_value)
      File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/node.py", line 513, in get_parameter
      raise ParameterNotDeclaredException(name)
      rclpy.exceptions.ParameterNotDeclaredException: ('Invalid access to undeclared parameter(s)', '/turtlesim background_r')

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 2752534682
        风之殇
        最后由 编辑

        我是用python3运行的,一直告诉我没有声明,我修改turtlesim的参数还需要再声明么,我应该已经声明参数了

        2752534682 1 条回复 最后回复 回复 引用 0
        • 2752534682
          风之殇 @275253468
          最后由 编辑

          @小鱼 求助,怎么通过界面输入修改海龟模拟器的背景颜色

          1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @275253468
            最后由 编辑

            @275253468 修改颜色是通过服务进行的,所以程序的逻辑就是,当点击设置颜色按钮时,获取RGB三个框的值,接着发送一个服务请求就可以了。


            大家好,我是爱吃瓜皮的小鱼。今天一不小心加班加到了11点,幸亏周末努力搞了存货,今天就介绍一下ROS2的参数,并且带你一起动手把乌龟模拟器搞绿~

            1. 参数背景

            前面章节中,我们动手创建了ROS2镇子和几个村庄。其中作家李四一名灵魂写手,《艳娘传奇》更新速度牵着着很多村民的心。

            李四写小说的速度是在我们创建李四的时候,所使用的timer周期决定的,不知道你还记不记得下面这一段代码:

            timer_period = 1  #李四的手速,每1s写一段话,够不够快
            self.timer = self.create_timer(timer_period, self.timer_callback)  #启动一个定时装置,每 1 s,调用一次time_callback函数
            

            这里我们用了一个time_period来控制timer执行回调函数的速度,但是当我们写好速度运行李四节点后,我们就没有办法改变回调函数的周期,控制李四写小说的速度了。

            我们可以把写小说的速度当作李四这个节点的一个设置,就像亮度值是显示器的一个设置一样。既然在显示器运行时可以修改显示器的亮度,那可以在李四运行时改变这个周期值设置呢?

            小思考:在一个机器人上的节点会有哪些设置?

            根据需求,ROS2为我们准好了一整套的解决方案机制。

            2.解决问题-参数

            ROS2官方对参数的定义是:

            A parameter is a configuration value of a node. You can think of parameters as node settings.

            有请翻译官小鱼

            参数是节点的一个配置值,你可以任务参数是一个节点的设置

            感谢小鱼同学的精彩翻译,ROS2的参数就是节点的设置,和我们上面提出的需求不谋而合,有了参数我们就可以实现动态的改变李四写小说的速度了

            3.论参数组成成分

            ROS2参数是由键值对组成的,此话怎讲?键值对指的是就是名字和数值,比方说

            • 名字:李四写小说周期,值:5s
            • 名字:显示器亮度,值:60%

            名字的数据类型小鱼不多说肯定是字符串了,值的数据类型呢?我们这里用到的是5是整形数据,显然只有一个整形是不够用的,ROS2支持的值的类型如下:

            • bool 和bool[],布尔类型用来表示开关,比如我们可以控制雷达控制节点,开始扫描和停止扫描。
            • int64 和int64[],整形表示一个数字,含义可以自己来定义,这里我们可以用来表示李四节点写小说的周期值
            • float64 和float64[],浮点型,可以表示小数类型的参数值
            • string 和string[],字符串,可以用来表示雷达控制节点中真实雷达的ip地址
            • byte[],字节数组,这个可以用来表示图片,点云数据等信息

            4.体验参数

            我们使用乌龟模拟器来体验一下参数,同时讲解一下常用的参数的命令行工具。

            4.1 运行小乌龟模拟器节点和小乌龟控制节点

            打开终端

            ros2 run turtlesim turtlesim_node
            

            再打开一个终端

            ros2 run turtlesim turtle_teleop_key
            

            可以看到下面的蓝蓝的模拟器
            在这里插入图片描述

            4.2 查看节点有哪些参数(设置)

            我们可以使用下面的指令来查看所有节点的参数列表,打开一个终端,运行下面的指令

            ros2 param list
            

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HaAF7CLI-1630942542984)(5.1ROS2参数介绍/imgs/image-20210903125400440.png)]

            写代码为什么要做到见名知意?我们看到乌龟模拟器的四个参数,background背景bgr指的是blue、green、red。简而言之就是背景颜色。那这几个参数应该可以控制乌龟模拟器的背景颜色。

            最后一个use_sim_time是每个节点都带的,消息回放相关,后面小鱼写篇文章稍微讲讲。

            如果看不懂,还可以有一个方法详细查看一个参数的信息。

            ros2 param describe <node_name> <param_name>
            

            比如:

            ros2 param describe /turtlesim background_b
            

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTw4lBRS-1630942542997)(5.1ROS2参数介绍/imgs/image-20210903150815050.png)]

            这里就可以详细的看到参数的名字,参数的描述,参数的类型,还有对参数的约束,最大值最小值等。

            4.3 查看参数值

            参数的组成由名字和值(键值组成),名字可以通过param list获取,值该使用指令获取呢?

            下面这个命令行工具可以帮助我们获取参数的值

            ros2 param get /turtlesim background_b
            

            运行一下,你会发现结果是255,蓝色进度条打满,再看看r红色和g绿色。

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkXYIF5T-1630942543018)(5.1ROS2参数介绍/imgs/image-20210903142905553.png)]

            分别是255,86,69

            4.4 设置参数

            找到了参数和值,接着我们来改变一下乌龟模拟器的颜色。

            打开小鱼精心准备的在线工具:https://fishros.com/tools/pickr

            选取一个自己喜欢的颜色,这里小鱼就选绿色,因为乌龟模拟器换成绿色的应该很奇怪。

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bB9lbQ4Q-1630942543032)(5.1ROS2参数介绍/imgs/image-20210903145055215.png)]

            可以看到当前的这个颜色,r为44,g为156,b为10,接着我们可以使用下面的指令来设置参数的值。

            ros2 param set <node_name> <parameter_name> <value>
            

            我们依次修改参数值:

            ros2 param set /turtlesim background_r 44
            ros2 param set /turtlesim background_g 156
            ros2 param set /turtlesim background_b 10
            

            接着你可以看到这样的颜色的乌龟模拟器(绿的令人发慌)

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kKHX8Xuy-1630942543042)(5.1ROS2参数介绍/imgs/image-20210903145702524.png)]

            需要留意的是,我们修改的背景数据并没有被存储,只是临时修改。重新启动节点乌龟模拟器依然还是原来的蓝色,不是我们想要的绿色的。

            4.5 把参数存起来

            把参数存起来其实就相当去把当前的参数值拍一张快照,然后保存下来,后面可以用于恢复参数到当前的数值。

            可以使用下面的命令进行操作:

            ros2 param dump <node_name>
            

            4.5.1 给乌龟模拟器参数拍照

            比如我们要保存乌龟模拟器的节点数据,可以采用下面的指令;

            os2 param dump /turtlesim
            

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCJUvze2-1630942543055)(5.1ROS2参数介绍/imgs/image-20210903150318055.png)]

            文件被保存成了yaml格式,用cat指令看一看

            cat ./turtlesim.yaml
            

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3xMG9LI-1630942543066)(5.1ROS2参数介绍/imgs/image-20210903150423697.png)]

            4.5.2 恢复参数值

            我们Ctrl+C关闭乌龟模拟器,然后再重新运行。

            ros2 run turtlesim turtlesim_node
            

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dCRFEFm2-1630942543086)(5.1ROS2参数介绍/imgs/image-20210903151103098.png)]

            可以看到模拟器又变成了蓝色了,接着通过param的load的方法把参数值恢复成我们之前存储的。

            ros2 param load  /turtlesim ./turtlesim.yaml
            

            在这里插入图片描述

            几乎是瞬间,乌龟模拟器又被我们搞绿了

            4.5.3 启动节点时加载参数快照

            有什么办法一开始就让乌龟模拟器变成绿色?答案有的。

            ros2 的run 指令支持下面这种骚操作。

            ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
            

            关闭我们的乌龟模拟器,使用下面的指令重新运行

            ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
            

            在这里插入图片描述

            可以看到一上来就时绿了的模拟器。

            5.总结

            能不加班尽量别加班,尤其是周一,因为周末比上班更累

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            1 条回复 最后回复 回复 引用 0
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS