← 返回首页
《ROS 2机器人开发从入门到实践》4.4.2订阅参数更新
volcengine · bigmodel
Transcript
好,本节课呢我们来看4.4.2订阅参数更新事件。 那在参数被设置之后,如果我们想第一时间呢获取参数更新这个事件,并赋值给对应的这个代码中的这样类的里面的属性。 那就需要订阅这个参数设置的事件了啊。 怎么去订阅这个参数设置事件呢? 它的原理是什么呢? 其实很简单,就是我们在这个第四章开头的时候给大家讲过。 参数通信,它的原理呢,其实就是服务。 那我们改变一个节点的参数的时候,是不是相当于有另外一个节点来请求我们的服务啊? 比如说啊,人脸检测这样一个节点啊,我们使用 Rotoo。 Service. List. 杠 T 啊,回车。 来看一下它的结果啊,它的返回值是这样子的啊。 第一个啊,有这个 face detect node 里面有一个 set parameters 看到这个啊。 这个服务呢,就是由这个这是 DetectNote 的呢,它对外提供了这样一个服务。 那它的服务的这作用就是设置参数的值。 它消息接口是 rcl interface 下的 srv 啊,set parameters 啊,这样一个服务。 那其实就是我们是调用命令行去干嘛呢? 是使用这个,比如说这 two parameter set 其实就是去调用这个服务对不对? 那调用这个服务,在这个代码中是不是你应当是有这个服务的回调函数对不对? 那我们在这服务的回调函数中去更新这个。 属性 save 点 model 啊,或者 save 点 number of times to up sample 去更新它俩的值是不是就可以了? 啊,原理就是那么简单啊。 所以这里在 pt 中的小余有说到这个原理啊。 它其实就是相当于服务通信,在服务通信的回调函数里面呢,去额外去调用我们的函数啊。 我们自己呢来定义一个这个函数啊,叫 Parameters callback 然后呢我们调用这个 addOnSetParametersCallback 啊这个方法,把我们这个函数当做回调函数传进来,对不对? 之后,当有客户端啊去请求啊这个服务来改变某一个参数的值的时候,对应的回调函数里面,它就会去调用我们这里啊添加的这样一个参数回调的这样一个事件啊。 然后我们在这里面就可以对这个对应的属性值,比如说 up sample times 啊,啊, model 啊,进行一个修改啊。 那这样一个原理,那我们按照这个原理呢,我们来写一下这个代码啊。 非常好写啊,第一个我们是不是要先定义一个回调函数啊? 卡拜克 然后呢我们写一下这个函数的参数啊,它参数呢就是被要更新的这样一个参数列表啊,我们叫 parameters。 那我们在这里呢去添加一下,add,嗯,on set parameters callback 啊,把这个我们的 self 点,嗯,parameter callback 再加个 s 比较好啊。 因为它是一组参数,它不是一个参数啊,它一次是以设置一组参数。 啊,这样为了提高效率,那么在里面呢对这个 parameters 呢进行一个啊遍历和过滤啊。 我们 for 呃 parameter in parameters 就是遍历一下所有的参数啊。 self 点,我们打印一下啊, get a logger。 点音符啊。 Parameter. 点 name 啊,它里面有 name 还有一个属性。 就这里面的还有一个属性是值啊,value,好。 然后呢我们在这里面就可以做个判断,如果 parameter 点 name 等于啊。 上采样次数,那我们就让 12点 那么 of times two I'm simple 等于什么呢?等于 太阳米塔斯,点 value 啊。 等一等于啊。 同样的方法啊,来判断一下。 如果他的名字等于什么呢?等于这个 model。 这个参数的名字跟那个属性的名字啊不一定要一致啊,大家可以自定义。 self 点 model 等于 parameter 点 value 好,这样呢我们就设置好了。 刚有说到啊,parameters callback 这里呢,它其实就是在我们的调用客户端请求服务的时候,在服务的回调函数里面,就这个服务啊,face detect node set parameters 这个服务的回调函数里面。 然后对这个函数呢进行一个二次的调用。 同时呢它需要对这个函数的返回结果呢,哎,进行一个呃检测,看这个返回的是成功还是失败了,已知道这个参数的这个回调的设置呢是成功还是失败。 所以啊,我们需要在这里呢添加个返回值,就是返回什么呢? 返回这个结果是成功失败。 那呃你不要觉得小鱼在开口胡说啊,就是说凭什么是这样子写啊? 不要不信,不信我们一起来看一下这个代码。 这个 self 点 add on set parameters callback 啊。我们点点 Ctrl 点进去。 啊,跳转到这里了啊,这个是源码啊,这个 root 的这个 python 这部分的源码。 可以看到啊,他把这个 callback 函数啊拿过来了,对不对? 然后把它放到什么? 放到这个 insert 插到这个队列里面来了啊。 这 pair means callback 啊,我看到这是个啥? 找一下啊,好,可以看到在这里啊。 看一下这个逻辑啊,就如果啊,这个结果成功了啊。 应用这个参数的描述,这前面是对一些额外的处理啊。 如果成功了,如果没有成功啊,就直接返回这个失败的结果啊。 然后否则呢? 如果这个参数 callback 里面是有东西的啊,然后就 for callback in 这个啊, self 点, callback 啊,所以你从这里可以看到,你其实可以添加多个参数回调事件的啊。 然后呢,他要干嘛? 这是个 callback 事件对不对? 他调用了这个 callback 同时把这个参数列表传进来了。 就是我们这里啊,他这调这个函数,把这参数列表传进来了。 然后他对返回值,就是他这个函数,他去要了这个返回值 result 了。 如果你 result 里面点 successful 啊。 是 false 的话啊,not false 它直接返回失败了,看到没有? 所以呢,哎,我们就要像它这样子,搞一个这样的返回值啊,set parameters result 啊,然后 successful 呢。 给它设置成一个 true 把这样一个返回啊,所以我们告诉他我们已经设成功了,必须要有加这样一个返回值。 那我们也跟他一样啊,去 return 一下。 大家已经明白了啊,就是为什么这里要 return 一个这个东西,因为这里他要了这个返回值,同时呢他去这个返回值里面有没有 successful。 然后这个 successful 呢,有没有成功,是 true 还是 false 进行了判断。 如果你这里不给返回值,这里就是个什么? 这 result 就是个什么? 就是个 n o n e 啊,就是个空。 那这也就这个代码就直接崩溃了啊。 所以呢,哎,我们要这样写。 那这里还有个报错,就是说找不到这个。 这个是个啥呢? 哎,我们一起来到这边。 我们找一下它的定义啊,Ctrl F,直接往上找啊,654321。 好,在这里啊,从这里导进来的,啊,CL interface message,一个 set parameters result 把它搞过来哎。 放到上面来,我们也导入一下。 啊,不报错了就有了。 那到这里呢,哎,我们这个参数的更新的这样一个回调事件呢,就写好了。 那它的原理呢,小爷也讲清楚了啊。 所以为什么小余要把这个参数,哎,放到我们的这个第四章的后面,跟大家一起讲呢? 就是说把参数可以把它当做对前面的服务的学习的这样一个练习啊。 你看 root two 呢,它也去使用服务来完成一些哎想要的功能。 你以后在代码中呢,也可以像搞参数这样子去用服务啊,你也可以实现自己的一套参数系统。 当然了,现在是说是这个没这个必要啊,已经说图中已经有了。 好,我们一起来重新去构建一下。 Cocoin Builder 然后我们等下去设置一下参数,看一下这里能不能进这个回调函数,然后对应的值呢能不能进行设置成功。 构建完了,然后我们再次运行一下啊,这个参数模型设置就不要了。 回车运行啊。 然后呢我们运行一下右边的这个代码, root two param set 啊。 这个节点模型值,回车。 好,那可以看到啊,叫做 info 啊,时间戳,然后节点 model 改成 CNN 了。 啊,这里的 model 改成了 CNN 啊,这样一个打印。 从这里呢就可以看到啊,当我们去更新这个参数的时候呢,它会确实第一时间会调用这个 parameters callback 啊,就可以进行这个参数的设置和更新了。 好,那本节课呢,关于这个参数更新事件的学习呢,就到这里啊。谢谢大家!
Save edited version
Category
Update category
Tags
Add tag
Versions
original (active)
/var/lib/bili2text/transcripts/original/ROS-2机器人开发从入门到实践-4.4.2订阅参数更新-20261020-103350.txt