ROS中涉及的编程语言以C++和Python为主,ROS中的大多数程序两者都可以实现,在本系列教程中,每一个案例也都会分别使用C++和Python两种方案演示,大家可以根据自身情况选择合适的实现方案。
ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:
- 先创建一个工作空间;
- 再创建一个功能包;
- 编辑源文件;
- 编辑配置文件;
- 编译并执行。
上述流程中,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实现简介
- 先创建一个工作空间;
- 建立一个自定义名称的工作空间,里面得有src文件夹
- 进入这个自定义的空间名称后使用catkin_make 进行编译
- 再创建一个功能包;
- 功能包在src目录下,
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
- 功能包在src目录下,
- 编辑源文件;
- 编辑配置文件;
- 编译并执行。
自定义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