1.ros命令行使用
-
rosnode
rosnode list 列出节点信息
rosnode info + 节点 打印节点信息
-
rostopic
list 查看话题
echo 查看话题内容
- rosmsg
与发布的话题消息相关的内容
- rosservice
服务相关内容
- rosbag
数据记录:rosbag record -a -O 压缩的数据包名
数据复现:rosbag display 压缩的数据包名
2.工作空间及功能包的创建
工作空间:
- src: 代码空间
- build: 编译空间
- devel:开发空间
- install: 安装空间
创建工作空间步骤:
1.创建工作空间:
-
mkdir -p ~/工程文件名/src
-
cd ~/工程文件名/src
-
catkin_init_workspace
2.编译工作空间
- cd ~/工程文件名/
- catkin_make
3.设置环境变量
- source devel/setup.bash
创建功能包步骤:
1.创建功能包
- cd ~/工程文件名/src
- catkin_create_pkg 功能包名字 依赖1std_msgs 依赖2rospy 依赖3roscpp
2.编译功能包
- cd ~/工程文件名
- catkin_make
- source devel/setup.bash
- 或者在终端输入(该方法只需要输入一次)
echo “source ~/工程名/devel/setup.bash” >> ~/.bashrc
3.编译规则
在工程名/src/功能包下的CMakeLists.txt中修改
###########
## Build ##
###########
include_directories(
include
${catkin_INCLUDE_DIRS}
)
#在该板块的最下方
# 将程序文件编译成可执行文件
add_executable(可执行文件名 src/程序文件名1.cpp src/程序文件名2.cpp)
# 可执行文件依赖catkin库
target_link_libraries(可执行文件名 ${catkin_LIBRARIES})
#如果要使用自定义的消息需要添加 可执行文件与动态生成的程序产生依赖关系
add_dependencies(可执行文件名 ${PROJECT_NAME}_generate_messages_cpp)
3.话题消息、发布者、订阅者
1.话题消息
- 定义.msg文件 位置放在 功能包文件名/msg文件夹下
string name uint8 sex uint8 age uint8 class
- 在package.xml中添加编译与执行功能依赖包 语法置于最下方的<export>上方
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
- 在CMakeLists.txt中添加编译选项
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs #添加依赖 message_generation )
################################################ ## Declare ROS messages, services and actions ## ################################################ #该板块的最下方 add_message_files(FILES 文件名.msg) #编译该文件 generate_messages(DEPENDENCIES std_msgs) #编译时依赖的功能包
################################### ## catkin specific configuration ## ################################### catkin_package( # INCLUDE_DIRS include # LIBRARIES test_package CATKIN_DEPENDS roscpp rospy std_msgs message_runtime # DEPENDS system_lib )
编译完使用时包含路径及头文件
-
定义变量
#include"功能包名/头文件名.h" 功能包名::头文件名 变量名; 变量名.成员;
2.发布者
#include<ros/ros.h>
#include<功能包名/头文件名.h> //数据类型
int main(int argc, char**argv)
{
ros::init(argc,argv,"节点名称"); //初始化节点,一般一个节点就是一个进程代表一个功能
ros::NodeHandle n; //创建节点句柄
ros::Publisher pub = n.advertise<消息类型>("话题名","10"); //10为队列长度
ros::Rate loop_rate(10); //设置循环频率
//定义一个数据变量
功能包名::头文件名 变量名;
while(ros::ok())
{
//功能包名::头文件名::变量名
std_msgs::Float64MultiArray 变量名;
变量名.data.resize(3);
//封装数据
变量名.data[0] = 值;
//发布数据
pub.publish(变量名);
//按照设定频率循环
loop_rate.sleep();
//循环等待回调函数 如果队列中有数据就会直接进入回调函数,没有数据会接着执行其他程序,不会阻塞
ros::spinOnce();
}
}
3.订阅者
#include<ros/ros.h>
#include<功能包名/头文件名.h> //数据类型
//订阅者的回调函数 接收到数据后进入回调函数解析数据
void sub_callback( 功能包名::头文件名::ConstPtr &变量名)
{
变量 = 变量名.date[0];
}
int main(int argc, char**argv)
{
ros::init(argc,argv,"节点名称"); //初始化节点,一般一个节点就是一个进程代表一个功能
ros::NodeHandle n; //创建节点句柄
ros::Subscriber sub = n.subscribe("话题名", 10, sub_callback);
ros::spin();//等待回调函数 如果队列中有数据就会直接进入回调函数,队列没有数据也会一直等待,直到队列有数据后再次进入回调函数,不会执行其他程序。若想执行其他程序使用ros::spinOnce()搭配while循环
}
4.launch文件
-
启动节点
<launch> <node pkg="节点所在功能包名称" type="节点可执行文件名称" name="节点运行时名称” output="screen" launch-prefix = "gnome-terminal -e"/> </launch>
-
参数设置
##把launch文件中的一些参数直接设置到rosmaster(ros中的节点管理器) #设置单个参数 <param name="参数名" value="参数值"/> #加载参数文件中的多个参数 <rosparam file="$(find yalm文件所在的功能包名)/文件名/参数文件名.yaml" command="load"/> ##launch脚本内部使用的参数键值对 <arg name="参数名" default="参数值"/> #调用 <param name = "名字" value = "$(arg 参数名)"/> #上面arg的键值对 <node name = "名字" pkg = "package" type="type" args ="$(arg 参数名)" />
-
重映射
<remap from="原名字" to="新名字"/>
-
嵌套
#file 其他launch文件的路径 <include file="$(find launch功能包名)/launch/文件名.launch"/>
-
launch文件的使用步骤
- cd ~/工程文件名/src
- catkin_create_pkg launch功能包名字
- cd ~/工程文件名/src/launch功能包名字
- mkdir -p launch
- 编写lauch文件
- roslaunch launch功能包名字 文件.launch