【ros】学习笔记

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:数据字节序,用于指定该消息中的多字节数据所使用的字节序,常见的取值有01,表示小端字节序和大端字节序。

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值