1.创建存放代码的工作空间
新建文件夹,名字随意,一般以ws结尾 ,如catkin_ws,
在catkin_ws文件夹下新建文件夹src,我们所有的ros代码一般都放在这个文件夹下
2.创建功能包
//catkin_create_pkg (文件名称)(依赖项)
catkin_create_pkg example roscpp
3.创建cpp文件
在创建好的功能包文件夹下找到src文件夹,在该文件夹下新建cpp程序
touch example.cpp
用VS Code打开功能包
将ros头文件加载至vscode, Ctrl + shift + p,在命令行输入 C/C++,选择 C/C++:编辑配置(UI)
将ros头文件目录加载进来。
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/noetic/include/"//添加的目录
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
在example.cpp输入代码
#include<ros/ros.h>
#include<iostream>
int main(int argc,char** argv)
{
ros::init(argc,argv,"example");//初始化ros节点,双引号内为节点名称
ros::NodeHandle nh;//创建句柄,一般ros程序这两行是必须的
std::cout<<"hello ros!"<<std::endl;
return 0;
}
修改cmakelists.txt文件
add_executable(example_node src/example.cpp)
target_link_libraries(example_node ${catkin_LIBRARIES})
回到根目录(ctakin_ws文件下)下编译运行catkin_make
生成的可执行文件位置为:
ros/catkin_ws/devel/lib/example
4.设置环境变量
在执行可执行文件时需要设置环境变量,不能直接运行,打开终端输入:
注:此方法是临时性的,每次开一个新的终端都需要输入改命令
source devel/setup.bash
任意新打开一个终端输入roscore启动ros
回到环境变量的终端输入命令启动可执行文件
//rosrun +功能包名称+可执行文件名称
rosrun example example_node
运行成功:
5.设置循环
#include<ros/ros.h>
#include<iostream>
int main(int argc,char** argv)
{
ros::init(argc,argv,"example");//初始化ros节点,双引号内为节点名称
ros::NodeHandle nh;//创建句柄,一般ros程序这两行是必须的
ros::Rate rate(10);//休眠频率设置
while (ros::ok)
{
/* code */
std::cout<<"hello ros!"<<std::endl;
rate.sleep();//休眠
}
return 0;
}
重新编译运行就会循环打印hello ros!
输入命令:
rostopic list
可以看到当前话题
6.创建发布者
#include<ros/ros.h>
#include<iostream>
#include<geometry_msgs/Twist.h>//发布者头文件
int main(int argc,char** argv)
{
ros::init(argc,argv,"example");//初始化ros节点,双引号内为节点名称
ros::NodeHandle nh;//创建句柄,一般ros程序这两行是必须的
//这段代码是在 ROS 中创建一个名为 "pub_cmd" 的发布者(Publisher),用于发布 Twist 消息类型(geometry_msgs::Twist)到名为 "cmd_vel" 的话题(Topic)上
ros::Publisher pub_cmd=nh.advertise<geometry_msgs::Twist>("cmd_vel",10);//第一个是发布话题名称,第二个为发布的频率
ros::Rate rate(10);//休眠频率设置
while (ros::ok)
{
/* code */
std::cout<<"hello ros!"<<std::endl;
geometry_msgs::Twist cmd_vel;
cmd_vel.linear.x=10;
pub_cmd.publish(cmd_vel);//publish函数将数据发送出去
rate.sleep();//休眠
}
return 0;
}
此时运行rostopic list命令可以看到多了一个话题:cmd_vel
使用命令:
rostopic echo /cmd_vel
查看当前话题发布消息
使用命令:
rostopic hz /cmd_vel
查看当前话题发布的频率
7.创建订阅者
#include<ros/ros.h>
#include<iostream>
#include<geometry_msgs/Twist.h>//发布者头文件
//订阅者的回调函数
//cmdMsg 是一个 Twist 消息类型的变量,它用于存储从话题中接收到的 Twist 消息数据。
void cmdCallback(geometry_msgs::Twist cmdMsg)//) 这一行代码定义了一个名字为 cmdCallback 的函数,它接收一个 Twist 消息类型的参数 cmdMsg,返回值为 void,即该函数不返回任何数据。
{
std::cout<<cmdMsg.linear.x<<std::endl;
}
int main(int argc,char** argv)
{
ros::init(argc,argv,"example");//初始化ros节点,双引号内为节点名称
ros::NodeHandle nh;//创建句柄,一般ros程序这两行是必须的
//这段代码是在 ROS 中创建一个名为 "pub_cmd" 的发布者(Publisher),用于发布 Twist 消息类型(geometry_msgs::Twist)到名为 "cmd_vel" 的话题(Topic)上
ros::Publisher pub_cmd=nh.advertise<geometry_msgs::Twist>("cmd_vel",10);//第一个是发布话题名称,第二个为发布的频率
//创建订阅者
ros::Subscriber sub_cmd=nh.subscribe("cmd_vel",10,cmdCallback);//第一个是订阅者的话题,第二个是频率,第三个是回调函数
ros::Rate rate(10);//休眠频率设置
while (ros::ok)
{
/* code */
std::cout<<"hello ros!"<<std::endl;
geometry_msgs::Twist cmd_vel;
cmd_vel.linear.x=10;
pub_cmd.publish(cmd_vel);//publish函数将数据发送出去
rate.sleep();//休眠
ros::spinOnce();//这个是回调函数循环
}
return 0;
}
运行命令可以查看发布者和订阅者的信息
rosnode info /example
命令查看当前哪些节点在运行
rosnode list
--------------------------------------------------------常用功能(视觉slam)------------------------------------------------------------------
rosmsg show sensor_msgs/命令(传感器)--------------------------------------------
rosmsg show sensor_msgs/是ROS命令之一,用于显示ROS消息类型sensor_msgs的详细信息。该命令将会列出该消息类型中包含的成员变量(field),以及每个成员变量的名称、数据类型和含义。(这个包下面是一些传感器)
rosmsg show sensor_msgs/
Image:
具体各成员变量的含义如下:
std_msgs/Header header:消息头,包含时间戳、帧ID等信息。
uint32 seq:消息序列号,每收到一条消息该值自增1。
time stamp:消息时间戳,标记该消息的生成时间。
string frame_id:参考帧(reference frame)的ID,通常是一个字符串,代表该消息所在坐标系的名称。
uint32 height:图像高度(以像素为单位)。
uint32 width:图像宽度(以像素为单位)。
string encoding:编码方式,指定图像数据的格式。常见的编码方式包括"BGR8"、"RGB8"、"MONO8"等。
uint8 is_bigendian:数据字节序,用于指定该消息中的多字节数据所使用的字节序,常见的取值有0和1,表示小端字节序和大端字节序。
uint32 step:一行图像数据占用的字节数,通常等于width * 每个像素所占的字节数。
uint8[] data:图像数据,一个一维数组,存储了所有像素点的信息。具体格式由encoding字段决定。
Imu:
具体各成员变量的含义如下:
std_msgs/Header header:消息头,包含时间戳、帧ID等信息。
uint32 seq:消息序列号,每收到一条消息该值自增1。
time stamp:消息时间戳,标记该消息的生成时间。
string frame_id:参考帧(reference frame)的ID,通常是一个字符串,代表该消息所在坐标系的名称。
geometry_msgs/Quaternion orientation:姿态,由四元数表示。
float64 x:四元数的x分量。
float64 y:四元数的y分量。
float64 z:四元数的z分量。
float64 w:四元数的w分量。
float64[9] orientation_covariance:姿态协方差矩阵,描述姿态测量的不确定性。
geometry_msgs/Vector3 angular_velocity:角速度,由三个分量表示。
float64 x:x轴上的角速度,单位为弧度/秒。
float64 y:y轴上的角速度,单位为弧度/秒。
float64 z:z轴上的角速度,单位为弧度/秒。
float64[9] angular_velocity_covariance:角速度协方差矩阵,描述角速度测量的不确定性。
geometry_msgs/Vector3 linear_acceleration:线性加速度,由三个分量表示。
float64 x:x轴上的加速度,单位为米/秒^2。
float64 y:y轴上的加速度,单位为米/秒^2。
float64 z:z轴上的加速度,单位为米/秒^2。
float64[9] linear_acceleration_covariance:线性加速度协方差矩阵,描述线性加速度测量的不确定性。
rosmsg show nav_msgs命令(里程计数据等)
Odometry(里程计)
具体各成员变量的含义如下:
std_msgs/Header header:消息头,包含时间戳、帧ID等信息。
uint32 seq:消息序列号,每收到一条消息该值自增1。
time stamp:消息时间戳,标记该消息的生成时间。
string frame_id:参考帧(reference frame)的ID,通常是一个字符串,代表该消息所在坐标系的名称。
string child_frame_id:机器人坐标系的ID,也就是机器人的子坐标系名称。
geometry_msgs/PoseWithCovariance pose:机器人的位姿信息,由一个位姿和一个协方差矩阵组成。
geometry_msgs/Pose pose:机器人的位姿,由位置和四元数表示。
geometry_msgs/Point position:机器人在参考坐标系中的位置。
float64 x:位置的x分量。
float64 y:位置的y分量。
float64 z:位置的z分量。
geometry_msgs/Quaternion orientation:机器人的朝向,由四元数表示。
float64 x:四元数的x分量。
float64 y:四元数的y分量。
float64 z:四元数的z分量。
float64 w:四元数的w分量。
float64[36] covariance:位姿协方差矩阵,描述机器人位姿测量的不确定性。
geometry_msgs/TwistWithCovariance twist:机器人的速度信息,由一个速度和一个协方差矩阵组成。
geometry_msgs/Twist twist:机器人的速度,由线速度和角速度组成。
geometry_msgs/Vector3 linear:机器人的线速度(即平移速度),由三个分量表示。
float64 x:x轴上的线速度,单位为米/秒。
float64 y:y轴上的线速度,单位为米/秒。
float64 z:z轴上的线速度,单位为米/秒。
geometry_msgs/Vector3 angular:机器人的角速度,由三个分量表示。
float64 x:x轴上的角速度,单位为弧度/秒。
float64 y:y轴上的角速度,单位为弧度/秒。
float64 z:z轴上的角速度,单位为弧度/秒。
float64[36] covariance:速度协方差矩阵,描述机器人速度测量的不确定性。
rostopic list-------------------------------------------------------------------
这个命令是在 ROS (Robot Operating System) 中使用的,用于列出当前ROS系统中所有可用的 topic。
rostopic list
rostopic echo+(list中的名称)
这个命令是在 ROS (Robot Operating System) 中使用的,用于监听指定 topic 并显示其消息信息。
rostopic echo
rostopic hz+(list中的名称)
查看频率
rostopic hz