目录
1.如何创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws 进入到工作空间,cd 进入 cd ..退出
catkin_make编译工作空间
2.如何创建功能包
catkin_create_pkg 功能包名字 依赖项
cd ~/catkin_ws/src
catkin_create_pkg test-py rospy 备注:该包依赖已存在的rospy包,下可以执行python文件
3.ros工作空间介绍
src文件夹叫源文件空间:放置功能包、项目、克隆包等
build文件夹叫做编译空间,CMake和catkin为功能包和项目保存缓存信息和配置
devel 叫做开发空间,保存编译后的程序
4.简单的创建订阅与接收节点(python)
cd ~/catkin_ws/src/test-py/src
touch topic_publisher.py
touch topic_subscriber.py
创建两个python文件(也可以右键创建,直接起名字)
打开
gedit topic_publisher.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
rospy.init_node('topic_publisher')
pub=rospy.Publisher('counter',Int32)
rate=rospy.Rate(2)
count=0
while not rospy.is_shutdown():
pub.publish(count)
count+=1
rate.sleep()
同样topic_subscriber.py
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
def callback(msg):
print msg.data
rospy.init_node('topic_subscriber')
sub=rospy.Subscriber('counter',Int32,callback)
rospy.spin()
cd ~/catkin_ws
catkin_make
Ctrl+shift+T 打开新终端
运行roscore可理解为ros运行的底层支持
roscore
点击上边切回原来终端:
cd ~/catkin_ws
source devel/setup.bash 备注:ros可创建很多工作区,执行哪个工作区就需要执行此命令
rosrun test-py topic_publisher.py
找到文件右键->权限->执行勾选允许作为程序执行文件
5.查看节点数据
Ctrl+shift+T
rostopic list 备注:查看当前运行的节点,counter 与topic_publisher里的代码 置pub=rospy.Publisher('counter',Int32)
rostopic echo /counter 查看某一节点数据
其他功能 rostopic -h
运行订阅节点
cd ~/catkin_ws
source devel/setup.bash
rosrun test-py topic_subscriber.py 备注与其回调函数有关def callback(msg): print msg.data 当节点接收到数据就会进行打印
查看节点关系图
Ctrl+shift+T
rqt_graph
图像话查看数据
rqt
一般在运行一个功能空间时,要先输入source ~/catkin_ws/devel/setup.bash
打开新终端输入:
sudo gedit .bashrc
在最后面添加 source ~/catkin_ws/devel/setup.bash
就可直接运行
7.创建(.cpp)节点
创建节点,打开新终端 ctrl+alt+T
cd ~/catkin_ws/src
catkin_create_pkg test-cpp roscpp std_msgs 备注:该包依赖roscpp,可以执行c++文件,此方法生成的文件不用修改.xml文件
cd test-cpp/src
touch a.cpp 创建一个.cpp文件
节点名node_a
发布消息程序如下
#include "ros/ros.h" //包含了使用ROS节点的必要文件
#include "std_msgs/String.h" //包含了使用的数据类型
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_a"); //初始化ROS,节点名命名为node_a,节点名必须保持唯一
ros::NodeHandle n; //实例化节点, 节点进程句柄
ros::Publisher pub = n.advertise<std_msgs::String>("str_message", 1000); //告诉系统要发布话题了,话题名为“str_message”,类型为std_msgs::String,缓冲队列为1000。
ros::Rate loop_rate(10); //设置发送数据的频率为10Hz
//ros::ok()返回false会停止运行,进程终止。
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss<<"Hello World";
msg.data = ss.str();
ROS_INFO("node_a is publishing %s", msg.data.c_str());
pub.publish(msg); //向话题“str_message”发布消息
ros::spinOnce(); //不是必须,若程序中订阅话题则必须,否则回掉函数不起作用。
loop_rate.sleep(); //按前面设置的10Hz频率将程序挂起
}
return 0;
}
接受节点文件名b.cpp,节点名node_b
#include "ros/ros.h"
#include "std_msgs/String.h"
//话题回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("node_b is receiving [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "node_b"); //初始化ROS,节点命名为node_b,节点名必须唯一。
ros::NodeHandle n; //节点句柄实例化
ros::Subscriber sub = n.subscribe("str_message", 1000, chatterCallback); //向话题“str_message”订阅,一旦发布节点(node_a)在该话题上发布消息,本节点就会调用chatterCallbck函数。
ros::spin(); //程序进入循环,直到ros::ok()返回false,进程结束。
return 0;
}
编号程序,想要节点运行,还需在编写 CMakeLists,txt文件,在末尾添加如下
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(test_a src/a.cpp)
add_executable(test_b src/b.cpp)
target_link_libraries(test_a ${catkin_LIBRARIES})
target_link_libraries(test_b ${catkin_LIBRARIES})
在终端中输入
cd ~/catkin_ws
catkin_make
8.如何用.launch 同时运行多个节点
在功能包下创建一个专门放launch文件的包
cd ~/catkin_ws/src/test-cpp
mkdir launch
cd launch
touch a.launch
gedit a.launch
<launch>
<node name="test_a" pkg="test-cpp" type="test_a"/>
<node name="test_b" pkg="test-cpp" type="test_b"/>
</launch>
cd ~/catkin_ws
source devel/setup.bash
roslaunch test-cpp a.launch
9.安装vim 应用
cd 到文件夹目录
vim 文件名.launch
按i可以编辑
退出按esc,按
:w 保存
:q 退出
10.录数据
rosbag record /counter 结束后会有包名,录制传感器数据
rosbag info 包名.bag 包名根据上述文件结果更改,查看录包大小数据
rosbag play 包名.bag 包名根据回放数据进行更改,可以将传感器数据回放,进行仿真
11.查看指令历史
history
12. 查看当前串口连接
ls /dev | grep USB
13. 查看程序包
rospack list
14.远程访问
ssh 用户名@IP地址
15.远程数据复制
scp 用户名@IP地址:~/文件名 ./
16.锁存话题
一条消息发布的时候,如果没有及时订阅它的消息,将错过这个消息。对于大文件改变不大的文件,如Map等,可使用锁存话题的方法解决问题。当话题为锁存状态时,订阅者在完成订阅后会自动获取话题发布的最后一个消息,锁存的话题为需要广播消息的话题,方法如下:
pub=rospy.Pushlisher('map',nav_msgs/OccupancyGrid,latched=True)
17.下载的程序自动添加依赖
rosdep install --from-paths src --ignore-src --rosdistro kinetic