ROS学习笔记(3)——通过脚本控制rviz中创建的机器人运动

写在前面

需求:rviz中创建的机器人模型,通过运行脚本方式控制其运动。

ros版本 kinetic 、noetic 两个版本亲测都可以。

整体效果

请添加图片描述

思路

机器人描述文件xacro,通过joint(关节)来控制机器人连杆与连杆之间的运动,所以可以通过控制关节,发布关节相关话题,即可以实现机器人在rviz中运动。

实现

上述整体效果中机器人模型文件可见:xacro文件

#include "ros/ros.h"
#include "sensor_msgs/JointState.h"
// #include "std_msgs/Header.h"
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"state_pub");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<sensor_msgs::JointState>("joint_states",1000);
    sensor_msgs::JointState joint_state_pub;
    ros::Rate rate(100);
    while (ros::ok())
    {
        
        for (double i = -314; i <= 314 ; i++)
        {   
            joint_state_pub.header.stamp = ros::Time::now();
            joint_state_pub.header.frame_id = "robot01";

            joint_state_pub.name.resize(6);
            joint_state_pub.position.resize(6);
            //不知道为什么这种方式不可以
		    // jonit_state_pub.name = {    "left_trunk12left_joint1", 
		    //                             "left_trunk22left_joint2", 
		    //                             "left_joint32left_foot1", 
		    //                             "right_trunk12right_joint1",
		    //                             "right_trunk22right_joint2",
		    //                             "right_joint32right_foot1"      };
		 
            joint_state_pub.name[0] = "left_trunk12left_joint1";// name是xacro文件中定义的关节(joint)
            joint_state_pub.position[0] = ( i / 100 );	//控制运动
            joint_state_pub.name[1] = "left_trunk22left_joint2";
            joint_state_pub.position[1] = ( i /100 );
            joint_state_pub.name[2] = "left_joint32left_foot1";
            joint_state_pub.position[2] = 0;
            joint_state_pub.name[3] = "right_trunk12right_joint1";
            joint_state_pub.position[3] = 0;
            joint_state_pub.name[4] = "right_trunk22right_joint2";
            joint_state_pub.position[4] = 0;
            joint_state_pub.name[5] = "right_joint32right_foot1";
            joint_state_pub.position[5] = 0;

            pub.publish(joint_state_pub);
            ROS_INFO(" i = %.2f",i/100);
            rate.sleep(); 
        }
        ros::spinOnce();   
    }
    return 0;
}

注意

这里不能之修改某一个或某几个joint_state_pub.position[x],每次发布后需要重新填充msg文件中的每一个变量。

扩展

实物中,通过串口传输数据关节数据,ros截获串口数据进行打包,并发送关节数据,方针运动关节通过订阅串口发送的关节数据,可以实现实物与rviz同步运动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值