写在前面
需求:rviz中创建的机器人模型,通过运行脚本方式控制其运动。
ros版本 kinetic 、noetic 两个版本亲测都可以。
整体效果
思路
机器人描述文件xacro,通过joint(关节)来控制机器人连杆与连杆之间的运动,所以可以通过控制关节,发布关节相关话题,即可以实现机器人在rviz中运动。
实现
上述整体效果中机器人模型文件可见:xacro文件
#include "ros/ros.h"
#include "sensor_msgs/JointState.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);
joint_state_pub.name[0] = "left_trunk12left_joint1";
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同步运动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)