ROS学习笔记(十六):Using urdf with robot_state_publisher

本教程提供了使用URDF的机器人模型的完整示例,该模型使用robot_state_publisher。 首先,我们创建包含所有必要部分的URDF模型。 然后,我们编写一个节点,该节点发布JointState并进行转换。 最后,我们一起运行所有部分。

1.Create the URDF File

Here is the URDF file for a 7-link model roughly approximating R2-D2. Save the following link to your computer: model.xml

2.Publishing the State

现在,我们需要一种方法来指定机器人所处的状态。为此,我们必须指定所有三个关节和整个里程表。 首先创建一个包:

cd %TOP_DIR_YOUR_CATKIN_WS%/src
catkin_create_pkg r2d2 roscpp rospy tf sensor_msgs std_msgs

然后启动您喜欢的编辑器,并将以下代码粘贴到src / state_publisher.cpp文件中:

   1 #include <string>
   2 #include <ros/ros.h>
   3 #include <sensor_msgs/JointState.h>
   4 #include <tf/transform_broadcaster.h>
   5 
   6 int main(int argc, char** argv) {
   7     ros::init(argc, argv, "state_publisher");
   8     ros::NodeHandle n;
   9     ros::Publisher joint_pub = n.advertise<sensor_msgs::JointState>("joint_states", 1);
  10     tf::TransformBroadcaster broadcaster;
  11     ros::Rate loop_rate(30);
  12 
  13     const double degree = M_PI/180;
  14 
  15     // robot state
  16     double tilt = 0, tinc = degree, swivel=0, angle=0, height=0, hinc=0.005;
  17 
  18     // message declarations
  19     geometry_msgs::TransformStamped odom_trans;
  20     sensor_msgs::JointState joint_state;
  21     odom_trans.header.frame_id = "odom";
  22     odom_trans.child_frame_id = "axis";
  23 
  24     while (ros::ok()) {
  25         //update joint_state
  26         joint_state.header.stamp = ros::Time::now();
  27         joint_state.name.resize(3);
  28         joint_state.position.resize(3);
  29         joint_state.name[0] ="swivel";
  30         joint_state.position[0] = swivel;
  31         joint_state.name[1] ="tilt";
  32         joint_state.position[1] = tilt;
  33         joint_state.name[2] ="periscope";
  34         joint_state.position[2] = height;
  35 
  36 
  37         // update transform
  38         // (moving in a circle with radius=2)
  39         odom_trans.header.stamp = ros::Time::now();
  40         odom_trans.transform.translation.x = cos(angle)*2;
  41         odom_trans.transform.translation.y = sin(angle)*2;
  42         odom_trans.transform.translation.z = .7;
  43         odom_trans.transform.rotation = tf::createQuaternionMsgFromYaw(angle+M_PI/2);
  44 
  45         //send the joint state and transform
  46         joint_pub.publish(joint_state);
  47         broadcaster.sendTransform(odom_trans);
  48 
  49         // Create new robot state
  50         tilt += tinc;
  51         if (tilt<-.5 || tilt>0) tinc *= -1;
  52         height += hinc;
  53         if (height>.2 || height<0) hinc *= -1;
  54         swivel += degree;
  55         angle += degree/4;
  56 
  57         // This will adjust as needed per iteration
  58         loop_rate.sleep();
  59     }
  60 
  61 
  62     return 0;
  63 }

3.Launch File

该启动文件假定您正在使用程序包名称“ r2d2”和节点名称“ state_publisher”,并且已将此urdf保存到“ r2d2”程序包中。

切换行号显示

   1 <launch>
   2         <param name="robot_description" command="cat $(find r2d2)/model.xml" />
   3         <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
   4         <node name="state_publisher" pkg="r2d2" type="state_publisher" />
   5 </launch>

4.Viewing the Results

首先,我们必须在保存上述源代码的程序包中编辑CMakeLists.txt。 确保除了其他依赖项之外还添加tf依赖项:

find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs tf)

注意,roscpp用于解析我们编写的代码并生成state_publisher节点。 我们还必须在CMakelists.txt的末尾添加以下内容,以生成state_publisher节点:

include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(state_publisher src/state_publisher.cpp)
target_link_libraries(state_publisher ${catkin_LIBRARIES})

现在,我们应该转到工作空间的目录并使用以下命令进行构建:

$ catkin_make

现在启动该软件包(假设我们的启动文件名为display.launch):

$ roslaunch r2d2 display.launch

使用以下命令在新终端中运行rviz:

$ rosrun rviz rviz

选择odom作为您的固定框架(在“全局选项”下)。 然后选择“添加显示”并添加机器人模型显示和TF显示(请参见http://wiki.ros.org/rviz/UserGuide)。
接着会显示:

[ INFO] [1593491745.493525939]: rviz version 1.13.12
[ INFO] [1593491745.493636863]: compiled against Qt version 5.9.5
[ INFO] [1593491745.493672751]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1593491745.505394669]: Forcing OpenGl version 0.
[ INFO] [1593491746.428393136]: Stereo is NOT SUPPORTED
[ INFO] [1593491746.428455243]: OpenGl version: 3 (GLSL 1.3).





在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误提示是因为在启动ROS节点时,找不到名为robot_state_publisher的节点。可能是因为没有安装或编译robot_state_publisher包,或者没有正确设置ROS_PACKAGE_PATH环境变量。需要检查一下这些问题,然后重新启动节点。 ### 回答2: 错误提示信息“error: cannot launch node of type [robot_state_publisher/robot_state_publisher]: robot_state_publisher”是一个ROS运行节点的错误提示。在ROS中,节点是一种独立的进程,它可以读写ROS中的话题、服务和参数。在启动节点时,需要在命令行中输入相应的命令,以启动对应的节点。 首先,该错误是由于系统找不到所需启动的节点。这可能是因为节点包没有正确安装,或者路径设置不正确。因此,下面讨论几种可能的解决方案: 1. 确认robot_state_publisher包已经正确安装:在终端中输入“dpkg -l | grep robot_state_publisher”,如果返回信息中包含robot_state_publisher,说明该包已安装。如果没有安装,则需要重新安装robot_state_publisher包。 2. 确认环境变量设置正确:一些ROS节点依赖于环境变量,例如ROS_PACKAGE_PATH等。 如果这些变量未正确设置,则会导致节点无法启动。 可以在~/.bashrc文件中设置环境变量,在终端中输入“source ~/.bashrc”启动即可。 3. 确认启动命令正确:在终端输入“roslaunch robot_state_publisher robot_state_publisher.launch”,如果包路径和启动命令正确,则应该能够正确启动节点。 总之,以上三种方法可能有助于解决“error: cannot launch node of type [robot_state_publisher/robot_state_publisher]: robot_state_publisher”错误。需要注意的是,如果出现其他错误,请及时查找相关资料或咨询相关专家。毕竟ROS是一个庞大、复杂的系统,需要不断学习和探索。 ### 回答3: 在ROS系统中,当我们运行一个包含ROS节点的程序时,有时会遇到类似于“error: cannot launch node of type [robot_state_publisher/robot_state_publisher]: robot_state_publisher”这样的错误信息。这类错误通常提示我们节点类型不匹配或节点程序没有正确安装。 针对这种情况,我们需要逐一排查错误的原因,以下是可能导致这种错误的几种情况: 1.节点程序未安装:首先我们检查该节点程序是否已被正确安装。如果未安装,我们需要使用命令行进行安装,“sudo apt-get install ros-<distro>-<package-name>”命令可用于安装ROS的包裹。 2.节点类型不匹配:该错误信息中指定了节点类型是[robot_state_publisher/robot_state_publisher],如果我们在运行节点程序时指定的节点类型与此不匹配,就会产生此错误。因此我们需要检查程序包中节点的类型是否与提示的类型一致。 3.程序包命名错误:ROS不允许程序包名称中存在下划线“_”,而是使用连字符“-”来代替。如果程序包路径中包含下划线,则ROS无法正确识别程序包,从而无法启动节点,因此需要修改程序包名称中的“_”。 4.缺失依赖包:在ROS系统中的每一个程序包都会有其依赖的程序包,如果缺失了依赖包,该程序包将无法运行。此时我们需要使用命令行来查看节点的依赖关系,“rospack depends <package-name>”命令可以用于查看程序包的依赖,如果缺少依赖包,则需要手动安装。 5.工作目录设置错误:在ROS系统中,我们需要设置工作目录(即ROS的工作空间),否则节点可能无法正常运行。在执行程序前,我们需要先激活ROS的工作目录,使用命令“source <path-to-workspace>/devel/setup.bash”来激活工作目录。 总之,在解决“error: cannot launch node of type [robot_state_publisher/robot_state_publisher]: robot_state_publisher”这样的错误时,我们需要查找错误的具体原因,逐一解决问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值