需要注意的点:
------
1、单片机读取编码器脉冲时采用外部中断方式的缺点,由于脉冲频率较高,单片机频繁进入外部中断,出现了程序卡死在外部中断里的现象。
2、在订阅小海龟话题时:创建功能包需要依赖的功能包: roscpp rospy std_msgs ==turtlesim==
## 1、上位机部分
通过wifi和下位机进行通信,
------
## 2、树莓派模块
### 2.1、ssh连接树莓派
假设在虚拟机上建立好了一个ROS工作空间(文件夹),功能包编译执行都没问题,我们将此文件夹通过ssh上传到树莓派,在树莓派上编译时出现了错误,此时,我们需要在在树莓派上重新建立一个工作空间,把功能包单独拷到新的工作空间下,编译才会成功。
### 2.2、HDMI转USB图像采集卡模块
用HDMI转USB图像采集卡模块可以采集树莓派的输出图像,步骤是用HDMI线接在树莓派和采集卡之间,将采集卡插在电脑上,打开相机,摄像头转为后置摄像头,就可以看见树莓派的桌面了。
### 2.3、分布式框架
概念:ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点,根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信。
**(1)准备:**
- 所有端口上的所有机器之间必须有完整的双向连接。
- 每台计算机必须通过所有其他计算机都可以解析的名称来公告自己。
- 先要保证不同计算机处于同一网络中,最好分别设置固定IP,如果为虚拟机,需要将网络适配器改为**桥接模式**;
**(2)流程**
- 分别修改不同计算机的 /etc/hosts 文件,在该文件中加入对方的IP地址和计算机名。
```
主(从)机的IP 主(从)机计算机名
```
- 设置完毕,可以通过 ping 命令测试网络通信是否正常。
```
IP地址查看名: ifconfig
计算机名称查看: hostname
测试是否和对方连通:ping IP地址(计算机名称)
```
- 在主机端~/.bashrc 文件后追加
```
export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=主机IP
```
- 在从机端~/.bashrc 文件后追加:==从机可以有多台,每台都做如下设置:==
```
export ROS_MASTER_URI=http://主机IP:11311
export ROS_HOSTNAME=从机IP
```
构建好分布式框架之后,需要在树莓派端(主机)启动roscore(**必须主机端启动roscore**),不然会报错。
> (If you wanted to use a roscore on your workstation to work, while the turtlebot isn't running, you have to change your ROS_MASTER_URI to the name or IP of your workstation.)
注意搭建分布式框架在填写ip地址时,电脑(从机)端的ip地址每开一次机可能会变化,用ifconfig命令可以查看ip地址。
> 取消分布式框架,只需要把上面添加的那些语句用#注释就可以
### 2.4、话题订阅
```
// 4.创建订阅者对象,回调函数处理订阅的数据
ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,doPose);
**注意这条语句不要放在while()循环里面**
```
- ros::spin()被动的接收topic,或者说纯粹的接收topic.
- ros::spinOnce()可以根据自己的需求设置接收频率。更加主动灵活。
```c
ros::Rate loop_rate(10);
while(ros::ok())
{
// can add some function
ros::spinOnce();
loop_rate.sleep();
}
```
如果退化成下面这样的化,其实和ros::spin()是一样的。
```c
while(ros::ok())
{
ros::spinOnce();
}
```
从上面的对比中,其实可以看出,ros::spin()和ros::spinOnce() 还有一个重要的区别就是:
> ros::spinOnce() 可以配合其它函数,一起放在while循环中处理。也就是说,当程序中除了响应回调函数还有其他重复性工作的时候,那就在循环中做那些工作,然后调用ros::spinOnce()。
![image](https://pic3.zhimg.com/v2-5d17549170a603f3939c65bf27f090b2_r.jpg)
------
## 3、STM32模块
### 3.1、ROS机器人的硬件连接:
STM32串口+TTL转USB模块(CH340)+ Linux硬件设备(树莓派\PC\TX2等等)线路连接:
> STM32的TXT、RXT和GND与ttl转USB模块的RXT、TXT和GND相接,USB接树莓派
![image](https://pic1.zhimg.com/v2-f5cc0f89fd3c4b6bfe163ab59a525af4_r.jpg)
确保装载Linux系统的设备,具有CH340\CH341的驱动,一般都有,但是TX2板子自带的系统就没有。