ROS节点程序运行过程中需要获取机器人的传感器信息和发送控制指令,因此不可避免要与机器人进行通信,常见的通讯方式有串口、CAN和网口等,其中串口最为普遍。
ROS通过自带的 serial 包连接串口设备,进行串口通信,需要提前安装 serial 包:
sudo apt-get install ros-melodic-serial
串口通信根据数据传输方向可以分为 串口发送 和 串口接收 。
通过串口发送数据时,需要明确发送机制,常见的发送机制有:
定时发送是通过设定定时器,以 固定频率 发送数据包;
触发条件发送是通过条件判断语句,判断某个标志位或某个事件发生后,再发送数据包,特点是 频率不固定 。
发送数据分为两个步骤:
由此可知buffer数据结构需要可同时被这两个步骤访问,buffer需要为全局变量。
首先根据通信协议定义buffer中的帧头、帧尾等固定内容,然后接收别的Topic,获取待发送数据,把获取的数据填入到协议的数据段,最后根据数据段计算校验码。
1 订阅发送数据的Topic
serial_sub = nhsubscribe("/joy", 10, &DecodeFrame::serial_sub_callback,this);
2 根据Topic填入数据段和校验
1 创建定时回调函数
首先需要创建一个定时器,设定发送频率,并指定回调函数名称
write_rs232_timer = nhcreateTimer(ros::Duration(001), &DecodeFrame::CB_write_rs232_Cycle, this);
2 通过 serial 将buffer数据写入串口设备
实例化串口对象,并打开串口
发送数据到串口设备上
注意1:发送数据节点挂掉
若发送数据Topic的节点挂掉后,由于buffer是全局变量,buffer的数据段会一直是上一帧的数据,不会再改变,为避免上述情况,在将数据写入串口设备后, 将数据段清零。
注意2:joystick包发送机制
在使用PS3/PS4、Xbox手柄时,使用ros-melodic-joy包获取摇杆数据,手柄的遥杆或者按键如果一直处于同一位置(初始零位和最大值)只会发送一帧数据,不会连续发送, 只有当摇杆数据变化时,才会发送数据。
因此使用 rostopic hz /joy 会显示没有msg信息传输,所以串口程序不会进回调函数获取发送数据,但是数值确实是一直保持的, 所以就不能将数据段清零。
触发条件发送与定时发送相比的最大不同之处在于发送频率不同,不需要设置定时器,在满足条件后直接将数据写入串口即可。
因为建立的是一个非常简单的机器人,所以我们尽量使用简单的元素:使用长方体代替车模,使用圆柱代替车轮,具体尺寸如下:
准备:
1创建Rospackage命名为smartcar
catkin_create_pkgsmartcar std_msgs rospy roscpp urdf
2建立文件夹launch和urdf分别用来存放launch文件和urdf文件
三、建立urdf文件
在smartcar文件夹下建立urdf文件夹,创建智能车的描述文件smartcarurdf,描述代码如下:
<xml version="10">
<robot name="smartcar">
<link name="base_link">
<visual>
<geometry>
<box size="025 16 05"/>
</geometry>
<origin rpy="0 0 157075" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 0 8 1"/>
</material>
现在还只是个草稿,后面会陆续更新改正,保证大家一看就会,绝对不废
只是帮助大家理解,很多知识点只是类比推理,是有错误的,哈哈,勿喷
蛮多人在学习ROS的时候,其实还是不太理解什么是ROS,为什么要去ROS,以及怎么样去学习ROS,我大二的时候开始接触到ROS,也经历过比较痛苦的一段时间,所以希望用这篇文章来帮助大家对ROS有一个较好的理解。
首先我们抛开ROS来说,如果我们要写一个程序,程序需要完成特定的功能,就拿C语言中的加法函数来说吧。我们定义了一个加法函数,输入两个整数最后返回两个整数的和,然后定义完函数以后,在main()函数里调用这个加法函数,就可以在键盘上输入两个整数,然后计算两个整数的和了。
那么问题来了 如果我要在别的程序需要使用加法函数所返回的值,应该怎么做呢?
一种方式 定义一个全局变量,将加法函数返回的值赋给这个全局变量,那么在一个工程文件下的程序都可以使用这个全局变量了,这就达到了其他程序使用这个变量的目的了
那么问题又来了,如果不是在同一个工程目录下的程序,要怎么样才能使用到这个加法函数的返回值呢?
一种方式 将第一个程序的加法返回值写到一个文档中,然后其他程序去读这个文件,这样也可以达到使用这个数据的目的了
上面的例子,想给大家传递的知识点就是 我们在写程序的时候,大多数人是只有一个main()函数的,也就是只有一个可执行文件,那么问题就来了,要是不同的main()函数之间需要相互使用对方的数据,那应该怎么办呢,这就引申出了程序与程序之间到交流问题,也就是通信问题。这也是ROS里面我个人觉得必须首先要搞清楚的问题。大家先理解到这个地方,然后往下看。
开始进入主题 到底什么是ROS,ROS就是Robot Operating System 的缩写,这大家都知道,对吧,翻译成中文也就是机器人 *** 作系统,可是除了这个大家对 *** 作系统是什么大家有了解过么,为什么需要 *** 作系统,也就是 *** 作系统能干什么,大家有简单的了解过么
*** 作系统(先空白,后面再填坑)
在了解 *** 作系统以后,我们就可以开始分析我们的机器人 *** 作系统了,话不多说,先放狗,不不不,先放图:
我们知道, *** 作系统本身也是一个软件,但是他的特殊之处在于能够完成对硬件的调配,而其他的应用软件,比如网易云,他如果想放歌,他需要打开播放器,是得需要 *** 作系统去完成的,它本身没有这个能力去直接打开播放器,而是对 *** 作系统说,大哥,能不能帮我打开一下播放器,求求你了,哈哈。
我们也知道,在win上安装了许许多多的软件,向上面的solidworks(三维制图软件),matalab(数据计算软件) QQ(聊天软件) 网易云 (听歌软件) 腾讯视频(播放软件)
那么问题又来了 你能让你的扣扣去跟网易云说 我想听歌,然后网易云就会打开播放么,当然你要是杠杆定理学得好,那我认了,哈哈,大多数人是应该是觉得这应该不可以,因为扣扣怎么跟网易云通信嘛,对吧。
所以我们安装在win上的各个软件只负责自己的问题,不会跟其他的软件有过多的交流。
哈哈,所以我有了一个大胆的想法,让我的电脑同时登录3个扣扣,那么这三个扣扣总该可以相互发消息了吧,没错,这就是我想要讲的东西,我只在我的电脑上安装三个软件 也就是3个扣扣软件,他们肯定是可以相互交流的。因为他们是同一类软件。
是的,ROS也是这么干的,在ROS上也安装了向扣扣这样的可执行程序,只不过在ROS中换了个说法,可执行程序叫做节点,这应该不拿理解吧。要记住在ROS上安装了许许多多的软件哦,也就是许许多多的可执行程序,也就是许许多多的节点,如果你现在理解了节点是什么了,那么恭喜你,已经迈出了一小步了,你说巧不巧,安装在ROS上的这些程序,它还可以相互通信,也就是相互交流,哈哈。
好了,理解到这一步呢就理解了节点是个什么东西了。
下面又开始了一个新的例子,我们的手机上有一个扣扣,我们需要和其他人聊天对吧,那么你知道你要和别人聊天需要先做什么么,你肯定说,登录账号加好友啊,不对的,首先要做的就是把腾讯的服务器打开,不然你登录不上去的,也就是说,腾讯的服务器不打开,你是登录不上扣扣的,只不过这一步不是我们 *** 作的,人家的服务器他已经给我门打开了,然后我们再登录扣扣,想一下,我们在登录的时候,做了什么,对吧,大家都知道,我们也就是输入账号密码就可以登录了吧对吧,这个过程呢就是向腾讯的服务器注册自己的信息,告诉腾讯服务器,我上线了,然后腾讯服务器就把你加入到注册表中,里面包含了你的一些信息,你想要和别人连天,那么别人是不是也要跟你一样,也要先登录,过程和你的一样,所以这个时候,腾讯服务器那边是已经有了你和你想要聊天的对象的一些信息的,比如ip地址之类的东西,这样,你想发消息给你的朋友(后面再填坑)
类比一下 服务器 就相当于ROS里面的ros master
只不过这个rosmaster需要我们自己开启而已。
事实上,ros并不是一个 *** 作系统,他并不能直接运行在硬件之上,只不过他把硬件做了一个给 *** 作系统的接口 和网易云一样 网易云大不了就使用一个喇叭呗,只不过ros使用了太多的硬件,比如激光雷达,相机,编码器,imu等等。
因此ROS本身也就是一个软件,和qq一样,运行在 *** 作系统之上,所不同的是,在ROS上又可以安装许许多多的同类软件,这些安装在ROS上的程序(节点)之间可以按照ROS所规定的通讯机制进行相互交流通讯。比如激光雷达节点(程序)通过ROS提供的接口,让 *** 作系统把激光数据传上来,交给建图所需要的Gmapping节点使用,然后Gmaping节点把所构建的地图给move_base节点使用,move_base节点的输入是一个速度和角度的命令,先由move_base下发给ros,然后ros下发给 *** 作系统,然后 *** 作系统调用硬件,在这里是电机,让电机按照ROS下发的速度的角速度进行运动
大家应该会有一点点理解了吧
总结下 就是ros是一个类似于win上的一个软件,但是这个软件上又安装了很多软件,在ros上安装的这些软件可以相互通信,然后可以借助ROS,去调用 *** 作系统去调用硬件。
这就是为什么我们每次想要聊天的时候,需要先打开qq这个软件,也就是我们想要用ROS的时候,先运行roscore这个命令打开ROS了吧
接下来是
ros中的通讯方式
ros中的一些工具
ros中的一些已经有了的功能包(算法)
慢慢写,不着急
1个。
一个ros节点相当于一个cpp文件,运行之后产生一个类似于exe的可执行文件。
ROS是一个分布式的进程,也就是节点框架,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信,
1 先建立工作空间~/catkin_ws
2 在工作空间~/catkin_ws下创建包pkg目录second
好处是通过创建包自动生成packagexml和CMakeListstxt
3 在second目录下创建hellocpp源代码文件
~~~~~~~~~~~~~~~~~~~~~~~~~~~
eagle:~/catkin_ws$ cd src
eagle:~/catkin_ws/src$ tree second/
second/
├── CMakeListstxt
├── packagexml
└── src
└── hellocpp
1 directory, 3 files
4 编写hellocpp文件
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <ros/rosh>
int main(int argc, char argv) {
ros::init(argc, argv, "helloros1234444");
ros::NodeHandle n;
ROS_INFO("Hello, ROS!");
ros::spinOnce();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 修改编译makefile文件 CMakeListstxt
~~~~~~~~~~~~~~~~~~
cmake_minimum_required(VERSION 283)
project(simple_examples)
find_package(catkin REQUIRED COMPONENTS roscpp)
catkin_package()
include_directories(include $catkin_INCLUDE_DIRS)
add_executable(hello hellocpp)
target_link_libraries(hello ${catkin_LIBRARIES})
~~~~~~~~~~~~~~~~~~
6 回到~/catkin_ws编译程序
liao@liao-eagle:~/catkin_ws$ catkin_make
Base path: /home/liao/catkin_ws
Source space: /home/liao/catkin_ws/src
Build space: /home/liao/catkin_ws/build
Devel space: /home/liao/catkin_ws/devel
Install space: /home/liao/catkin_ws/install
####
#### Running command: "make cmake_check_build_system" in "/home/liao/catkin_ws/build"
####
####
#### Running command: "make -j2 -l2" in "/home/liao/catkin_ws/build"
####
Scanning dependencies of target hello
[100%] Building CXX object second/CMakeFiles/hellodir/src/hellocppo
Linking CXX executable /home/liao/catkin_ws/devel/lib/second/hello
[100%] Built target hello
liao@liao-eagle:~/catkin_ws$
7 测试c++程序
71一个终端里运行roscore
72 另外一个终端里运行 rosrun second hello
liao@liao-eagle:~/catkin_ws$ rosrun second hello
[ INFO] [1442208641400826666]: Hello, ROS!
liao@liao-eagle:~/catkin_ws$ rospack find second
/home/liao/catkin_ws/src/second
liao@liao-eagle:~/catkin_ws$
望采纳
以上就是关于ROS串口通信简析(一)——串口发送全部的内容,包括:ROS串口通信简析(一)——串口发送、ubuntu下的机器人利用ros节点机制,怎么用qt create做3d仿真、ROS(机器人 *** 作系统)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)