机器人系统仿真(三)——URDF语法详解之join-程序员宅基地

技术标签: python  java  linux  mysql  数据库  

参考视频:【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili

参考文档:http://www.autolabor.com.cn/book/ROSTutorials/

joint

urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,不同的关节有不同的运动形式: 旋转、滑动、固定、旋转速度、旋转角度限制....,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。

joint标签对应的数据在模型中是不可见的

1.属性
  • name ---> 为关节命名

  • type ---> 关节运动形式

    • continuous: 旋转关节,可以绕单轴无限旋转

    • revolute: 旋转关节,类似于 continues,但是有旋转角度限制

    • prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限

    • planer: 平面关节,允许在平面正交方向上平移或旋转

    • floating: 浮动关节,允许进行平移、旋转运动

    • fixed: 固定关节,不允许运动的特殊关节

2.子标签
  • parent(必需的)

    parent link的名字是一个强制的属性:

    • link:父级连杆的名字,是这个link在机器人结构树中的名字。
  • child(必需的)

    child link的名字是一个强制的属性:

    • link:子级连杆的名字,是这个link在机器人结构树中的名字。
  • origin

    • 属性: xyz=各轴线上的偏移量 rpy=各轴线上的偏移弧度。
  • axis

    • 属性: xyz用于设置围绕哪个关节轴运动。
案例

需求:创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。

demo03_joint.launch

<launch>
    <!--1.在参数服务器载入 urdf 文件-->
    <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo03_joint.urdf" />
    <!--2.启动 rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
</launch>

 demo03_joint.urdf

<!--需求:设置机器人底盘,并添加摄像头-->
<robot name="mycar">
    <!-- 1.底盘link-->
    <link name="base_link">
        <visual>
            <geometry>
                <!--1.1 立方体-->
                <box size="0.3 0.2 0.1"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="car_color">
                <color rgba="0.8 0.5 0 0.5" />
            </material>
        </visual>
    </link>
    <!-- 2.摄像头link-->
    <link name="camera">
        <visual>
            <geometry>
                <box size="0.02 0.05 0.05"/>
            </geometry>
            <!--先使用默认(后期需要修改)-->
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="camera_color">
                <color rgba="0 0 1 0.5" />
            </material>
        </visual>
    </link>
    <!--3.关节-->
    <joint name="camera2base" type="continuous">
        <!--父级 link-->
        <parent link="base_link" />
        <!--子级 link-->
        <child link="camera" />
        <!--设置偏移量-->
        <origin xyz="0.12 0 0.05" rpy="0 0 0"/>
        <!--设置关节旋转参考的坐标系-->
        <axis xyz="0 0 1" />
    </joint>
</robot>

 摄像头在小车内部了,应该要在小车顶部,还报错

 

launch只有上述两条语句:

表现:设置头显示位置与颜色异常 提示:No transform from [camera] to [base_link] 缺少 camera 到 base_link 的坐标变换 原因:rviz 中显示 urdf 时,必须发布不同部件之间的 坐标系 关系 解决:ROS 中提供了关于机器人模型显示的坐标系发布相关节点(两个)

demo03_joint.launch 改为

<launch>
    <!--1.在参数服务器载入 urdf 文件-->
    <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo03_joint.urdf" />
    <!--2.启动 rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>

    <!--
        只有上述两条语句:
            表现:设置头显示位置与颜色异常
            提示:No transform from [camera] to [base_link] 缺少 camera 到 base_link 的坐标变换
            原因:rviz 中显示 urdf 时,必须发布不同部件之间的 坐标系 关系
            解决:ROS 中提供了关于机器人模型显示的坐标系发布相关节点(两个)
    -->
    <!--关节状态发布节点-->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/>
    <!--机器人状态发布节点-->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>
</launch>

摄像头有半截在里面

            <!--先使用默认(后期需要修改)-->
            <origin xyz="0 0 0.025" rpy="0 0 0" />

 让关节转动起来

在 launch 中还需启动新的结点

<launch>
    <!--1.在参数服务器载入 urdf 文件-->
    <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo03_joint.urdf" />
    <!--2.启动 rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>

    <!--
        只有上述两条语句:
            表现:设置头显示位置与颜色异常
            提示:No transform from [camera] to [base_link] 缺少 camera 到 base_link 的坐标变换
            原因:rviz 中显示 urdf 时,必须发布不同部件之间的 坐标系 关系
            解决:ROS 中提供了关于机器人模型显示的坐标系发布相关节点(两个)

    -->
    <!--关节状态发布节点-->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/>
    <!--机器人状态发布节点-->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>
    <!--添加控制关节运动的节点-->
    <node pkg="joint_state_publisher_gui"  type="joint_state_publisher_gui"  name="joint_state_publisher_gui" />
</launch>

base_footprint优化urdf

前面实现的机器人模型是半沉到地下的,因为默认情况下: 底盘的中心点位于地图原点上,所以会导致这种情况产生,可以使用的优化策略,将初始 link 设置为一个尺寸极小的 link(比如半径为 0.001m 的球体,或边长为 0.001m 的立方体),然后再在初始 link 上添加底盘等刚体,这样实现,虽然仍然存在初始link半沉的现象,但是基本可以忽略了。这个初始 link 一般称之为 base_footprint

demo04_base_footprint.urdf

<!--需求:设置机器人底盘,并添加摄像头-->
<robot name="mycar">

    <!--添加一个尺寸绩效的 link,再去关联初始 link 与 base_link,
    关节的高度刚好和 base_link 下沉的高度一致(半个底盘高度)-->
    <link name="base_footprint">
        <visual>
            <geometry>
                <box size="0.001 0.001 0.001"/>
            </geometry>
        </visual>
    </link>

    <!-- 1.底盘link-->
    <link name="base_link">
        <visual>
            <geometry>
                <!--1.1 立方体-->
                <box size="0.3 0.2 0.1"/>
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="car_color">
                <color rgba="0.8 0.5 0 0.5" />
            </material>
        </visual>
    </link>
    <!-- 2.摄像头link-->
    <link name="camera">
        <visual>
            <geometry>
                <box size="0.02 0.05 0.05"/>
            </geometry>
            <!--先使用默认(后期需要修改)-->
            <origin xyz="0 0 0.025" rpy="0 0 0" />
            <material name="camera_color">
                <color rgba="0 0 1 0.5" />
            </material>
        </visual>
    </link>

    <!--关联 base_footprint 与 base_link-->
    <joint name="link2footprint" type="fixed">
        <!--父级 link-->
        <parent link="base_footprint" />
        <!--子级 link-->
        <child link="base_link" />
        <!--设置偏移量-->
        <origin xyz="0 0 0.05" rpy="0 0 0"/>
    </joint>

    <!--3.关节-->
    <joint name="camera2base" type="continuous">
        <!--父级 link-->
        <parent link="base_link" />
        <!--子级 link-->
        <child link="camera" />
        <!--设置偏移量-->
        <origin xyz="0.12 0 0.05" rpy="0 0 0"/>
        <!--设置关节旋转参考的坐标系-->
        <axis xyz="0 0 1" />
    </joint>
</robot>

demo04_base_footprint.launch

<launch>
    <!--1.在参数服务器载入 urdf 文件-->
    <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo04_base_footprint.urdf" />
    <!--2.启动 rviz-->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz"/>

    <!--
        只有上述两条语句:
            表现:设置头显示位置与颜色异常
            提示:No transform from [camera] to [base_link] 缺少 camera 到 base_link 的坐标变换
            原因:rviz 中显示 urdf 时,必须发布不同部件之间的 坐标系 关系
            解决:ROS 中提供了关于机器人模型显示的坐标系发布相关节点(两个)

    -->
    <!--关节状态发布节点-->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher"/>
    <!--机器人状态发布节点-->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>
</launch>

遇到问题以及解决

问题1:

命令行输出如下错误提示

UnicodeEncodeError: 'ascii' codec can't encode characters in position 463-464: ordinal not in range(128)
[joint_state_publisher-3] process has died [pid 4443, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:=joint_state_publisher __log:=/home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3.log].
log file: /home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3*.log

rviz中提示坐标变换异常,导致机器人部件显示结构异常

原因:编码问题导致的

解决:去除URDF中的中文注释

问题2:[ERROR] [1584370263.037038]: Could not find the GUI, install the 'joint_state_publisher_gui' package

解决:

sudo apt install ros-noetic-joint-state-publisher-gui
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40875849/article/details/119955951

智能推荐

达观数据携手CCF举办第五届“达观杯”自然语言处理文本分类竞赛 ,开赛报名中!_第五届“达观杯”自然语言处理算法竞赛链接-程序员宅基地

文章浏览阅读343次。作为国内领先的智能文本处理企业,达观数据主办发起“达观杯”人工智能算法竞赛,每年一届,至今已成功举办四届。2021年,在CCF(中国计算机学会)自然语言处理专业委员会的特别支持下,第五届“达观杯”于7月正式拉开帷幕。本届“达观杯”为自然语言处理算法竞赛,围绕“基于大规模预训练模型的风险事件标签识别”的主题展开,积极推动国内NLP技术创新,努力拓展更多应用场景。赛题背景在大数据和人工智能技术加持下,不同行业的新兴风险控制手段也在高速发展。但这些风险信息散落在互联网的海量资讯中,如果可以及..._第五届“达观杯”自然语言处理算法竞赛链接

string.Format C#对字符串的格式化_asp mvc 怎么格式化货币符号-程序员宅基地

文章浏览阅读558次。【评论送书】机器学习、Spring MVC、Android CSDN日报20170508 ——《面试官谈游戏入行——面试和信仰》 CSDN技术直播:php实战微信公众号开发! string.Format对C#字符串格式化 标签: c#objectstringcbasic编译器2012-05-11 11:54 11748人阅读 评论(0)_asp mvc 怎么格式化货币符号

记一次 cdh6 service Connection refused 异常处理_cdh connectionrefused-程序员宅基地

文章浏览阅读5k次。cdh6 service启动遇到问题 :提示主机unhealthy打开日志显示的是............................Caused by: java.net.ConnectException: Connection refused (Connection refused).....................msg:Role not started due to unhealthy host...............................所有_cdh connectionrefused

(转)OpenResty(nginx+lua) 开发入门-程序员宅基地

文章浏览阅读129次。原文:https://blog.csdn.net/enweitech/article/details/78519398OpenResty 官网:http://openresty.org/ OpenResty - 中文官方站 http://openresty.org/cn/OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台。最重要的一点是它将lua/luaji..._cp: ‘html/’ and ‘/opt/openresty/nginx/html’ are the same file

网络带宽和质量测试小工具.iPerf3-程序员宅基地

文章浏览阅读7.6k次。网络图片最近在做监控视频系统建设和运维相关工作,其中有队友提出缺乏对网络线路带宽和质量的检查和监控手段。作为从业20多年的“资深”工程师,怎么能受得了“没办法”这样的结论呢,于是淡然推出iPerf3这个小工具。iPerf3是用于主动侦测IP网络上最大可实现带宽的工具。它支持时序、缓冲区、协议(TCP,UDP,SCTP与IPv4和IPv6)有关的各种参数。对于每个测试,它都会报告带宽,丢..._iperf3

【模板】Miller_Rabin 素数测试_miller-rabin 质数测试选数-程序员宅基地

文章浏览阅读530次。如同标题所述,Miller_Rabin 是用来测试一个数是否为素数的算法。然而,Miller_Rabin是有缺陷的,这就是它单次执行所得的结果并不完全正确,不过我们可以将这个算法多执行几次来让它的正确率趋近于 100%100%100\% 。ToolsToolsToolsFetmatFetmatFetmat 小定理:若 ppp 为素数,aaa 为正整数,且 (a,p)=1(a,p)=1(a..._miller-rabin 质数测试选数

随便推点

mask-RCNN 学习笔记1_mask rcnn的fps如何查看-程序员宅基地

文章浏览阅读776次。论文:https://arxiv.org/pdf/1703.06870.pdf摘要:我们提出了一个概念上简单,灵活,通用的对象实例分割框架。我们的方法有效地检测图像中的对象,同时为每个实例生成高质量的分割掩码。该方法称为Mask R-CNN,通过增加一个与现有分支并行的用于预测掩码对象的分支来增强Fast R-CNN的边界检测能力。 Mask R-CNN易于训练,比起Fast R-CNN只..._mask rcnn的fps如何查看

nginx if多条件判断_nginx if 多条件判断-程序员宅基地

文章浏览阅读5.1w次,点赞2次,收藏8次。原文出处:nginx 逻辑运算nginx的配置中不支持if条件的逻辑与&& 逻辑或|| 运算 ,而且不支持if的嵌套语法,否则会报下面的错误:nginx: [emerg] invalid condition。我们可以用变量的方式来间接实现。要实现的语句:if ($arg_unitid = 42012 && $uri ~/thumb/){ echo "www_nginx if 多条件判断

ptgui创建全景图设置_使用Microsoft图像合成编辑器创建高级全景图-程序员宅基地

文章浏览阅读969次。ptgui创建全景图设置Do you enjoy making panoramas with your pictures, but want more features than tools like Live Photo Gallery offer? Here’s how you can create amazing panoramas for free with the Microsoft ..._image composite editor

C#高级编程笔记--.Net体系结构_c#界面高级编程-程序员宅基地

文章浏览阅读887次,点赞15次,收藏23次。例如,Visual Basic 2008的Integer实际上是一个32位有符号的整数,它实际映射为中间语言类型Int32。因此在中间语言代码中就指定这种数据类型。C#编译器可以使用这种类型,所以就不会有问题了。在源代码中,C#用关键字int来表示Int32,所以编译器就认为Visual Basic 2008方法返回一个int类型的值。通用类型系统不仅指定了基本数据类型,还定义了一个内容丰富的类型层次结构,其中包含设计合理的位置,在这些位置上,代码允许定义它自己的类型。_c#界面高级编程

无人机视觉挑战赛 | ICCV 2019 Workshop—VisDrone2019-程序员宅基地

文章浏览阅读4.3k次。VisDrone 2019The VisDrone 2019 Challenge will be held on the ICCV 2019 workshop "Visi..._visdrone2019

springcloud 前后端分离 登录用户信息获取_springcloud zuul 获取当前登录用户及用户名-程序员宅基地

文章浏览阅读8.7k次。http://www.cnblogs.com/domi22/p/9248536.html_springcloud zuul 获取当前登录用户及用户名

推荐文章

热门文章

相关标签