Ros by example 学习中问题

本文介绍了在ROS环境中遇到的常见问题及其解决方案,包括RViz显示问题、Ubuntu软件源更新失败、ROS软件包安装问题以及访问Github的配置。接着,详细阐述了从Github克隆代码、建立工作空间、编译项目到启动ROS节点的过程。此外,还讲解了ROS节点创建、话题发布者与订阅者、激光雷达数据处理以及基于激光雷达的避障算法。最后提到了IMU传感器数据解析和结合速度控制的应用。
摘要由CSDN通过智能技术生成

一、出现的问题

 问题一  运行RViz显示:Vmware:vmw_ioctl command error

解决方法:

1. 先运行roscore 和 rosrun rviz rviz检查RViz是否正常

2.添加如下语句

echo "export SVGA_VGPU10=0" >> ~/.bashrc

或者

echo "export LIBGL_ALWAYS_SOFTWARE=1" >> ~/.bashrc

问题二 Ubuntu 终端运行 sudo apt-get update 时 出现无法下载 http://ppa.launchpad.net/fcitx-team/nightly/ubuntu/dists/xenial/main/binary-amd64/Packages  404  Not Found

 解决方法:

1.切换到对应的ppa目录

cd /etc/apt/sources.list.d
2.在该目录下ls,即可以看到对应的无法下载的fcitx-team-ubuntu-nightly-xenial.list

 3. 删除.list文件,安全起见,可以进行添加后缀.bak的备份

sudo mv fcitx-team-ubuntu-nightly-xenial.list fcitx-team-ubuntu-nightly-xenial.list.bak

4.重新更新

sudo apt-get update

问题三 无法定位软件包问题 ros-melodic

//1. 添加源
sudo vim /etc/apt/sources.list.d/ros-latest.list
//2.添加如下内容
deb https://mirrors.ustc.edu.cn/ros/ubuntu/ bionic main
//3.进行更新
sudo apt-get update
//4. 重新安装软件包
 sudo apt-get install ros-melodic-navigation

问题四 无法访问Github

git config --global url."https://".insteadOf git://
sudo apt-get update

二、实际操作

内容一  从Github上下载代码

1.创建工作空间

mkdir catkin_ws
cd catkin_ws
mikdir src
cd src  // src为source缩写,用来放置源代码
//先确认linux已下载git工具
sudo apt install git

2.下载源代码(将htps:改为git:)

git clone git://github.com/6-robot/wpr_simulation.git

3.配置依赖包脚本文件(在sripts中)

 

 4.编译工作区

cd ~/catkin_ws/ //返回工作区文件夹
catkin_make      //编译文件

 5.载入工作空间环境变量(否则会报错找不到软件包)

source ~/catkin_ws/devel/setup.bash

6.启动源代码

roslaunch wpr_simulaton wpb_simple.launch

7.工作空间环境变量添加进终端初始化脚本(.bashrc)

gedit ~/.bashrc

 内容2 超级终端使用

 内容3 ros节点的建立

catkin_create_pkg ssr_pkg rospy roscpp std_msgs //其中rospy roscpp std_msgs为通用包

语句序号分别为133 149

 内容4 话题发布者与订阅者

发布者

#include<ros/ros.h>
#include<std_msgs/String.h> //引用消息标准类型

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"chao_node");
    printf("Hello World!\n");

    ros::NodeHandle nh; //大管家
    ros::Publisher pub = nh.advertise<std_msgs::String>("kuai_shang_che", 10); //“kuai_shang_che"为主题名, 10为缓存长度

ros::Rate loop_rate(10);//设置循环次数
    while(ros::ok())
    {
          printf("我要刷屏了\n");
    std_msgs::String msg;  //生成消息包
    msg.data= "带飞";  //从index可看string类型为data
    pub.publish(msg); //发布消息
    loop_rate.sleep();
    }

    return 0;
}

订阅者

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

void chao_callback(std_msgs::String msg)  //回调函数
{
   ROS_INFO( msg.data.c_str( ) ); //确定打印的为string类型
    printf("\n");
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, ""); //显示中文
    ros::init(argc,argv,"ma_node");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("kuai_shang_che",10, chao_callback); //确定订阅的话题,存储长度,回调函数

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

 

 

 内容5 使用roslaunch

内容五 机器人运动控制

 速度:m/s

旋转:rad/s

内容六 激光雷达

包:sensor_msgs

显示话题中的消息类型:

rostopic echo /scan --noarr

创建激光雷达包(需要引入sensor_msgs的支持包)

robot@wp:~/ros_example/src$ catkin_create_pkg lidar_pkg roscpp rospy sensor_msgs

#include<ros/ros.h>
#include<sensor_msgs/LaserScan.h>

void LidarCallback(const sensor_msgs::LaserScan msg)
{
    float fMidDist = msg.ranges[180]; //显示正前方的数
    ROS_INFO("前方测距 ranges[180] = %f 米", fMidDist);
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,""); //设置为中文
    ros::init(argc, argv, "lidar_node");

    ros::NodeHandle n;
    ros::Subscriber lidar_sub = n.subscribe("/scan", 10, &LidarCallback);

    ros::spin( ); //保持运行别退出

    return 0;
}

内容七 激光雷达避障

#include<ros/ros.h>
#include<sensor_msgs/LaserScan.h> //雷达消息格式头文件
#include <geometry_msgs/Twist.h> //速度消息格式头文件

ros::Publisher vel_pub;
void LidarCallback(const sensor_msgs::LaserScan msg)
{
    float fMidDist = msg.ranges[180]; //显示正前方的数
    ROS_INFO("前方测距 ranges[180] = %f 米", fMidDist);

    geometry_msgs::Twist vel_cmd;
    if(fMidDist < 1.5)
    {
        vel_cmd.angular.z = 0.3; //左传

    }
    else
    {
        vel_cmd.linear.x = 0.05;
    }
    vel_pub.publish(vel_cmd);
}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,""); //设置为中文
    ros::init(argc, argv, "lidar_node");

    ros::NodeHandle n;
    ros::Subscriber lidar_sub = n.subscribe("/scan", 10, &LidarCallback);
    vel_pub=n.advertise<geometry_msgs::Twist>("/cmd_vel", 10);

    ros::spin( ); //保持运行别退出

    return 0;
}

 内容八 IMU传感器

其中orientation为内部解算得到的姿态,是一个四元数

官方话题定义:

 

#include<ros/ros.h>
#include<sensor_msgs/Imu.h>
#include<tf/tf.h>

void IMUCallBack(sensor_msgs::Imu msg)
{
    if(msg.orientation_covariance[0]< 0) //检查数据是否存在
        return;
    tf::Quaternion quaternion(  //将消息包内的四元数转化为四元数对象
        msg.orientation.x,
        msg.orientation.y,
        msg.orientation.z,
        msg.orientation.w
    );

    double roll, pitch, yaw;
    tf::Matrix3x3(quaternion).getRPY(roll,pitch,yaw); //转化成欧拉角(弧度制)
    roll=roll*180/M_PI;  //弧度制转化为角度制
    pitch=pitch*180/M_PI;
    yaw= yaw*180/M_PI;

    ROS_INFO("滚转= %.0f 俯仰 =%.0f 朝向= %.0f",roll, pitch, yaw);




}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc, argv, "imu_node");

    ros::NodeHandle n;
    ros::Subscriber imu_sub=n.subscribe("/imu/data", 10, IMUCallBack);
    ros::spin( );
    return 0;
}

内容八 IMU传感器与速度联合

#include<ros/ros.h>
#include<sensor_msgs/Imu.h>
#include<tf/tf.h>
#include <geometry_msgs/Twist.h>

ros::Publisher vel_pub;

void IMUCallBack(sensor_msgs::Imu msg)
{
    if(msg.orientation_covariance[0]< 0) //检查数据是否存在
        return;
    tf::Quaternion quaternion(  //将消息包内的四元数转化为四元数对象
        msg.orientation.x,
        msg.orientation.y,
        msg.orientation.z,
        msg.orientation.w
    );

    double roll, pitch, yaw;
    tf::Matrix3x3(quaternion).getRPY(roll,pitch,yaw); //转化成欧拉角(弧度制)
    roll=roll*180/M_PI;  //弧度制转化为角度制
    pitch=pitch*180/M_PI;
    yaw= yaw*180/M_PI;

    ROS_INFO("滚转= %.0f 俯仰 =%.0f 朝向= %.0f",roll, pitch, yaw);

    double target_yaw = 90;
    double diff_angle = target_yaw - yaw;
    geometry_msgs::Twist vel_cmd;
    vel_cmd.angular.z = diff_angle*0.01;
    vel_cmd.linear.x=0.1;
    vel_pub.publish(vel_cmd);



}
int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc, argv, "imu_node");

    ros::NodeHandle n;
    ros::Subscriber imu_sub=n.subscribe("/imu/data", 10, IMUCallBack);
    vel_pub = n.advertise<geometry_msgs::Twist>("/cmd_vel",10);

    ros::spin( );
    return 0;
}

 内容九 消息包

标准消息包

数组类型中数组长度可变

 常用消息包

 带有stamped的是数据中含有Header

 

 自定义消息包

 catkin_create_pkg qq_msgs roscpp rospy std_msgs message_generation message_runtime

更改CMake.list 文件(52行   72行 106行)

改为

add_message_files(
  FILES
  Carry.msg //自己创建的msg文件
)


//72行
## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
)

//106行
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES qq_msgs
 CATKIN_DEPENDS message_generation message_runtime roscpp rospy std_msgs
#  DEPENDS system_lib
)

进入package.xml文件,补全<buildtool_depend> 与<exec_depend>,使其均含有message_runtime和message_generation

操作完成后如下图所示

<buildtool_depend>catkin</buildtool_depend>
  <build_depend>message_generation</build_depend>
    <build_depend>message_runtime</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>message_runtime</exec_depend>
  <exec_depend>message_generation</exec_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>

验证

robot@wp:~$ rosmsg show qq_msgs/Carry

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhy_6668

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值