【URDF】2.使用 URDF 构建可移动机器人模型

前情提要

本章涉及到wsl2中对于gui api调整,虚拟机和原生ubuntu系统不需要做此调整.

更新: 笔者ubuntu16.04需要做以下调整,但是在ubuntu18.04上居然可以直接运行.真是令人费解.

魔改api

笔者上一章洋洋洒洒叙述了wsl2中ubuntu的种种好处,但是到了这一章就要对wsl2中ros提供的api做调整.

先说现象,笔者在执行下面这条语句的时候,出现了异常.

roslaunch urdf_tutorial display.launch model:=urdf/06-flexible.

我这边并没有出现 joint_state_publisher的界面,而且我的形状有点怪,这里留给读者自行研究,我将会给出解决方案.(环境与教程不一致,但是通过自己的debug调试,能修复或者解决问题,也是学习过程).

安装joint_state_publisher_gui包.

sudo apt-get install ros-kinetic-joint-state-publisher-gui
joint-state-publisher         1.12.15
joint-state-publisher-gui     1.12.1

修改joint-state-publisher-gui的源码.

from python_qt_binding.QtCore import pyqtSlot
from python_qt_binding.QtCore import Qt
from python_qt_binding.QtCore import Signal
from python_qt_binding.QtGui import QFont
from python_qt_binding.QtWidgets import QApplication
from python_qt_binding.QtWidgets import QHBoxLayout
from python_qt_binding.QtWidgets import QLabel
from python_qt_binding.QtWidgets import QLineEdit
from python_qt_binding.QtWidgets import QPushButton
from python_qt_binding.QtWidgets import QSlider
from python_qt_binding.QtWidgets import QVBoxLayout
from python_qt_binding.QtWidgets import QGridLayout
from python_qt_binding.QtWidgets import QScrollArea
from python_qt_binding.QtWidgets import QSpinBox
from python_qt_binding.QtWidgets import QWidget

修改为

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import Qt
from PyQt5.QtCore import pyqtSignal as Signal
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QHBoxLayout
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QLineEdit
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QSlider
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QGridLayout
from PyQt5.QtWidgets import QScrollArea
from PyQt5.QtWidgets import QSpinBox
from PyQt5.QtWidgets import QWidget

笔者从日志报错,一直追溯到源码进行gdb调试,后面得到报错就在python_qt_binding这个库内部,是一个图像渲染的库报错了.其实这很正常,因为wsl2才出来没多久,微软做的不完善的地方是有一点.我们手动改成PyQt5.

这里提一嘴PyQt5,这个库应该是和ros绑定的.又回到鱼香肉丝一键安装了.qt是ros or liunx 唯一指定gui.

zwhy2025@ubuntu:~$ cat type.py 
import PyQt5
import joint_state_publisher
print(PyQt5.__file__)
print(joint_state_publisher)

zwhy2025@ubuntu:~$ python type.py 
/usr/lib/python2.7/dist-packages/PyQt5/__init__.pyc
<module 'joint_state_publisher' from '/opt/ros/kinetic/lib/python2.7/dist-packages/joint_state_publisher/__init__.pyc'>

其实这时候,学习ros1的人应该是很少了.笔者是因为所在公司所用中间件是ros1,就索性先学ros1了.

这里我们可以发现PyQt5和joint_state_publisher这两个包所造的dist-packages目录不一样,一个像是全局的,另一个像是ros专属的.ros绑定python2.7这个点也是让笔者非常苦恼的一点.但是我们应该专注知识本身不是吗?

修改启动节点源码

上述两个包始终是包,这意味着他们只提供api但是需要调用者,需要mian函数.我们修改/opt/ros/kinetic/lib/joint_state_publisher/joint_state_publisher 这个python文件就好

zwhy2022@Zwhy:/opt/ros/kinetic/lib/joint_state_publisher$ ls
joint_state_publisher
zwhy2022@Zwhy:/opt/ros/kinetic/lib/joint_state_publisher$ file joint_state_publisher
joint_state_publisher: Python script, ASCII text executable
zwhy2022@Zwhy:/opt/ros/kinetic/lib/joint_state_publisher$ cat joint_state_publisher
... # 掐头

from python_qt_binding.QtWidgets import QApplication

... # 去尾

修改为

...

from PyQt5.QtWidgets import QApplication

...

运行启动指令

zwhy2022@Zwhy:./joint_state_publisher
...
zwhy2022@Zwhy:/opt/ros/kinetic/share/urdf_tutorial$ rostopic echo /joint_states
header:
  seq: 1
  stamp:
    secs: 1692174664
    nsecs:  72221040
  frame_id: ''
name: [right_front_wheel_joint, right_back_wheel_joint, left_front_wheel_joint, left_back_wheel_joint,
  gripper_extension, left_gripper_joint, right_gripper_joint, head_swivel]
position: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
velocity: []
effort: []

运行 urdf launch指令

roslaunch urdf_tutorial display.launch model:=urdf/06-flexible.

image

然后就到了官方教程开头的地方,你可以手动拖动滑动条,就可以看到结构关节变化.这里源码可以学习一下,ros中很多东西都是以源码的形式放送给大家,这里也可以学习到很多东西.

urdf代码细节剖析

头部(轮子同理)

修改后

 <joint name="head_swivel" type="continuous">
    <parent link="base_link"/>
    <child link="head"/>
    <axis xyz="0 0 1"/>
    <origin xyz="0 0 0.3"/>
  </joint>
  
修改前

  <joint name="head_swivel" type="fixed">
    <parent link="base_link"/>
    <child link="head"/>
    <origin xyz="0 0 0.3"/>
  </joint>
  1. 关节类型 ++continuous++

我们修改了关节类型为++continuous++,表示关节连续的 .这意味着从负无穷到正无穷的任何角度(虽然我们都会归一化到-360°到360°之间,而且常用的是弧度制)

  1. 旋转轴

对于腿部,轮子来说我们还需要指定他们旋转的旋转轴,从生活出发,我们很容易知道.头的旋转轴应该是z,轮子的旋转轴为y.这是由我的生活经验决定的,你可以定义自己的规矩.

夹爪

修改后

  <joint name="right_gripper_joint" type="revolute">
    <axis xyz="0 0 -1"/>
    <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
    <origin rpy="0 0 0" xyz="0.2 -0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="right_gripper"/>
  </joint>

修改前

    <joint name="right_gripper_joint" type="fixed">
    <origin rpy="0 0 0" xyz="0.2 -0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="right_gripper"/>
  </joint>
  1. 关节类型 revolute

revolute意味着限制,这里我们指定了旋转轴的上下限度(弧度).以及作用力与最大速度

  1. 旋转轴

这里笔者故意挑选了一个旋转轴z为-1的样例.如果我们采用右手系很容易就能得到旋转方向.这里笔者加上一些描述.如果你的夹爪是一个蟹钳,当你的旋转轴是z正方向,我们用手掌张开,大拇指指向旋转轴方向,手掌指向我们蟹钳方向.当角度增加的的时候,手掌自然弯曲.则是我们蟹钳张开的形状.反之,角度减少,则自然弯曲的反方向是我们蟹钳收回的方向.当然旋转轴z为-1的时候也同理,只是我们把旋转轴轴的方向反向了.如果还是有所模糊,google一下右手法则./

夹臂

修改后

  <joint name="gripper_extension" type="prismatic">
    <parent link="base_link"/>
    <child link="gripper_pole"/>
    <limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/>
    <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
  </joint>
  
修改前

  <joint name="gripper_extension" type="fixed">
    <parent link="base_link"/>
    <child link="gripper_pole"/>
    <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
  </joint>
  1. 关节类型 prismatic

这是与旋转完全不同的地方,因为旋转是绕轴旋转,而伸缩是沿着轴伸缩.

  1. 棱柱关节

这里有个比较坑的点,如果你没有指定 axis,那urdf会默认指定关节的axis是 1 0 0 ,这就解释了,明明我们没有设置,参考轴,但是自己沿着x轴伸缩.笔者自行修改了轴,如下

<axis xyz="0 0 1"/>

这样当你,移动对应滑动条的时候,就可以看到手臂平行地面的,上下举升.也很漂亮.

关节类型总结

浮动关节以及平面关节,在本例中没有体现,读者自行可以探究.

关节类型详细描述
revolute一个旋转关节,它在单一轴线上旋转。这是机器人手臂或腿中常见的关节类型。
continuous类似于revolute关节,但没有旋转的上下限制。它可以持续不断地旋转。
prismatic一个棱柱关节,它沿着一个轴线移动(平移),但不旋转。这是例如在机械臂中用于伸缩的关节类型。
fixed一个固定关节,它不移动,只用于将两个连杆固定在一起。
floating一个浮动关节,它允许6度的自由度,即3个平移和3个旋转。
planar一个平面关节,它在一个平面上允许2个平移自由度和1个旋转自由度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值