参考视频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
启动界面如下
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;
}
数了一下,每一个发布都是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的文件
可以看得输出日志,启动了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
就可以看到小机器人往前运动的画面
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。