仿真之URDF

  • 1.3.1 HelloWorld实现简介

ROS中涉及的编程语言以C++和Python为主,ROS中的大多数程序两者都可以实现,在本系列教程中,每一个案例也都会分别使用C++和Python两种方案演示,大家可以根据自身情况选择合适的实现方案。

ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:

  1. 先创建一个工作空间;
  2. 再创建一个功能包;
  3. 编辑源文件;
  4. 编辑配置文件;
  5. 编译并执行。

上述流程中,C++和Python只是在步骤3和步骤4的实现细节上存在差异,其他流程基本一致。本节先实现C++和Python程序编写的通用部分步骤1与步骤2,1.3.2节和1.3.3节再分别使用C++和Python编写HelloWorld。

1.创建工作空间并初始化
mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make

上述命令,首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译。

2.进入 src 创建 ros 包并添加依赖
cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

上述命令,会在工作空间下生成一个功能包,该功能包依赖于 roscpp、rospy 与 std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。


注意: 在ROS中,虽然实现同一功能时,C++和Python可以互换,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言:C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS设计者分别设计了roscpp与rospy库,前者旨在成为ROS的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。

有关roscore系统部分

获取ROS_DISTRO------->ROS版本号

​ 终端1:roscore

终端2:1. rosparam list

​ 2.rosparam get rosdistro

1.311.3.1 HelloWorld实现简介

  1. 先创建一个工作空间;
    1. 建立一个自定义名称的工作空间,里面得有src文件夹
    2. 进入这个自定义的空间名称后使用catkin_make 进行编译
  2. 再创建一个功能包;
    1. 功能包在src目录下,catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
  3. 编辑源文件;
  4. 编辑配置文件;
  5. 编译并执行。

自定义ROS包名(catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs) hwnd

rosrun 包名 C++节点 rosrun hwnd haha(haha是add_executable一行里面的第一个参数)

add_executable(haha src/hellovscode_c.cpp)#这里的第一个参数是指的是节点的名字,第二个是该节点执行的cpp文件

target_link_libraries(haha
${catkin_LIBRARIES}
)#这里的是上面的设置的节点的名字

话题通讯(发布订阅模式) (订阅服务号,作者推送,个人接收)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存失败,源站可能有防盗链机制,建议将图片保存下来直接上传上传(imwgsxQq-LzP-1655177438696)(D:\ROS\image-20220516164906566.png)(D:\ROS\image-20220516164906566.png)]

实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 发布者 对象
        5.组织被发布的数据,并编写逻辑发布数据

案例二:自定义信息

自定义msg信息

错误1:Person.msg里面 float32 而不是float

错误2:add_dependencies(demo03 ${PROJECT_NAME}generatemessages_cpp) 这里的messages带s

服务通讯
在这里插入图片描述

实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 发布者 对象
        5.组织被发布的数据,并编写逻辑发布数据

案例二:自定义信息

自定义msg信息

错误1:Person.msg里面 float32 而不是float

错误2:add_dependencies(demo03 ${PROJECT_NAME}generatemessages_cpp) 这里的messages带s

2.通讯 三种通讯方式

2.1服务通信(请求响应模式) (浏览器 输入网址)

在这里插入图片描述

2.2服务通信(请求响应模式) (浏览器 输入网址)

2.3参数服务器(参数共享模式) (大家去公司的食堂吃东西 注重共享)
2.3.1主要的涉及到的角色
ROS Master (管理者)
Talker (参数设置者)
Listener (参数调用者)

P246244仿真之URDF_练习01_框架搭建-机器人

在这里插入图片描述
1.新建urdf文件,并于launch文件集成
2.搭建底盘
3.在底盘上

1.新建launch文件

<launch>
 <!-- 1.在参数服务器中添加URDF -->
<param name = "robot_description" textfile="$(find urdf_rviz)/urdf/urdf/demo05_test.urdf"/>
 <!-- 2.启动RVIZ -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf_rviz)/config/show_mycar.rviz"/>
<!-- 3.添加关节状态发布节点 -->
<node pkg="joint_state_publisher"  name="joint_state_publisher" type="joint_state_publisher"/>
<!-- 4.添加机器人状态发布节点 -->
<node pkg="robot_state_publisher"  name="robot_state_publisher" type="robot_state_publisher"/>
<!-- 5.关节运动控制节点 -->
<node pkg="joint_state_publisher_gui"  name="joint_state_publisher_gui" type="joint_state_publisher_gui"/>
</launch>

注意这里的功能包前后不要加空格,不然会报错

2.新建urdf文件

<robot name = "mycare">
        <!-- 1.添加case_footprint -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius = "0.01"/>

            </geometry>

        </visual>
    </link>

</robot>

注意这里每次改完之后需要source一下,然后才运行

P247
245仿真之URDF_练习02_添加底盘-机器人系
底盘的主要参数:
形状:圆柱
半径:0.1m
高度:0.08m
离地间距:0.015m

1.添加link标签 这里的是圆柱体 主要用到的标签有1.形状 2.偏移量 3.材质

<!-- 2.1 link -->
<link name="base_link">
    <visual>
        <geometry>
            <cylinder radius="0.1" length="0.08"/>
        </geometry>
        
        <origin xyz="0 0 0" rpy="0 0 0"/>

        <material name="baselink_color">
            <color rgba="1.0 0.5 0.2 0.5"/>
        </material>

    </visual>
</link>

2.添加关节
1.关节名字 固定类型
2.设定父级连杆
3.设定子级连杆
4.偏移量 因为关节是两个的中心相连的,所以要将圆柱体高度的二分之一+偏移量

    <!-- 2.2joint -->
<joint name="link2footprint" type="fixed">
    <parent link="base_footprint"/>

    <child link="base_link"/>

    <origin xyz="0 0 0.055" rpy="0 0 0"/>

</joint>

P248
246仿真之URDF_练习03_偏移量设置问题
偏移量的设置
1.在连杆上设置偏移量与在关节上设置偏移量
最好是在关节上设置偏移量 这样子TF数据都在各个连杆的中心位置
在关节上设置偏移量

如果在连杆上设置偏移量,关节不设置偏移量,那么他们的坐标系会重叠

P249
247仿真之URDF_练习04_驱动轮添加

<!-- 3.添加驱动轮   半径3.25cm  轮胎宽度1.5cm-->    
    <!-- 
        形状:圆柱
        半径:0.325
        长度:1.5
     -->

     <!-- 左轮 -->
     <link name="left_wheel">
    <visual>
        <geometry>
            <cylinder radius="0.0325" length="0.015"/>
        </geometry>


        <!-- 沿着x轴翻滚90度 -->
        <origin xyz="0 0 0" rpy="1.5708 0 0"/>

        <material name="wheel_color">
            <color rgba="0 0 0 0.3"/>
        </material>

    </visual>
</link>

<!-- 右轮 -->
<link name="right_wheel">
    <visual>
        <geometry>
            <cylinder radius="0.0325" length="0.015"/>
        </geometry>


        <!-- 沿着x轴翻滚90度 -->
        <origin xyz="0 0 0" rpy="1.5708 0 0"/>

        <material name="wheel_color">
            <color rgba="0 0 0 0.3"/>
        </material>

    </visual>
</link>


<joint name="lefttolink" type="continuous">
        <parent link="base_link"/>

        <child link="left_wheel"/>

<!-- 偏移量的计算 
        x    无偏移
        y   车体半径
        z   小车的中心-轮子的半径  因为轮子的坐标系相对于车体是负方向的,所以是负的
    
-->
        <origin xyz="0 0.1 -0.0225" rpy="0 0 0"/>

        <axis xyz="0 1 0"/>

    </joint>

<!-- 右车轮 -->
    <joint name="righttolink" type="continuous">
        <parent link="base_link"/>

        <child link="right_wheel"/>

<!-- 偏移量的计算 
        x    无偏移
        y   车体半径
        z   小车的中心-轮子的半径  因为轮子的坐标系相对于车体是负方向的,所以是负的
    
-->
        <origin xyz="0 -0.1 -0.0225" rpy="0 0 0"/>

        <axis xyz="0 1 0"/>

    </joint>

拖动滑块会卡顿解决方法:注释launch文件中的关节状态发布节点

添加前后轮

<!-- 4.添加万向论 -->
    <!-- 
        形状:球
        半径:0.0075m
     -->
     <!-- 4.1设置link -->
     <link name="front_wheel">
        <visual>
         <geometry>
              <sphere radius="0.0075" />
          </geometry>


           <!-- 沿着x轴翻滚90度 -->
           <origin xyz="0 0 0" rpy="0 0 0"/>

           <material name="wheel_color">
               <color rgba="0 0 0 0.3"/>
           </material>

           </visual>
    </link>

     <!-- 4.2设置joint -->
    <joint name="fronttolink" type="continuous">
        <parent link="base_link"/>

        <child link="front_wheel"/>
        <!-- 
            x 0.08
            y 0.08
            z 0.0075-0.055
         -->
        <origin xyz="0.08 0 -0.0475 " rpy="0 0 0"/>
        <axis xyz="0 1 0"/>

    </joint>


    <link name="back_wheel">
        <visual>
         <geometry>
              <sphere radius="0.0075" />
          </geometry>


           <!-- 沿着x轴翻滚90度 -->
           <origin xyz="0 0 0" rpy="0 0 0"/>

           <material name="wheel_color">
               <color rgba="0 0 0 0.3"/>
           </material>

           </visual>
    </link>

     <!-- 4.2设置joint -->
    <joint name="backtolink" type="continuous">
        <parent link="base_link"/>

        <child link="back_wheel"/>
        <!-- 
            x 0.08
            y 0.08
            z 0.0075-0.055
         -->
        <origin xyz="-0.08 0 -0.0475 " rpy="0 0 0"/>
        <axis xyz="0 1 0"/>

    </joint>

6.3.5 URDF工具
在 ROS 中,提供了一些工具来方便 URDF 文件的编写,比如:

check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题

urdf_to_graphiz命令可以查看 urdf 模型结构,显示不同 link 的层级关系

当然,要使用工具之前,首先需要安装,安装命令:sudo apt install liburdfdom-tools

1.check_urdf 语法检查
进入urdf文件所属目录,调用:check_urdf urdf文件,如果不抛出异常,说明文件合法,否则非法

2.urdf_to_graphiz 结构查看
进入urdf文件所属目录,调用:urdf_to_graphiz urdf文件,当前目录下会生成 pdf 文件
evince mycare.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值