O firmware para controlo de braços robóticos com ROS não é especifico para o moveit.
O controlo é relativamente fácil e envolve dois nodes, e dois tópicos.
Um node ROS localizado num computador, subscreve o tópico /joint_states, com mensagens do tipo sensor_msgs/JointState, e depois de converter cada uma das mensagens (no tipo de dados adequado) publica mensagens no tópico subscrito pelo node rosserial a ser executado como firmware no micro- controlador responsável pelo controlo directo dos motores do braço.
O tipo de dados necessário para conduzir os motores pode variar conforme os motores usados, (servos ou steppers) mas regra geral será um array de inteiros com a posição em graus que cada um dos motores do braço robótico deve ter a cada momento.
Exemplos do firmware usado num microcontrolador adequado ao ros moveit, ou de forma genérica a outro processo de controlo de braços robóticos pode ser encontrado no seguinte repositório:
https://github.com/inaciose/ntbd_firmware
Exemplo de node ROS em python que subscreve um tópico Float64 e publica mensagens no topico /joint_states.
import rospy from sensor_msgs.msg import JointState from std_msgs.msg import Float64 class CommandToJointState: def __init__(self): self.joint_name = rospy.get_param("~joint_name") self.joint_state = JointState() self.joint_state.name.append(self.joint_name) self.joint_state.position.append(0.0) self.joint_state.velocity.append(0.0) self.joint_pub = rospy.Publisher("joint_states", JointState, queue_size=1) self.command_sub = rospy.Subscriber("command", Float64, self.command_callback, queue_size=1) def command_callback(self, msg): self.joint_state.position[0] = msg.data self.joint_state.header.stamp = rospy.Time.now() self.joint_pub.publish(self.joint_state) if __name__ == '__main__': rospy.init_node('command_to_joint_state') command_to_joint_state = CommandToJointState() rospy.spin()
fonte:
https://answers.ros.org/question/276405/how-to-write-my-own-joint-state/