ROS学习笔记

参考视频ROS快速入门教程

安装不说了,网上太多了

6:APT源----ROS应用商店

 官方网站ROS Index,实践证明得开魔法.

进去之后,点击上方的PACKAGE List,选择自己的ROS版本,对于不同的package,可以使用apt安装,也可以使用源码进行安装。

与视频对应的,我找到了2021年7月的rqt_robot_steering包

 ROS Package: rqt_robot_steering

sudo apt install ros-melodic-rqt-robot-steering
roscore       //另一个终端
rosrun rqt_robot_steering rqt_robot_steering

启动界面如下

图1

rosrun turtlesim turtlesim_node    //小乌龟调用
rostopic list

 修改图1最上面为/turtle1/cmd_vel

 这里有一个问题:使用apt安装的包位置在哪里?

rospack find rqt_robot_steering 
/opt/ros/melodic/share/rqt_robot_steering   //输出结果

7:Github寻找软件包

 这个与上边就有所不同了,需要建一个工作空间。

7.1:WPR系列机器人仿真工具
mkdir -p learn_ros/src
cd learn_ros/src
git clone https://github.com/6-robot/wpr_simulation.git
cd wpr_simulation/scripts
./install_for_melodic.sh   //脚本文件,安装依赖库

其中脚本文件打开如下

 回到工作空间目录下

catkin_make
echo  "source ~/learn_ros/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
roslaunch wpr_simulation wpb_simple.launch
rosrun rqt_robot_steering rqt_robot_steering

先把控制指令修改了/cmd_vel,调节前进后退等控制指令,竟然把书柜撞到了,笑死我了。

 7.2:小乌龟源码下载
cd learn_ros/src
git clone https://github.com/ros/ros_tutorials.git
cd learn_ros && catkin_make

 运行时有报错未解决。

collect2: error: ld returned 1 exit status
ros_tutorials/turtlesim/CMakeFiles/turtlesim_node.dir/build.make:209: recipe for target '/home/star/learn_ros/devel/lib/turtlesim/turtlesim_node' failed
make[2]: *** [/home/star/learn_ros/devel/lib/turtlesim/turtlesim_node] Error 1
CMakeFiles/Makefile2:3640: recipe for target 'ros_tutorials/turtlesim/CMakeFiles/turtlesim_node.dir/all' failed
make[1]: *** [ros_tutorials/turtlesim/CMakeFiles/turtlesim_node.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j8 -l8" failed

  9:超级终端

sudo apt install terminator

这个感觉用不太上,了解即可。知道有终端工具可以同时显示在桌面上。

10:节点node与包Package

可以把包理解为节点的容器

11:节点设置

进入learn_ros/src文件夹下

catkin_create_pkg ssr_pkg roscpp rospy std_msgs

比如说我想查看roscpp这个依赖项,通过查看对应的package.xml,可以发现后边三个依赖都是package。

roscd roscpp
ls
code package.xml

像roscpp这样的package所在文件位置的其他package,他们的来源有两个:安装ROS时自带的;另一个就是使用apt安装的。比如前边安装的turtlesim、rqt_robot_steering都在。

在ROS主函数中,while(1)不可以响应外部信号,while(ros::ok())可以被打断 

12:话题与消息

一般的消息格式都可以通过ros.org查到。比如std_msgs、PointCloud2等等

13:发布者C++实现

马超发布话题之后,可以使用命令来查看发布的内容.话题不能是中文

代码如下

#include<ros/ros.h>
#include<std_msgs/String.h>

int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"chao_node");

    ros::NodeHandle nh;
    ros::Publisher pub_chao = nh.advertise<std_msgs::String>("kaihei",5);

    while(ros::ok())
    {
        std_msgs::String msg;
        msg.data = "guoFuMachao";
        pub_chao.publish(msg);
    }
    return 0;
}
rostopic echo /kaihei      #查看内容
rostopic hz /kaihei        #查看发布频率

可以看到,发布频率并不统一。

在主循环加入控制频率之后就规律很多了

ros::Rate loop_rate(10);

loop_rate.sleep();

 再添加一个发布者yao_node

#include<ros/ros.h>
#include<std_msgs/String.h>

int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"yao_node");

    ros::NodeHandle nh;
    ros::Publisher pub_yao = nh.advertise<std_msgs::String>("daiwo",5);

    ros::Rate loop_rate(10);
    while(ros::ok())
    {
        std_msgs::String msg;
        msg.data = "thank you";
        pub_yao.publish(msg);
        loop_rate.sleep();
    }
    return 0;
}

 编译运行没问题之后,运行两个节点。

节点图

 使用rostopic echo查看发布内容如下

 这里主要是自己创建两个发布者,并发布话题。但是没有相应的订阅,只能通过终端命令来实现订阅。

这里我觉得可以改进一下:这里创建了两个node,也就是两个cpp文件来发布两个不同的话题。也可以使用一个node来发布两个话题。

14:订阅者 C++实现

catkin_create_pkg atr_pkg rospy roscpp std_msgs

ma_node.cpp文件如下

#include <ros/ros.h>
#include <std_msgs/String.h>

void chao_callback(std_msgs::String msg)
{
    printf(msg.data.c_str());
    printf("\n");
}
int main(int argc, char *argv[])
{
    ros::init(argc,argv,"ma_node");

    ros::NodeHandle nh;
    ros::Subscriber sub_ma = nh.subscribe("kaihei",5,chao_callback);

    while(ros::ok())
    {
        ros::spinOnce();
    }
    return 0;
}

然后修改CMakeLists文件

启动roscore、chao_node、ma_node,可以看到ma_node打印的订阅的信息。

节点关系图

 这里把printf换成ROS_INFO打印结果如下

 就是多了接受消息的时间。 

现在更改ma_node.cpp同时订阅yao_node发布的消息

#include <ros/ros.h>
#include <std_msgs/String.h>

void chao_callback(std_msgs::String msg)
{
    ROS_INFO(msg.data.c_str());
    //printf("\n");
}
void yao_callback(std_msgs::String msg)
{
    ROS_INFO(msg.data.c_str());
    //printf("\n");
}
int main(int argc, char *argv[])
{
    ros::init(argc,argv,"ma_node");

    ros::NodeHandle nh;
    ros::Subscriber sub_ma = nh.subscribe("kaihei",5,chao_callback);
    ros::Subscriber sub_ma1 = nh.subscribe("daiwo",5,yao_callback);
    while(ros::ok())
    {
        ros::spinOnce();
    }
    return 0;
}
运行节点图

 

ROS打印消息

 数了一下,每一个发布都是10hz的发布频率。

还有一个细节:就是即使chao和yao节点没有运行,只运行了ma这一个话题,通过rostopic list也是可以看到它所订阅的两个话题的。换句话讲,topic并不仅仅属于发布者。

小小的总结一下

发布者有两个参数:发布的话题名称、消息队列,发布者要有一个spin()函数要让程序别退出。

订阅者有三个参数:订阅的话题、消息队列、回调函数,订阅节点里要有一个spinOnce函数,用来处理订阅的信息。

15:launch启动文件

如果你亲自上手做了上述工作就会发现一个问题就是,你要打开的终端太多了。launch文件就可以通过一行命令启动多个节点。

launch文件使用XML语法,这个up用王者举例简直太棒了

<launch>

    <node pkg = "ssr_pkg" type = "yao_node" name = "yao_node"/>

    <node pkg = "ssr_pkg" type = "chao_node" name = "chao_node"/>

    <node pkg = "atr_pkg" type = "ma_node" name = "ma_node" output = "screen"/>


</launch>

这里编写完launch文件之后就可以启动launch文件了,不需要catkin_make。我的launch文件实在package atr_pkg内写的,所以启动launch文件命令如下

roslaunch atr_pkg kai_hei.launch

运行这条指令后他会自动去搜索这个package下名为kai_hei.launch的文件

启动launch文件

 可以看得输出日志,启动了3个节点和master,以及每个节点对应的pid

如果想单独查看某个节点的输出,可以在这个节点后边添加launch-prefix="gnome-terminal -e"

这个功能以后可能会用到。

18:机器人运动控制

geometry_msgs包含数据格式:加速度、位置、四元数,控制机器人主要使用Twist

 

 19:机器人运动控制C++实现

借助一个开源项目,WPR

roslaunch wpr_simulation wpb_simple.launch
rosrun wpr_simulation demo_vel_ctrl

就可以看到小机器人往前运动的画面

demo画面

 

节点关系图

 

catkin_create_pkg vel_pkg roscpp rospy geometry_msgs

vel_node.cpp代码如下

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"vel_node");

    ros::NodeHandle n;
    ros::Publisher pub_vel = n.advertise<geometry_msgs::Twist>("/cmd_vel",5);

    geometry_msgs::Twist vel_msg;
    vel_msg.linear.x = 0;
    vel_msg.linear.y = 0;
    vel_msg.linear.z = 0;
    vel_msg.angular.x = 0;
    vel_msg.angular.y = 0;
    vel_msg.angular.z = 0.8;
    ros::Rate loop_rate(10);
    while(ros::ok())
    {
        pub_vel.publish(vel_msg);
        loop_rate.sleep();
    }
    return 0;
}

实验现象就是小车原地转圈。

更多细节部分,当我停止vel_node这个节点的时候,小车会维持原动作不变,也就意味着小车会保留最后接收到的指令;添加X,Y线速度后也没问题;但是添加Z轴线速度就没反应,可能是物理引擎的影响。

针对第一个问题,可以通过终端重新发布topic来让小车静止

rostopic pub -1 /cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" 

22:使用RVIZ

gazebo是发布数据的,而rviz订阅这些数据用于可视化

比如在rviz添加Laserscan订阅的topic是/scan,这个话题恰好来自gazebo。

 左侧rviz展示的雷达点就是右侧gazebo的障碍物所扫描到的。

节点关系图

 可以看到涉及到的知识还是比较多的。

对于左侧rviz来说,添加了虚拟小车和雷达,可以保存这些设施为lidar.rviz,到时候打开就自动配置好了。

此外wpr_simulation也提供了添加有rviz的launch文件,这个可视化界面中包括激光雷达和摄像头采集到的数据。

roslaunch wpr_simulation wpb_rviz.launch

运行rostopic list可以查看gazebo发布的话题。

 23:激光雷达数据包格式

sensor_msgs消息格式如下,我面熟的有LaserScan、PointCloud、PointCloud2

更详细放在另一个专题了。 https://mp.csdn.net/mp_blog/creation/editor/131375770?not_checkout=1

24:获取雷达数据的C++节点程序

rosrun wpr_simulation demo_lidar_data
运行结果

 这里偷个懒,就不按照原作者那样建立一个包,再创建cpp了,因为wpr_simulation有这个cpp了,名字为demo_lidar_data.cpp。

试了一下demo_lidar_bahavior.cpp的效果是如果前方测距值小于1.5米,就左转再次前行。顺便结合代码理解了一下。

可以多试试这个项目其他cpp运行效果。

29:imu 的C++实现

sensor_msgs的imu的四元数转换成欧拉角需要使用tf。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值